From 2a693e2d802653d19411b5dc0de6a7e3d07ccf5d Mon Sep 17 00:00:00 2001 From: rlar Date: Mon, 28 Feb 2011 20:32:34 +0000 Subject: [PATCH] merge TRRANDOM vsrc -> isrc --- ChangeLog | 12 ++++++++++++ src/spicelib/devices/isrc/isrc.c | 2 ++ src/spicelib/devices/isrc/isrcacct.c | 29 ++++++++++++++++++++++++++++ src/spicelib/devices/isrc/isrcask.c | 1 + src/spicelib/devices/isrc/isrcdefs.h | 4 ++++ src/spicelib/devices/isrc/isrcload.c | 9 +++++++++ src/spicelib/devices/isrc/isrcpar.c | 25 ++++++++++++++++++++++++ src/spicelib/devices/vsrc/vsrc.c | 2 +- src/spicelib/devices/vsrc/vsrcload.c | 2 +- 9 files changed, 84 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3893ce87b..fac741436 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-02-28 Robert Larice + * src/spicelib/devices/isrc/isrc.c , + * src/spicelib/devices/isrc/isrcacct.c , + * src/spicelib/devices/isrc/isrcask.c , + * src/spicelib/devices/isrc/isrcdefs.h , + * src/spicelib/devices/isrc/isrcload.c , + * src/spicelib/devices/isrc/isrcpar.c , + * src/spicelib/devices/vsrc/vsrc.c , + * src/spicelib/devices/vsrc/vsrcload.c : + merge TRRANDOM vsrc -> isrc + see commit from 11-01-16 + 2011-02-27 Robert Larice * src/spicelib/devices/isrc/* , * src/spicelib/devices/vsrc/* : diff --git a/src/spicelib/devices/isrc/isrc.c b/src/spicelib/devices/isrc/isrc.c index dc63f62a8..ef8c05fd2 100644 --- a/src/spicelib/devices/isrc/isrc.c +++ b/src/spicelib/devices/isrc/isrc.c @@ -22,6 +22,8 @@ IFparm ISRCpTable[] = { /* parameters */ IOP ("sffm", ISRC_SFFM, IF_REALVEC,"Single freq. FM description"), IOP ("am", ISRC_AM, IF_REALVEC,"Amplitude modulation description"), IOP ("trnoise", ISRC_TRNOISE, IF_REALVEC,"Transient noise description"), + IOP ("trrandom", ISRC_TRRANDOM, IF_REALVEC,"random source description"), + OPU ("pos_node",ISRC_POS_NODE, IF_INTEGER,"Positive node of source"), OPU ("neg_node",ISRC_NEG_NODE, IF_INTEGER,"Negative node of source"), OPU ("function",ISRC_FCN_TYPE, IF_INTEGER,"Function of the source"), diff --git a/src/spicelib/devices/isrc/isrcacct.c b/src/spicelib/devices/isrc/isrcacct.c index 67b78d462..99f2ff968 100644 --- a/src/spicelib/devices/isrc/isrcacct.c +++ b/src/spicelib/devices/isrc/isrcacct.c @@ -263,6 +263,35 @@ ISRCaccept(CKTcircuit *ckt, GENmodel *inModel) } break; + case TRRANDOM: { + struct trrandom_state *state = here -> ISRCtrrandom_state; + double TS = state -> TS; + double TD = state -> TD; + + double time = ckt->CKTtime - TD; + + if (time < 0) break; + + if(ckt->CKTbreak) { + + int n = (int) floor(time / TS + 0.5); + volatile double nearest = n * TS; + + if(AlmostEqualUlps(nearest, time, 3)) { + /* carefully calculate `next' + * make sure it is really identical + * with the next calculated `nearest' value + */ + volatile double next = (n+1) * TS + TD; + error = CKTsetBreak(ckt, next); + if(error) + return(error); + state->value = trrandom_state_get(state); + } + } + } + break; + } // switch } // if ... else bkptset: ; diff --git a/src/spicelib/devices/isrc/isrcask.c b/src/spicelib/devices/isrc/isrcask.c index e90f797fd..0f641651e 100644 --- a/src/spicelib/devices/isrc/isrcask.c +++ b/src/spicelib/devices/isrc/isrcask.c @@ -47,6 +47,7 @@ ISRCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue * case ISRC_SFFM: case ISRC_AM: case ISRC_TRNOISE: + case ISRC_TRRANDOM: case ISRC_FCN_COEFFS: temp = value->v.numValue = here->ISRCfunctionOrder; v = value->v.vec.rVec = TMALLOC(double, here->ISRCfunctionOrder); diff --git a/src/spicelib/devices/isrc/isrcdefs.h b/src/spicelib/devices/isrc/isrcdefs.h index 18e69ee70..319fbd077 100644 --- a/src/spicelib/devices/isrc/isrcdefs.h +++ b/src/spicelib/devices/isrc/isrcdefs.h @@ -47,6 +47,7 @@ typedef struct sISRCinstance { double ISRCdF2phase; /* distortion f2 phase */ struct trnoise_state *ISRCtrnoise_state; /* transient noise */ + struct trrandom_state *ISRCtrrandom_state; /* transient random source */ /* gtri - begin - add member to hold current source value */ #ifdef XSPICE @@ -89,6 +90,7 @@ typedef struct sISRCmodel { #define PWL 5 #define AM 6 #define TRNOISE 7 +#define TRRANDOM 8 #endif /*PULSE*/ /* device parameters */ @@ -121,6 +123,8 @@ typedef struct sISRCmodel { #endif /* gtri - end - add define for current source value */ #define ISRC_TRNOISE 25 +#define ISRC_TRRANDOM 26 + /* model parameters */ /* device questions */ diff --git a/src/spicelib/devices/isrc/isrcload.c b/src/spicelib/devices/isrc/isrcload.c index d4c9f5228..51b08c455 100644 --- a/src/spicelib/devices/isrc/isrcload.c +++ b/src/spicelib/devices/isrc/isrcload.c @@ -354,6 +354,15 @@ INoi1 1 0 DC 0 TRNOISE(0n 0.5n 1 10n) : generate 1/f noise } break; + case TRRANDOM: { + struct trrandom_state *state = here -> ISRCtrrandom_state; + value = state -> value; + /* DC value */ + if(here -> ISRCdcGiven) + value += here->ISRCdcValue; + } + break; + } // switch } // else (line 48) loadDone: diff --git a/src/spicelib/devices/isrc/isrcpar.c b/src/spicelib/devices/isrc/isrcpar.c index cd9e52d0b..32f95b117 100644 --- a/src/spicelib/devices/isrc/isrcpar.c +++ b/src/spicelib/devices/isrc/isrcpar.c @@ -202,7 +202,32 @@ ISRCparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->ISRCtrnoise_state = trnoise_state_init(NA, TS, NALPHA, NAMP, RTSAM, RTSCAPT, RTSEMT); + } + break; + case ISRC_TRRANDOM: { + double TD = 0.0, TS; + int rndtype = 1; + double PARAM1 = 1.0; + double PARAM2 = 0.0; + + here->ISRCfunctionType = TRRANDOM; + here->ISRCfuncTGiven = TRUE; + copy_coeffs(here, value); + + rndtype = (int)here->ISRCcoeffs[0]; // type of random function + TS = here->ISRCcoeffs[1]; // time step + if (here->ISRCfunctionOrder > 2) + TD = here->ISRCcoeffs[2]; // delay + + if (here->ISRCfunctionOrder > 3) + PARAM1 = here->ISRCcoeffs[3]; // first parameter + + if (here->ISRCfunctionOrder > 4) + PARAM2 = here->ISRCcoeffs[4]; // second parameter + + here->ISRCtrrandom_state = + trrandom_state_init(rndtype, TS, TD, PARAM1, PARAM2); } break; diff --git a/src/spicelib/devices/vsrc/vsrc.c b/src/spicelib/devices/vsrc/vsrc.c index 23b31b418..2fbcc7e06 100644 --- a/src/spicelib/devices/vsrc/vsrc.c +++ b/src/spicelib/devices/vsrc/vsrc.c @@ -22,7 +22,7 @@ IFparm VSRCpTable[] = { /* parameters */ IOP ("sffm", VSRC_SFFM, IF_REALVEC,"Single freq. FM description"), IOP ("am", VSRC_AM, IF_REALVEC,"Amplitude modulation description"), IOP ("trnoise", VSRC_TRNOISE, IF_REALVEC,"Transient noise description"), - IOP ("trrandom", VSRC_TRRANDOM, IF_REALVEC,"random voltage description"), + IOP ("trrandom", VSRC_TRRANDOM, IF_REALVEC,"random source description"), OPU ("pos_node",VSRC_POS_NODE, IF_INTEGER,"Positive node of source"), OPU ("neg_node",VSRC_NEG_NODE, IF_INTEGER,"Negative node of source"), diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index f6c4f612a..199bc3271 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -367,7 +367,7 @@ VNoi3 3 0 DC 0 TRNOISE(0 0 0 0 15m 22u 50u) : generate RTS noise value += RTSAM; } - /* DC value */ + /* DC value */ if(here -> VSRCdcGiven) value += here->VSRCdcValue; }