23 changed files with 0 additions and 1924 deletions
-
9configure.ac
-
22examples/pss/colpitt_osc_pss.cir
-
33examples/pss/compl_cross_quad_osc_pss.cir
-
19examples/pss/hartley_osc_pss.cir
-
26examples/pss/ring_osc_pss.cir
-
21examples/pss/vackar_osc_pss.cir
-
17examples/pss/vdp_osc_pss.cir
-
16src/frontend/commands.c
-
11src/frontend/runcoms.c
-
3src/frontend/runcoms.h
-
47src/frontend/shyu.c
-
10src/frontend/spiceif.c
-
1src/include/ngspice/Makefile.am
-
17src/include/ngspice/cktdefs.h
-
39src/include/ngspice/pssdefs.h
-
9src/spicelib/analysis/Makefile.am
-
7src/spicelib/analysis/analysis.c
-
1367src/spicelib/analysis/dcpss.c
-
54src/spicelib/analysis/pssaskq.c
-
35src/spicelib/analysis/pssinit.c
-
83src/spicelib/analysis/psssetp.c
-
74src/spicelib/parser/inp2dot.c
-
4visualc/vngspice.vcproj
@ -1,22 +0,0 @@ |
|||
Colpitt's Oscillator Circuit |
|||
* Colpitt is an harmonic oscillator (LC based) which use |
|||
* a capacitive partition of resonator to feed the single |
|||
* active device. |
|||
* Prediceted frequency is about 3.33945e+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 4e6 500e-6 3 1024 11 50 5e-3 uic |
|||
|
|||
@ -1,33 +0,0 @@ |
|||
Complimentary Cross Quad CMOS Oscillator |
|||
* Predicted frequency is 5.59197e+08 Hz. |
|||
|
|||
* 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 624e6 1u v_plus 1024 10 50 5e-3 uic |
|||
@ -1,19 +0,0 @@ |
|||
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 122.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) |
|||
|
|||
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 150 200e-3 2 1024 11 50 5e-3 uic |
|||
@ -1,26 +0,0 @@ |
|||
Ring CMOS Oscillator |
|||
* Predicted frequency is 3.84841e+09 Hz. |
|||
|
|||
* 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 bout 1024 10 100 5e-3 uic |
|||
@ -1,21 +0,0 @@ |
|||
Vackar's Oscillator Circuit |
|||
* Vackar is a derivation of Colpitt's oscillator (LC based). |
|||
* Oscillation is taken on node 4. |
|||
* Predicted frequency is 1.92291e+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 4e6 10e-6 4 1024 10 50 5e-3 uic |
|||
@ -1,17 +0,0 @@ |
|||
Van Der Pol Oscillator |
|||
* Prediceted frequency is about 4.58957e+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 gib 1024 11 50 5e-3 uic |
|||
@ -1,39 +0,0 @@ |
|||
/********** |
|||
Author: 2010-05 Stefano Perticaroli ``spertica'' |
|||
**********/ |
|||
|
|||
#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; |
|||
void *PSSplot_td; |
|||
void *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 |
|||
1367
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
@ -1,54 +0,0 @@ |
|||
/********** |
|||
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 = 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); |
|||
} |
|||
@ -1,35 +0,0 @@ |
|||
/********** |
|||
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; |
|||
|
|||
/* Final time depends on stabilization time requested for PSS |
|||
and on at least one more oscillation period */ |
|||
ckt->CKTfinalTime = job->PSSstabTime + 2/job->PSSguessedFreq; |
|||
/* 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; |
|||
} |
|||
@ -1,83 +0,0 @@ |
|||
/********** |
|||
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