PySpice
PySpice copied to clipboard
Using `circuit.simulator(simulator='ngspice-subprocess',...)` breaks PySpice execution
Environment (OS, Python version, PySpice version, simulator)
Ubuntu 20.04.6 LTS Python 3.8.10 PySpice version: '1.5' Simulator: NGSpice
Expected Behaviour
No error message ; elements values should be printed
Actual Behaviour
PySpice stops with the following output:
me@compute:PySpice/examples/resistor$ python3 voltage-divider.py
2023-09-08 19:08:14,060 - PySpice.Spice.Netlist.Node.__init__ - WARNING - Node name 'in' is a Python keyword
2023-09-08 19:08:14,071 - PySpice.Spice.NgSpice.Server.SpiceServer.__call__ - INFO - Start the spice subprocess
Traceback (most recent call last):
File "voltage-divider.py", line 27, in <module>
analysis = simulator.operating_point()
File "git-dir/PySpice/PySpice/Spice/Simulation.py", line 1194, in operating_point
return self._run('operating_point', *args, **kwargs)
File "git-dir/PySpice/PySpice/Spice/NgSpice/Simulation.py", line 76, in _run
raw_file = self._spice_server(spice_input=str(self))
File "git-dir/PySpice/PySpice/Spice/NgSpice/Server.py", line 162, in __call__
return RawFile(stdout, number_of_points)
File "git-dir/PySpice/PySpice/Spice/NgSpice/RawFile.py", line 170, in __init__
raw_data = self._read_header(stdout)
File "git-dir/PySpice/PySpice/Spice/NgSpice/RawFile.py", line 192, in _read_header
self.circuit_name = self._read_header_field_line(header_line_iterator, 'Circuit')
File "git-dir/PySpice/PySpice/Spice/RawFile.py", line 243, in _read_header_field_line
raise NameError("Expected label %s instead of %s" % (expected_label, label))
NameError: Expected label Circuit instead of No compatibility mode selected
me@compute:PySpice/examples/resistor$
The failure happens for any kind of circuit but is demonstrated below with one of the builtin example.
Steps to reproduce the behaviour
Open example examples/resistor/voltage-divider.py and replace line L25:
simulator = circuit.simulator(temperature=25, nominal_temperature=25)
with
simulator = circuit.simulator(simulator='ngspice-subprocess',temperature=25, nominal_temperature=25)
Then run :
python3 voltage-divider.py
I have investigated the problem. It comes from an evolution on NGSpice side that began on 2021-01-01 : https://sourceforge.net/p/ngspice/ngspice/ci/1234c3bdf8a48e6201a3ecf03e10396657fa96e8/tree//src/frontend/inpcom.c?diff=164d3dd20c6008d842bd4ae34d63d3ae22923e68
From that moment, inpcom.c began to display a message at the very beginning of the output of the simulation mode.
The message has been latter moved to inpcompat.c.
The message can be easily shown with the following command from the terminal :
echo "bla" | ngspice -s
No compatibility mode selected!
Circuit: bla
Note: No ".plot", ".print", or ".fourier" lines; no simulations run
which mimics what is done in Server.py
If one sets an spinit file containing a compatibility setting, for example:
set ngbehavior=hsa
and configures the SPICE_SCRIPTS environment variable to use this spinit file then you get:
echo "bla" | ngspice -s
Compatibility modes selected: hs a
Circuit: bla
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Please note that the message is not an error; it is just a note given by NGSpice.
To fix the issue, one may want to update :
_read_header
to contain something like:
self.note = self._read_header_field_line(header_line_iterator, 'Note')
(only valid for the latest versions of NGSpice (later than 2022-03-14)
I need to check if this first idea for fix is valid.
Please note, that there is no issue when using the circuit.simulator(simulator='ngspice-shared') option instead
Hi @cyber-g !
I'm trying to run ngspice sims with PySpice on Ubuntu, but I'm stuck on an issue. Could you help me to fix it?
I created the environment variable in my .bashrc: export SPICE_SCRIPTS="/home/kolos/spinit" echo $SPICE_SCRIPTS /home/kolos/spinit
but ngspice can't find the spinit file:
Note: can't find the initialization file spinit.
Note: No compatibility mode selected!
Circuit: bla
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
Using SPARSE 1.3 as Direct Linear Solver