Browse Source
next version of PSS2
next version of PSS2
which was reviewed and rewritten on branch `PSS-2-try-to-rebase+4' by Stefano Perticaroli and Francesco Lannuttipre-master-46
committed by
rlar
25 changed files with 2186 additions and 2 deletions
-
13configure.ac
-
22examples/pss/colpitt_osc_pss.cir
-
35examples/pss/compl_cross_quad_osc_pss.cir
-
21examples/pss/hartley_osc_pss.cir
-
29examples/pss/ring_osc_pss.cir
-
21examples/pss/vackar_osc_pss.cir
-
17examples/pss/vdp_osc_pss.cir
-
16src/frontend/commands.c
-
6src/frontend/outitf.c
-
11src/frontend/runcoms.c
-
3src/frontend/runcoms.h
-
47src/frontend/shyu.c
-
10src/frontend/spiceif.c
-
3src/frontend/typesdef.c
-
1src/include/ngspice/Makefile.am
-
23src/include/ngspice/cktdefs.h
-
40src/include/ngspice/pssdefs.h
-
9src/spicelib/analysis/Makefile.am
-
7src/spicelib/analysis/analysis.c
-
1607src/spicelib/analysis/dcpss.c
-
54src/spicelib/analysis/pssaskq.c
-
32src/spicelib/analysis/pssinit.c
-
83src/spicelib/analysis/psssetp.c
-
74src/spicelib/parser/inp2dot.c
-
4visualc/vngspice.vcproj
@ -0,0 +1,22 @@ |
|||||
|
Colpitt's Oscillator Circuit |
||||
|
* Colpitt is an harmonic oscillator (LC based) which use |
||||
|
* a capacitive partition of resonator to feed the single |
||||
|
* active device. |
||||
|
* Predicted frequency is about 3.30435e+06 Hz. |
||||
|
|
||||
|
* Models: |
||||
|
.model qnl npn(level=1 bf=80 rb=100 ccs=2pf tf=0.3ns tr=6ns cje=3pf cjc=2pf va=50) |
||||
|
|
||||
|
r1 1 0 1 |
||||
|
q1 2 1 3 qnl |
||||
|
vcc 4 0 5 |
||||
|
rl 4 2 750 |
||||
|
c1 2 3 500p |
||||
|
c2 4 3 4500p |
||||
|
l1 4 2 5uH |
||||
|
re 3 6 4.65k |
||||
|
vee 6 0 dc -10 pwl 0 0 1e-9 -10 |
||||
|
|
||||
|
*.tran 30n 12u |
||||
|
.pss 3.1e6 500e-6 3 256 10 50 5e-3 |
||||
|
|
||||
@ -0,0 +1,35 @@ |
|||||
|
Complimentary Cross Quad CMOS Oscillator |
||||
|
* Predicted frequency is 5.61224e+08 Hz. |
||||
|
* |
||||
|
* PLOT i1 |
||||
|
|
||||
|
* Supply |
||||
|
vdd vdd gnd 1.2 pwl 0 1.2 1e-9 1.2 |
||||
|
rdd vdd vdd_ana 70m |
||||
|
rgnd gnd gnd_ana 70m |
||||
|
|
||||
|
* Cross quad |
||||
|
mpsx v_plus v_minus vdd_ana vdd_ana pch w=10u l=0.1u |
||||
|
mnsx v_plus v_minus gnd_ana gnd_ana nch w=10u l=0.1u |
||||
|
mpdx v_minus v_plus vdd_ana vdd_ana pch w=10u l=0.1u |
||||
|
mndx v_minus v_plus gnd_ana gnd_ana nch w=10u l=0.1u |
||||
|
|
||||
|
* Lumped elements model of real inductor |
||||
|
ls v_plus i1 19.462n ic=0.06 |
||||
|
rs i1 v_minus 7.789 |
||||
|
cs v_plus v_minus 443f |
||||
|
coxs v_plus is 2.178p |
||||
|
coxd v_minus id 2.178p |
||||
|
rsis is gnd_ana 308 |
||||
|
rsid id gnd_ana 308 |
||||
|
csis is gnd_ana 51f |
||||
|
csid id gnd_ana 51f |
||||
|
|
||||
|
* Parallel capacitor to determine leading resonance |
||||
|
cp v_plus v_minus 3.4p |
||||
|
|
||||
|
.model nch nmos ( version=4.4 level=54 lmin=0.1u lmax=20u wmin=0.1u wmax=10u ) |
||||
|
.model pch pmos ( version=4.4 level=54 lmin=0.1u lmax=20u wmin=0.1u wmax=10u ) |
||||
|
|
||||
|
*.tran 0.05n 1u uic |
||||
|
.pss 500e6 1u 1 1024 10 10 5e-3 uic |
||||
@ -0,0 +1,21 @@ |
|||||
|
Hartley's Oscillator Circuit |
||||
|
* Hartley is an harmonic oscillator (LC based) which use |
||||
|
* an inductive partition of resonator to feed the single |
||||
|
* active device. Output is taken on node 2. |
||||
|
* Prediceted frequency is about 121.176 Hz. |
||||
|
* |
||||
|
* PLOT V(3) |
||||
|
|
||||
|
* Models: |
||||
|
.model qnl npn(level=1 bf=80 rb=100 ccs=2pf tf=0.3ns tr=6ns cje=3pf cjc=2pf va=50) |
||||
|
|
||||
|
vcc 1 0 5 pwl 0 0 1e-5 5 |
||||
|
r1 1 2 0.2k |
||||
|
q1 2 3 0 qnl |
||||
|
c1 3 4 633n |
||||
|
l1 3 0 1.5 |
||||
|
l2 0 4 500m |
||||
|
r2 4 2 100 |
||||
|
|
||||
|
*.tran 300n 50m |
||||
|
.pss 50 200e-3 2 1024 11 10 5e-3 uic |
||||
@ -0,0 +1,29 @@ |
|||||
|
Ring CMOS Oscillator |
||||
|
* Oscillation is taken on node "bout". |
||||
|
* Predicted frequency is 3.8e+09 Hz. |
||||
|
* |
||||
|
* PLOT bout |
||||
|
|
||||
|
* Supply |
||||
|
vdd vdd gnd 1.2 pwl 0 1.2 1e-9 1.2 |
||||
|
rdd vdd vdd_ana 70m |
||||
|
rgnd gnd gnd_ana 70m |
||||
|
|
||||
|
* Inverter |
||||
|
mp1 inv1 inv3 vdd_ana vdd_ana pch w=10u l=0.18u |
||||
|
mn1 inv1 inv3 gnd_ana gnd_ana nch w=10u l=0.18u |
||||
|
mp2 inv2 inv1 vdd_ana vdd_ana pch w=10u l=0.18u |
||||
|
mn2 inv2 inv1 gnd_ana gnd_ana nch w=10u l=0.18u |
||||
|
mp3 inv3 inv2 vdd_ana vdd_ana pch w=10u l=0.18u |
||||
|
mn3 inv3 inv2 gnd_ana gnd_ana nch w=10u l=0.18u |
||||
|
|
||||
|
* Buffer out |
||||
|
mp4 bout inv3 vdd_ana vdd_ana pch w=10u l=0.18u |
||||
|
mn4 bout inv3 gnd_ana gnd_ana nch w=10u l=0.18u |
||||
|
|
||||
|
.model nch nmos ( version=4.4 level=54 lmin=0.1u lmax=20u wmin=0.1u wmax=10u ) |
||||
|
.model pch pmos ( version=4.4 level=54 lmin=0.1u lmax=20u wmin=0.1u wmax=10u ) |
||||
|
|
||||
|
*.tran 0.005n 100n |
||||
|
*.plot tran v(4) |
||||
|
.pss 624e6 500n 1 1024 10 5 5e-3 uic |
||||
@ -0,0 +1,21 @@ |
|||||
|
Vackar's Oscillator Circuit |
||||
|
* Vackar is a derivation of Colpitt's oscillator (LC based). |
||||
|
* Oscillation is taken on node 4. |
||||
|
* Predicted frequency is 1.91803e+06Hz. |
||||
|
|
||||
|
* Models: |
||||
|
.model qnl npn(level=1 bf=80 rb=100 ccs=2pf tf=0.3ns tr=6ns cje=3pf cjc=2pf va=50) |
||||
|
|
||||
|
vcc 1 0 5 pwl 0 10 1e-9 5 |
||||
|
lrfc 1 2 100u |
||||
|
cdec 2 0 7n |
||||
|
q1 3 2 0 qnl |
||||
|
rb 3 0 4700 |
||||
|
c1 3 4 100p |
||||
|
c2 3 0 600p |
||||
|
c0 4 0 1n |
||||
|
l1 4 1 6.2u |
||||
|
|
||||
|
*.tran 30n 12u |
||||
|
*.plot tran v(4) |
||||
|
.pss 1e6 10e-6 4 1024 10 50 5e-3 uic |
||||
@ -0,0 +1,17 @@ |
|||||
|
Van Der Pol Oscillator |
||||
|
* Prediceted frequency is about 4.54167e+06 Hz. |
||||
|
|
||||
|
* Third harmonic is high as the first one |
||||
|
Ba gib 0 I=-1e-2*v(gib,0)+1e-2*v(gib,0)^3 |
||||
|
* Q is about 10 |
||||
|
La gib 0 1.2e-6 |
||||
|
Ra gib 0 158.113 |
||||
|
Ca gib 0 1e-9 ic=0.5 |
||||
|
*La gib 0 1e-9 |
||||
|
*Ra gib 0 474.6 |
||||
|
*Ca gib 0 1e-9 ic=0.5 |
||||
|
* Ghost node... Test for my PSS! |
||||
|
Rb bad 0 1k |
||||
|
|
||||
|
*.tran 1e-9 150e-6 uic |
||||
|
.pss 0.8e6 130e-6 1 50 10 50 5e-3 uic |
||||
@ -0,0 +1,40 @@ |
|||||
|
/********** |
||||
|
Author: 2010-05 Stefano Perticaroli ``spertica'' |
||||
|
Review: 2012-10 Francesco Lannutti |
||||
|
**********/ |
||||
|
|
||||
|
#ifndef PSS_H |
||||
|
#define PSS_H |
||||
|
|
||||
|
#include "ngspice/jobdefs.h" |
||||
|
#include "ngspice/tskdefs.h" |
||||
|
/* |
||||
|
* PSSdefs.h - defs for pss analyses |
||||
|
*/ |
||||
|
|
||||
|
typedef struct { |
||||
|
int JOBtype; |
||||
|
JOB *JOBnextJob; |
||||
|
char *JOBname; |
||||
|
double PSSguessedFreq; |
||||
|
CKTnode *PSSoscNode; |
||||
|
double PSSstabTime; |
||||
|
long PSSmode; |
||||
|
long int PSSpoints; |
||||
|
int PSSharms; |
||||
|
runDesc *PSSplot_td; |
||||
|
runDesc *PSSplot_fd; |
||||
|
int sc_iter; |
||||
|
double steady_coeff; |
||||
|
} PSSan; |
||||
|
|
||||
|
#define GUESSED_FREQ 1 |
||||
|
#define STAB_TIME 2 |
||||
|
#define OSC_NODE 3 |
||||
|
#define PSS_POINTS 4 |
||||
|
#define PSS_HARMS 5 |
||||
|
#define PSS_UIC 6 |
||||
|
#define SC_ITER 7 |
||||
|
#define STEADY_COEFF 8 |
||||
|
|
||||
|
#endif |
||||
1607
src/spicelib/analysis/dcpss.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,54 @@ |
|||||
|
/********** |
||||
|
Author: 2010-05 Stefano Perticaroli ``spertica'' |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice/ngspice.h" |
||||
|
#include "ngspice/ifsim.h" |
||||
|
#include "ngspice/iferrmsg.h" |
||||
|
#include "ngspice/cktdefs.h" |
||||
|
#include "ngspice/pssdefs.h" |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
PSSaskQuest(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) |
||||
|
{ |
||||
|
PSSan *job = (PSSan *) anal; |
||||
|
|
||||
|
NG_IGNORE(ckt); |
||||
|
|
||||
|
switch(which) { |
||||
|
|
||||
|
case GUESSED_FREQ: |
||||
|
value->rValue = job->PSSguessedFreq; |
||||
|
break; |
||||
|
case OSC_NODE: |
||||
|
value->nValue = job->PSSoscNode; |
||||
|
break; |
||||
|
case STAB_TIME: |
||||
|
value->rValue = job->PSSstabTime; |
||||
|
break; |
||||
|
case PSS_UIC: |
||||
|
if (job->PSSmode & MODEUIC) { |
||||
|
value->iValue = 1; |
||||
|
} else { |
||||
|
value->iValue = 0; |
||||
|
} |
||||
|
break; |
||||
|
case PSS_POINTS: |
||||
|
value->iValue = (int)job->PSSpoints; |
||||
|
break; |
||||
|
case PSS_HARMS: |
||||
|
value->iValue = job->PSSharms; |
||||
|
break; |
||||
|
case SC_ITER: |
||||
|
value->iValue = job->sc_iter; |
||||
|
break; |
||||
|
case STEADY_COEFF: |
||||
|
value->rValue = job->steady_coeff; |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
/********** |
||||
|
Author: 2010-05 Stefano Perticaroli ``spertica'' |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice/ngspice.h" |
||||
|
#include "ngspice/cktdefs.h" |
||||
|
#include "ngspice/trandefs.h" |
||||
|
#include "ngspice/pssdefs.h" |
||||
|
#include "ngspice/iferrmsg.h" |
||||
|
|
||||
|
int PSSinit(CKTcircuit *ckt, JOB *anal) |
||||
|
{ |
||||
|
PSSan *job = (PSSan *) anal; |
||||
|
|
||||
|
/* Step is chosen empirically to be 1% of PSSguessedFreq */ |
||||
|
ckt->CKTstep = 0.01 * (1/job->PSSguessedFreq); |
||||
|
/* Init time should be always zero */ |
||||
|
ckt->CKTinitTime = 0; |
||||
|
/* MaxStep should not exceed Nyquist criterion */ |
||||
|
ckt->CKTmaxStep = 0.5*(1/job->PSSguessedFreq); |
||||
|
ckt->CKTdelmin = 1e-9*ckt->CKTmaxStep; |
||||
|
ckt->CKTmode = job->PSSmode; |
||||
|
/* modified CKTdefs.h for the following - 100609 */ |
||||
|
ckt->CKTstabTime = job->PSSstabTime; |
||||
|
ckt->CKTguessedFreq = job->PSSguessedFreq; |
||||
|
ckt->CKTharms = job->PSSharms; |
||||
|
ckt->CKTpsspoints = job->PSSpoints; |
||||
|
ckt->CKTsc_iter = job->sc_iter; |
||||
|
ckt->CKTsteady_coeff = job->steady_coeff; |
||||
|
|
||||
|
return OK; |
||||
|
} |
||||
@ -0,0 +1,83 @@ |
|||||
|
/********** |
||||
|
Author: 2010-05 Stefano Perticaroli ``spertica'' |
||||
|
**********/ |
||||
|
|
||||
|
#include "ngspice/ngspice.h" |
||||
|
#include "ngspice/ifsim.h" |
||||
|
#include "ngspice/iferrmsg.h" |
||||
|
#include "ngspice/cktdefs.h" |
||||
|
#include "ngspice/pssdefs.h" |
||||
|
|
||||
|
#include "analysis.h" |
||||
|
|
||||
|
/* ARGSUSED */ |
||||
|
int |
||||
|
PSSsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value) |
||||
|
{ |
||||
|
PSSan *job = (PSSan *) anal; |
||||
|
|
||||
|
NG_IGNORE(ckt); |
||||
|
|
||||
|
switch(which) { |
||||
|
|
||||
|
case GUESSED_FREQ: |
||||
|
job->PSSguessedFreq = value->rValue; |
||||
|
break; |
||||
|
case OSC_NODE: |
||||
|
job->PSSoscNode = value->nValue; |
||||
|
break; |
||||
|
case STAB_TIME: |
||||
|
job->PSSstabTime = value->rValue; |
||||
|
break; |
||||
|
case PSS_POINTS: |
||||
|
job->PSSpoints = value->iValue; |
||||
|
break; |
||||
|
case PSS_HARMS: |
||||
|
job->PSSharms = value->iValue; |
||||
|
break; |
||||
|
case PSS_UIC: |
||||
|
if(value->iValue) { |
||||
|
job->PSSmode |= MODEUIC; |
||||
|
} |
||||
|
break; |
||||
|
case SC_ITER: |
||||
|
job->sc_iter = value->iValue; |
||||
|
break; |
||||
|
case STEADY_COEFF: |
||||
|
job->steady_coeff = value->rValue; |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
return(E_BADPARM); |
||||
|
} |
||||
|
return(OK); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
static IFparm PSSparms[] = { |
||||
|
{ "fguess", GUESSED_FREQ, IF_SET|IF_REAL, "guessed frequency" }, |
||||
|
{ "oscnode", OSC_NODE, IF_SET|IF_STRING, "oscillation node" }, |
||||
|
{ "stabtime", STAB_TIME, IF_SET|IF_REAL, "stabilization time" }, |
||||
|
{ "points", PSS_POINTS, IF_SET|IF_INTEGER, "pick equispaced number of time points in PSS" }, |
||||
|
{ "harmonics", PSS_HARMS, IF_SET|IF_INTEGER, "consider only given number of harmonics in PSS from DC" }, |
||||
|
{ "uic", PSS_UIC, IF_SET|IF_INTEGER, "use initial conditions (1 true - 0 false)" }, |
||||
|
{ "sc_iter", SC_ITER, IF_SET|IF_INTEGER, "maxmimum number of shooting cycle iterations" }, |
||||
|
{ "steady_coeff", STEADY_COEFF, IF_SET|IF_INTEGER, "set steady coefficient for convergence test" } |
||||
|
}; |
||||
|
|
||||
|
SPICEanalysis PSSinfo = { |
||||
|
{ |
||||
|
"PSS", |
||||
|
"Periodic Steady State analysis", |
||||
|
|
||||
|
sizeof(PSSparms)/sizeof(IFparm), |
||||
|
PSSparms |
||||
|
}, |
||||
|
sizeof(PSSan), |
||||
|
TIMEDOMAIN, |
||||
|
1, |
||||
|
PSSsetParm, |
||||
|
PSSaskQuest, |
||||
|
PSSinit, |
||||
|
DCpss |
||||
|
}; |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue