From 12012fc35c79bbe1031e0594ce0b7456a441d0f6 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Thu, 30 Jul 2026 11:04:58 +0200 Subject: [PATCH] pa-210 partially, not dotcard .pss in inp.c --- src/spicelib/analysis/dcpss.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/spicelib/analysis/dcpss.c b/src/spicelib/analysis/dcpss.c index 33bd077fc..7dc0d0202 100644 --- a/src/spicelib/analysis/dcpss.c +++ b/src/spicelib/analysis/dcpss.c @@ -4351,6 +4351,11 @@ shootingexit: double *pssnphases = TMALLOC (double, ckt->CKTharms); double *pssValues = TMALLOC (double, ckt->CKTpsspoints + 1); double *pssResults = TMALLOC (double, msize * ckt->CKTharms); + /* Enhancement-210: keep the per-harmonic PHASE too, so the frequency- + domain spectrum can be published as COMPLEX (mag + phase both + accessible via mag()/vp(), like the hb command's E-209 vectors and + like AC-analysis node vectors), instead of magnitude-only. */ + double *pssPhaseR = TMALLOC (double, msize * ckt->CKTharms); /* End plot in Time Domain */ SPfrontEnd->OUTendPlot (job->PSSplot_td) ; @@ -4363,7 +4368,7 @@ shootingexit: error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob, "Frequency Domain Periodic Steady State Analysis", freqUid, IF_REAL, - numNames, nameList, IF_REAL, + numNames, nameList, IF_COMPLEX, &(job->PSSplot_fd)) ; tfree (nameList) ; SPfrontEnd->OUTattributes (job->PSSplot_fd, NULL, PLOT_COMB, NULL) ; @@ -4380,15 +4385,31 @@ shootingexit: pssfreqs, pssmags, pssphases, pssnmags, pssnphases) ; for (j = 0 ; j < ckt->CKTharms ; j++) - pssResults [j * msize + i] = pssmags [j] ; + { + pssResults [j * msize + i] = pssmags [j] ; /* single-sided magnitude */ + pssPhaseR [j * msize + i] = pssphases [j] ; /* phase, degrees (0 at DC) */ + } } + /* Enhancement-210: publish each harmonic as a COMPLEX data row + (mag * e^{j*phase}); |.| reproduces the magnitude spectrum and the + phase is now recoverable via vp(). (DFT returns the phase in degrees.) */ for (j = 0 ; j < ckt->CKTharms ; j++) { + IFvalue freqData, valData ; + IFcomplex *cdata = TMALLOC (IFcomplex, msize) ; + freqData.rValue = pssfreqs [j] ; + valData.v.numValue = msize ; + valData.v.vec.cVec = cdata ; for (i = 0 ; i < msize ; i++) - ckt->CKTrhsOld [i + 1] = pssResults [j * msize + i] ; - - CKTdump (ckt, pssfreqs [j], job->PSSplot_fd) ; + { + double m = pssResults [j * msize + i] ; + double ph = pssPhaseR [j * msize + i] * M_PI / 180.0 ; + cdata [i].real = m * cos (ph) ; + cdata [i].imag = (j == 0) ? 0.0 : m * sin (ph) ; + } + SPfrontEnd->OUTpData (job->PSSplot_fd, &freqData, &valData) ; + FREE (cdata) ; } /* ****************** */ /* Ending DFT on data */ @@ -4500,6 +4521,7 @@ shootingexit: FREE (pssResults) ; + FREE (pssPhaseR) ; FREE (pssValues) ; FREE (pssnphases) ; FREE (pssnmags) ;