From 53ae036b6d0a48aaa7d576e7dfffd2beb474cd11 Mon Sep 17 00:00:00 2001 From: rlar Date: Mon, 17 Dec 2012 20:58:22 +0100 Subject: [PATCH] versuch repeat zu realisieren fixme, step antworten ?!? --- src/spicelib/devices/vsrc/vsrcload.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/spicelib/devices/vsrc/vsrcload.c b/src/spicelib/devices/vsrc/vsrcload.c index 9acc987f7..85ef2893d 100644 --- a/src/spicelib/devices/vsrc/vsrcload.c +++ b/src/spicelib/devices/vsrc/vsrcload.c @@ -22,6 +22,15 @@ Modified: 2000 AlansFixes static double pwl_state_get(struct pwl_state *this, double time) { + /* fixme, enter mehrmals im sägezahn ... + * 1) optimier dafür + * 2) stelle sicher, dass das jeweils höchste timestamp zum zug kommt + * (allow step antwort *) + * invariant bei repeat: + * enter time < timof(last-point) + * this->position < indexof(last-point) (fixme really ? wenn es nur 2 points sind zB ) + */ + for (;;) { double t1 = this->arr[this->position + 0]; @@ -341,6 +350,10 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) struct pwl_state *state; + double td = here->VSRCrdelay; + double tp = here->VSRCrperiod; + double r = here->VSRCr; + if (!here->VSRC_state) { here->VSRC_state = TMALLOC(struct pwl_state, 1); pwl_state_init((struct pwl_state *) here->VSRC_state, here); @@ -349,9 +362,12 @@ VSRCload(GENmodel *inModel, CKTcircuit *ckt) state = (struct pwl_state *) here -> VSRC_state; /* fixme repeat value ignored */ - value = pwl_state_get(state, time - here->VSRCrdelay); - - goto loadDone; + if (here->VSRCrGiven && time - td - r >= 0) { + double t = fmod(time - td - r, tp) + r; + value = pwl_state_get(state, t); + } else { + value = pwl_state_get(state, time - td); + } } break;