From 3128841b99ba003526459a69f500b23767936d42 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Tue, 7 Jul 2026 14:58:57 +0200 Subject: [PATCH] Restrict the return vectors (malloced) to the voltage source type given by the requested VSRC function type value (VSRC_PULSE etc.) --- src/spicelib/devices/vsrc/vsrcask.c | 45 ++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/spicelib/devices/vsrc/vsrcask.c b/src/spicelib/devices/vsrc/vsrcask.c index bd2976a43..4a8972b8f 100644 --- a/src/spicelib/devices/vsrc/vsrcask.c +++ b/src/spicelib/devices/vsrc/vsrcask.c @@ -25,11 +25,42 @@ VSRCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue * { VSRCinstance *here = (VSRCinstance*)inst; static char *msg = "Current and power not available in ac analysis"; - int temp; + int temp, funtype = 0; double *v, *w; NG_IGNORE(select); + /* VSRC function types and instance parameter numbers are different. */ + switch (which) { + case VSRC_PULSE: + funtype = PULSE; + break; + case VSRC_SINE: + funtype = SINE; + break; + case VSRC_EXP: + funtype = EXP; + break; + case VSRC_PWL: + funtype = PWL; + break; + case VSRC_SFFM: + funtype = SFFM; + break; + case VSRC_AM: + funtype = AM; + break; + case VSRC_TRNOISE: + funtype = TRNOISE; + break; + case VSRC_TRRANDOM: + funtype = TRRANDOM; + break; + case VSRC_SOUND: + funtype = SOUND; + break; + } + switch(which) { case VSRC_DC: value->rValue = here->VSRCdcValue; @@ -49,6 +80,18 @@ VSRCask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue * case VSRC_TRNOISE: case VSRC_TRRANDOM: case VSRC_SOUND: + if (here->VSRCfunctionType != funtype) { + value->v.vec.rVec = TMALLOC(double, 1); + value->v.vec.rVec[0] = 0; + } + else { + temp = value->v.numValue = here->VSRCfunctionOrder; + v = value->v.vec.rVec = TMALLOC(double, here->VSRCfunctionOrder); + w = here->VSRCcoeffs; + while (temp--) + *v++ = *w++; + } + return (OK); case VSRC_FCN_COEFFS: temp = value->v.numValue = here->VSRCfunctionOrder; v = value->v.vec.rVec = TMALLOC(double, here->VSRCfunctionOrder);