Source code for PyLTSpice.sim.ngspice_simulator

#!/usr/bin/env python
# coding=utf-8

# -------------------------------------------------------------------------------
#    ____        _   _____ ____        _
#   |  _ \ _   _| | |_   _/ ___| _ __ (_) ___ ___
#   | |_) | | | | |   | | \___ \| '_ \| |/ __/ _ \
#   |  __/| |_| | |___| |  ___) | |_) | | (_|  __/
#   |_|    \__, |_____|_| |____/| .__/|_|\___\___|
#          |___/                |_|
#
# Name:        ngspice_simulator.py
# Purpose:     Tool used to launch NGspice simulations in batch mode.
#
# Author:      Nuno Brum (nuno.brum@gmail.com)
#
# Created:     23-02-2023
# Licence:     refer to the LICENSE file
# -------------------------------------------------------------------------------

from pathlib import Path
import logging
_logger = logging.getLogger("PyLTSpice.NGSpiceSimulator")

from .simulator import Simulator, run_function


[docs]class NGspiceSimulator(Simulator): """Stores the simulator location and command line options and runs simulations.""" spice_exe = ["C:/Apps/NGSpice64/bin/ngspice.exe"] process_name = "ngspice.exe" ngspice_args = { '-a' : ['-a'], '--autorun' : ['--autorun'], # run the loaded netlist '-b' : ['-b'], '--batch' : ['--batch'], # process FILE in batch mode '-c' : ['-c', '<FILE>'], # '--circuitfile' : ['--circuitfile', '<FILE>'], # set the circuitfile '-D' : ['-D', 'var_value'], # '--define' : ['--define', 'var_value'], # define variable to true/[value] '-i' : ['-i'], # '--interactive' : ['--interactive'], # run in interactive mode '-n' : ['-n'], # '--no-spiceinit': ['--no-spiceinit'], # don't load the local or user's config file '-o' : ['-o', '<FILE>'], # '--output' : ['--output', '<FILE>'], # set the outputfile '-p' : ['-p'], # '--pipe' : ['--pipe'], # run in I/O pipe mode '-q' : ['-q'], # '--completion' : ['--completion'], # activate command completion '-r' : ['-r'], # '--rawfile' : ['--rawfile', '<FILE>'], # set the rawfile output '--soa-log' : ['--soa-log', '<FILE>'], # set the outputfile for SOA warnings '-s' : ['-s'], # '--server' : ['--server'], # run spice as a server process '-t' : ['-t', '<TERM>'], # '--term' : ['--term', '<TERM>'], # set the terminal type '-h' : ['-h'], # '--help' : ['--help'], # display this help and exit '-v' : ['-v'], # '--version' : ['--version'], # output version information and exit } default_run_switches = ['-b', '-o', '-r', '-a']
[docs] @classmethod def valid_switch(cls, switch, parameter='') -> list: """ Validates a command line switch. The following options are available for NGSpice: :param switch: switch to be added. If the switch is not on the list above, it should be correctly formatted with the preceding '-' switch :type switch: str :param parameter: parameter for the switch :type parameter: str, optional :return: the correct formatting for the switch :rtype: list """ ret = [] # This is an empty switch if switch in cls.ngspice_args: if switch in cls.default_run_switches: _logger.info(f"Switch {switch} is already in the default switches") return ret switch_list = cls.ngspice_args[switch] if len(switch_list) == 2: param_token = switch_list[1] if param_token == '<FILE>': ret = [switch_list[0], parameter] elif param_token == '<TERM>': ret = [switch_list[0], parameter] else: _logger.warning(f"Invalid parameter {parameter} for switch '{switch}'") else: ret = switch_list else: _logger.warning(f"Invalid Switch {switch}") return ret
[docs] @classmethod def run(cls, netlist_file, cmd_line_switches, timeout): logfile = Path(netlist_file).with_suffix('.log').as_posix() rawfile = Path(netlist_file).with_suffix('.raw').as_posix() cmd_run = cls.spice_exe + cmd_line_switches + ['-b'] + ['-o'] + [logfile] + ['-r'] + [rawfile] + [netlist_file] # start execution return run_function(cmd_run, timeout=timeout)