Commit Graph

9646 Commits

Author SHA1 Message Date
Holger Vogt c76219a37d pyplot: If on MSVC the top graph limit is slightly less (due to double
precision deviations) than the vector contents, the graph will
not be plotted in this area.
Therefore extend the limits a bit (0.5%).
Gnuplot: Use snprintf instead of sprintf. Reduce limits extension to 0.005.
2026-08-09 14:51:05 +02:00
Holger Vogt c5cd68015c Remove the controls only when ngSpice_Reset has been called. 2026-08-07 16:16:36 +02:00
Holger Vogt eacda9f5b4 Updating the step equaliser, especially at the final time TSTOP 2026-08-07 15:51:57 +02:00
Holger Vogt 5ad395d5e7 Enable caller command ngSpice_Reset for bg_run
by deleting sh_controls only after 'quit'.
2026-08-07 14:02:51 +02:00
Holger Vogt 55c0d1643c Add comment 2026-08-07 13:58:52 +02:00
Holger Vogt 93c6b997ed Merge branch 'pre-master-47' of ssh://git.code.sf.net/p/ngspice/ngspice into pre-master-47 2026-08-05 16:07:06 +02:00
Holger Vogt 6278c9e722 Improved error handling in case of faulty .lib line 2026-08-05 16:06:10 +02:00
Meisam Bahadori bbd641c206 set noise values to 0 in case no separate sidewall diode 2026-08-04 10:28:24 +02:00
dwarning e441cd660c stop adding nominal temperature to a temperature difference 2026-08-03 18:07:03 +02:00
Meisam Bahadori 5bad670835 stop adding nominal temperature to a temperature difference 2026-08-03 18:03:27 +02:00
Holger Vogt 5cd19a07dd examples/xspice/filesource/filesource_variants.cir fails with compatmode ps.
Replace strstr by search_plain_identifier to not falsely read t_abs out
of rect_abs_dual.m
2026-08-03 16:33:25 +02:00
Holger Vogt 790634a79e better visibility of standard plot 2026-08-03 16:31:26 +02:00
Holger Vogt e286f24bcc mix spice and plain numbers 2026-08-03 16:31:02 +02:00
Meisam Bahadori 79ba4be561 * Enhancement-306: ngspice — the E-241 twin in the fft expression function
Enhancement-241 fixed an amplitude normalization that divided by the ZERO-PADDED
transform size instead of the number of input samples -- in the `fft` COMMAND
(frontend/com_fft.c). The identical mistake survived in maths/cmaths/cmath4.c, the
vector-expression function reached by `let F = fft(v)`: a separate implementation of
the same computation.

Found by continuing the oracle campaign that produced E-241, and located with E-241's
own discriminator, the DC bin. One signal, 4001 samples padded to 4096, DC offset 2.0:

  fft s          ; the COMMAND    ->  mag(s)[0] = 2.000000    correct
  let F = fft(s) ; the FUNCTION   ->  mag(F)[0] = 1.953613    = 2.0 * 4001/4096

X[0] is the sum of the samples, D*length for a DC offset D, so dividing by the padded N
reads back D*length/N. As E-241 put it: a DC value cannot depend on how many samples
were taken.

This is a contradiction, not a matter of convention. cx_fft holds TWO complete
implementations -- one for complex input, one for real -- and each has an FFTW branch
and a Green's radix-2 branch. In BOTH, the FFTW branch already used the input length
while Green's used the padded size:

  real branch     FFTW: scale = ((double)length)/2.0    Green: ((double)N)/2   <- wrong
  complex branch  FFTW: scale = (double) fpts           Green: (double) N      <- wrong

the correct version sitting a few lines from the wrong one inside the same function --
the same shape as `avg` disagreeing with `integ` in E-302. HAVE_LIBFFTW3 is undefined in
this build, so Green's is the live path and the defect was reachable.

  oracle                              before      after       closed form
  real-input, DC bin                  1.953613    2.000000    2.0
  real-input, ifft(fft(x))            2.3e-02     1.1e-16     0
  complex-input, bin 0                0.9766780   0.9998683   0.9998683

The round trip is an INDEPENDENT confirmation: nothing here touches ifft, so its going
from 2.3% error to machine precision is evidence from a direction the fix did not aim
at -- the pair only inverts when the forward normalization is right. cx_ifft was
audited and deliberately left alone for that reason.

Every caller of the Green's radix-2 kernel was audited, not only the one that failed:
com_fft.c's fft (x2) and spec/PSD (x2) are correct from E-241; cx_ifft is correct;
trannoise/1-f-code.c cannot pad at all, since n_pts is grown to 2^n_exp by construction;
and fft/ifft are the only transform functions in the expression table, so there is no
spec twin to miss.

Verification: examples/fftexpr_examples/verify_fftexpr.py -- 6 checks under both
solvers, all against closed form (DC bin on both paths, round trip padded and unpadded,
complex-input bin 0 against the analytic mean of an RC response). It scores 3/6 on the
pre-fix binary, so it is a real regression guard. E-241's own suite (fftnorm_examples)
and ifftreal_examples pass unchanged. Full sweep 241/241 OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-02 19:56:26 +02:00
Meisam Bahadori 9ee0028132 * E-252: XSPICE xfer/file_source — fix two heap out-of-bounds writes in the file parsers
Found while sweeping the file-parser code models (d_state/d_source/xfer/
file_source); confirmed with AddressSanitizer. Unlike the earlier code-model
finds (E-246/247/250, reads or bounded errors), these are out-of-bounds WRITES --
silent heap corruption.

1. xfer (analog/xfer/cfunc.mod, read_file): reads a transfer-function file (a
   Touchstone-style `#` option line then data). It sscanf's up to 9 values per
   line and a state machine stores every value (freq/real/imag triples), so a
   line with more than one record stores more than 3. The allocation check
   reserved only 3 (`if (i + 3 > size)`, ALLOC=1024), so a multi-record line
   wrote past the buffer at the 1024-double boundary (ASan: heap-buffer-overflow
   WRITE, cm_xfer). Fix: reserve the sscanf maximum of 9 (`if (i + 9 > size)`).

2. file_source (analog/file_source/cfunc.mod): stores one record per line -- a
   timepoint plus `size` channel values = stepsize (size+1) doubles -- but
   reserved only `size` (`vecallocated - size`), one short. At the reallocation
   boundary the final channel wrote one double past the end (ASan:
   heap-buffer-overflow WRITE, cm_filesource). Fix: reserve a full record
   (`- stepsize`).

Both are heap OOB writes reachable from a valid-syntax netlist with a crafted
data file; the release build corrupts adjacent heap silently rather than always
crashing (UB either way). The sibling parsers were checked: d_source validates
its per-line token count against the declared width, and d_state's fixed line
buffer is fgets-bounded -- no analogous overrun.

Code-model-only change: analog.cm regenerated via cmpp and redeployed under
bin/*/codemodels/; the ngspice binary is unchanged. Verify
(examples/filefix_examples, 4 checks x2 solvers): valid transfer-function and
file_source files simulate; an xfer multi-record file and a boundary-crossing
file_source file run without overrunning. Both reproduced under ASan and shown
fixed. Full regression 208/208.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-02 19:00:14 +02:00
Meisam Bahadori 6a9610efd4 * E-241: fft/spec — fix amplitude normalization for non-power-of-2 records
First numerical-correctness (wrong-number, not crash) find of a correctness-audit
campaign that checked ngspice analyses against analytic and numpy oracles.
com_fft.c has two paths: FFTW3 (exact length-point transform, scale=length/2,
correct) and a Green's radix-2 FFT (no FFTW3) that zero-pads the `length` input
samples up to the next power of two N. The non-FFTW path normalized the
single-sided amplitude by the PADDED size (scale=N/2) instead of the true sample
count (length/2), so every FFT whose sample count is not a power of two reported
amplitudes too small by length/N -- up to 2x. A .tran essentially never yields
exactly 2^k points, so this bit the common case silently. The DC bin is the clean
discriminator (always exactly bin 0, no scalloping): a 2.0 V DC offset read back
as 2.0*length/N, e.g. 1.0009 for a 1025-sample record padded to 2048. spec had
the same error in its power normalization (intres = N*N instead of length*length;
the FFTW path already used length*length).

Fix: scale = length/2 and intres = length*length in the non-FFTW path, matching
FFTW. The frequency axis was already padding-aware, so only the magnitude scale
needed changing; power-of-2 records (length == N) and FFTW-linked builds are
unchanged. Validated against numpy: after the fix ngspice's fft matches
numpy.fft.rfft of the same zero-padded record (normalized by length) bin-by-bin
to ~1e-9. fft/spec amplitudes now change for non-power-of-2 records (they become
correct). Regression 199/199.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-02 18:51:45 +02:00
Holger Vogt 4ed89173f2 Enable spice notations like 2n or 5m in filesource inputs
Tests that spaces or tabs are o.k.
2026-08-02 16:00:36 +02:00
Holger Vogt 53564f2b98 switch to Unix line endings 2026-07-28 19:43:25 +02:00
Holger Vogt b922de9fad Merge branch 'pre-master-47' of ssh://git.code.sf.net/p/ngspice/ngspice into pre-master-47 2026-07-25 16:05:05 +02:00
Holger Vogt 77259c40d9 Input file encoding
Read, then remove BOM
UTF-16: Read every second character (o.k. if only ASCII involved).
2026-07-25 16:03:15 +02:00
Brian Taylor aec5785238 Clarify the paranoia_parallel README file. 2026-07-25 16:02:26 +02:00
Holger 736533257a get independent outputs 2026-07-18 17:52:16 +02:00
Meisam Bahadori f27f737680 Add missing files to pyplot 2026-07-18 17:38:34 +02:00
Holger Vogt 4149df7d70 Examples for comparing of plotting with ngspice, gnuplot and pyplot 2026-07-18 17:04:55 +02:00
Holger Vogt f053e5fa3f Avoid freeing a non-malloced entry 2026-07-18 17:01:39 +02:00
Meisam Bahadori e8031fd31a Add command 'pyplot', invoking numpy/matplotlib plotting,
similar to 'gnuplot' (Meisam Bahadori and Claude 4.8).
Commit contains Enhancements 94, 95, 98, 99, 182, 183.
Add a plotting flag 'boxesplot', in addition to 'combplot'
This fixes a bug in gnuplot and pyplot,
now offering both distinct combplot and boxesplot. (H. Vogt).
2026-07-18 16:04:03 +02:00
Holger Vogt 1d3993a91e Add new pyplot command source files to Visual Studio 2026-07-17 11:33:18 +02:00
Meisam e221e538c8 Adds a 'pyplot' interactive command that renders simulated vectors with
matplotlib -- a Python counterpart to ngspice's 'gnuplot' command. Same
syntax (pyplot <file> <plot expressions...>): the first word is the output file name only when it is NOT a plot expression, the rest are ordinary plot expressions handled by plotit().

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 11:20:24 +02:00
Holger Vogt 3c1687ea29 Disable topology reduction by default. Enable it by setting
'topo_reduce' in .spiceinit.
2026-07-17 10:56:55 +02:00
Holger Vogt 7dc8923bc6 Enable obtaining node info also for code models. 2026-07-17 10:44:09 +02:00
Holger Vogt 5316ab4203 typo 2026-07-17 10:43:02 +02:00
Holger Vogt ca2d994368 Warn if rshunt without XSPICE selected 2026-07-17 10:42:39 +02:00
Holger Vogt f8c1c8477a Improve the output format of the 'show' command,
tested with various voltage sources.
2026-07-07 15:37:58 +02:00
Holger Vogt 3128841b99 Restrict the return vectors (malloced) to the voltage source type
given by the requested VSRC function type value (VSRC_PULSE etc.)
2026-07-07 14:58:57 +02:00
Peer Hofstra 301051d1da Strip a UTF-8 byte order mark at the start of a line -- i.e. at
the start of a file written by a Windows editor.  A BOM is never
legal SPICE syntax; left in place it glues to the first token
(fatal ".subckt/.ends mismatch" class errors in included libs).
2026-07-07 14:54:57 +02:00
alto555 10276f9936 `show' printed a device's vector parameter (a source's pulse/pwl/ac
coefficient list) one element at a time, calling askInstanceQuest for
every element.  Two bugs made that catastrophic on a large chip:

  * IFvalue val was uninitialised, so a query that did not set
    v.numValue left `n' as stack garbage -- the element loop then ran
    essentially forever.
  * askInstanceQuest TMALLOCs the coefficient vector (vsrcask.c) on
    every call and printvals()/printvals_old() never freed it, so the
    listing leaked O(n^2) allocations -- tens of GB on a deck with many
    stimulus sources.

Fix: memset val before the query and clamp n (kills the runaway loop),
and free the returned vector after use via a new free_if_vec() helper.
Verified: pulse coefficients still print correctly; show on MOS/BSIM4/
OSDI/vsource is unchanged and does not crash.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 14:51:45 +02:00
Holger Vogt d5228e2461 Revert "Remove memory leak in the 'show' command."
This reverts commit eb68de42d0.
2026-07-07 14:14:18 +02:00
Holger Vogt 37d2264072 Revert "Free vector also in fcn printvals"
This reverts commit b9bbefa427.
2026-07-07 14:14:07 +02:00
Holger Vogt b9bbefa427 Free vector also in fcn printvals 2026-07-07 14:09:58 +02:00
Holger Vogt eb68de42d0 Remove memory leak in the 'show' command.
Needs some more testing, as val is not always instanciated by malloc.
2026-07-06 10:42:04 +02:00
Holger Vogt ee9578055f If stricterrorhandling is set, ngspice detects the dangling
capacitors and resioiostors, lists them and then bails out.
2026-07-06 10:39:49 +02:00
Holger Vogt a86356980a enable removal of dangling nodes also when MODETRANOP is set.
Removes singular nodes when op before tran is run.
2026-07-03 14:11:02 +02:00
Holger Vogt 6272cbaf1b no removal of dangling capacitors/resistors when rshunt is set 2026-07-03 14:09:01 +02:00
alto555 aac1952ebe ckt: dangling-passive topology reduction
Add CKTtopologyReduce() (cktsetup.c) to remove degree-1 dangling
capacitors/resistors -- e.g. dead-end opamp compensation caps -- that
otherwise cause spurious 'Timestep too small' aborts. Node degree is
counted generically over all device types; the floating node is pinned
with a unit diagonal. Disable with 'set no_topo_reduce'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 16:49:12 +02:00
Giles Atkinson 5e27a8f6de Fix file name quoting for .LIB. Reported by Tom Hajar in ngspice-users. 2026-06-30 10:23:59 +01:00
Holger Vogt 64bf572264 Add examples for the IHP Open Source PDK 2026-06-30 09:45:49 +02:00
Brian Taylor d881158a41 Paranoia_Parallel: a test suite for more than 100 test circuits,
running in parallel on a multi-core machine (12 min execution time
on a i9 9900, ngspice compiled with gcc, debug mode enabled.
Linux with Valgrind and Parallel are required.
2026-06-29 17:35:00 +02:00
Giles Atkinson 2988b5db66 Correct three comments. 2026-06-29 14:45:15 +02:00
Giles Atkinson d56e3abd0e In a shared library build, the option -fvisibility=hidden may be set
when compiling making entry point Cosim_setup inaccessible.  The problem
was reported at https://github.com/iic-jku/IIC-OSIC-TOOLS/issues/287,
but not reproduced.
2026-06-29 14:45:07 +02:00
Holger Vogt 67fbaa9e6a Make the name of the added voltage source more verbose
(to avoid already existing source names).
2026-06-12 17:38:07 +02:00