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