From b29b0daf5fe0455a644cd6e6020e657b173f0ca3 Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sat, 23 Nov 2024 18:33:34 +0100 Subject: [PATCH 001/115] Smaller diff with original --- PySpice/Spice/NgSpice/Shared.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/PySpice/Spice/NgSpice/Shared.py b/PySpice/Spice/NgSpice/Shared.py index 183c08a4..f6482fe9 100644 --- a/PySpice/Spice/NgSpice/Shared.py +++ b/PySpice/Spice/NgSpice/Shared.py @@ -416,10 +416,21 @@ def setup_platform(cls): cls.LIBRARY_PATH = _ else: if ConfigInstall.OS.on_windows: - ngspice_path = Path(__file__).parent.joinpath('Spice64_dll') - cls.NGSPICE_PATH = ngspice_path - # path = ngspice_path.joinpath('dll-vs', 'ngspice-{version}{id}.dll') - path = ngspice_path.joinpath('dll-vs', 'ngspice{}.dll') + # Check for MSYSTEM environment first + msystem = os.environ.get('MSYSTEM') + mingw_prefix = os.environ.get('MINGW_PREFIX') + + if msystem and mingw_prefix: + # Use MINGW paths + path = str(Path(mingw_prefix) / 'bin' / 'libngspice-0{}.dll') + if 'SPICE_LIB_DIR' not in os.environ: + os.environ['SPICE_LIB_DIR'] = str(Path(mingw_prefix) / 'share' / 'ngspice' / 'scripts') + else: + # Fall back to original Windows paths + ngspice_path = Path(__file__).parent.joinpath('Spice64_dll') + cls.NGSPICE_PATH = ngspice_path + # path = ngspice_path.joinpath('dll-vs', 'ngspice-{version}{id}.dll') + path = str(ngspice_path.joinpath('dll-vs', 'ngspice{}.dll')) elif ConfigInstall.OS.on_osx: path = 'libngspice{}.dylib' @@ -432,6 +443,8 @@ def setup_platform(cls): cls.LIBRARY_PATH = str(path) + + ############################################## _instances = {} @@ -508,6 +521,7 @@ def _load_library(self, verbose): # https://sourceforge.net/p/ngspice/discussion/133842/thread/1cece652/#4e32/5ab8/9027 # When environment variable SPICE_LIB_DIR is empty, ngspice looks in C:\Spice64\share\ngspice\scripts # Else it tries %SPICE_LIB_DIR%\scripts\spinit + if 'SPICE_LIB_DIR' not in os.environ: _ = str(Path(self.NGSPICE_PATH).joinpath('share', 'ngspice')) os.environ['SPICE_LIB_DIR'] = _ @@ -620,7 +634,8 @@ def _send_char(message_c, ngspice_id, user_data): self._stderr.append(content) if content.startswith('Warning:'): func = self._logger.warning - # elif content.startswith('Warning:'): + elif content.startswith('Using'): # Ignore "Using ... as Direct Linear Solver" messages + func = self._logger.debug else: self._error_in_stderr = True func = self._logger.error From 0fdb3b0ceafa67f2dc4fe9a0fd382ebb1a931445 Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sat, 23 Nov 2024 18:38:20 +0100 Subject: [PATCH 002/115] Making it work for Mingw for the msys2 project --- PySpice/Spice/NgSpice/Shared.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PySpice/Spice/NgSpice/Shared.py b/PySpice/Spice/NgSpice/Shared.py index f6482fe9..767fa023 100644 --- a/PySpice/Spice/NgSpice/Shared.py +++ b/PySpice/Spice/NgSpice/Shared.py @@ -443,8 +443,6 @@ def setup_platform(cls): cls.LIBRARY_PATH = str(path) - - ############################################## _instances = {} @@ -521,7 +519,6 @@ def _load_library(self, verbose): # https://sourceforge.net/p/ngspice/discussion/133842/thread/1cece652/#4e32/5ab8/9027 # When environment variable SPICE_LIB_DIR is empty, ngspice looks in C:\Spice64\share\ngspice\scripts # Else it tries %SPICE_LIB_DIR%\scripts\spinit - if 'SPICE_LIB_DIR' not in os.environ: _ = str(Path(self.NGSPICE_PATH).joinpath('share', 'ngspice')) os.environ['SPICE_LIB_DIR'] = _ @@ -635,7 +632,7 @@ def _send_char(message_c, ngspice_id, user_data): if content.startswith('Warning:'): func = self._logger.warning elif content.startswith('Using'): # Ignore "Using ... as Direct Linear Solver" messages - func = self._logger.debug + func = self._logger.debug else: self._error_in_stderr = True func = self._logger.error From 96c85789bfb979c75468bfbeb0890213730c1dcb Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sat, 23 Nov 2024 21:04:29 +0100 Subject: [PATCH 003/115] Sanity test --- .github/workflows/pyspice-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pyspice-test.yml b/.github/workflows/pyspice-test.yml index 2067ddf7..34507a86 100644 --- a/.github/workflows/pyspice-test.yml +++ b/.github/workflows/pyspice-test.yml @@ -5,9 +5,9 @@ name: Pyspice Test on: push: - branches: [ master ] + branches: [ * ] pull_request: - branches: [ master ] + branches: [ * ] jobs: build: From 6ca355b5d18ab62839f8aeb3d490695052c9ad8d Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sat, 23 Nov 2024 21:05:36 +0100 Subject: [PATCH 004/115] Update pyspice-test.yml --- .github/workflows/pyspice-test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pyspice-test.yml b/.github/workflows/pyspice-test.yml index 34507a86..89be2788 100644 --- a/.github/workflows/pyspice-test.yml +++ b/.github/workflows/pyspice-test.yml @@ -5,9 +5,9 @@ name: Pyspice Test on: push: - branches: [ * ] + branches: "*" pull_request: - branches: [ * ] + branches: "*" jobs: build: From 7c130271beb893b9fefd9e15c8063c5ae964b148 Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sun, 24 Nov 2024 00:13:55 +0100 Subject: [PATCH 005/115] Add Background simulations --- PySpice/Spice/NgSpice/Simulation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PySpice/Spice/NgSpice/Simulation.py b/PySpice/Spice/NgSpice/Simulation.py index 92b62ec2..3720f842 100644 --- a/PySpice/Spice/NgSpice/Simulation.py +++ b/PySpice/Spice/NgSpice/Simulation.py @@ -109,6 +109,7 @@ def ngspice(self): ############################################## def _run(self, analysis_method, *args, **kwargs): + background = kwargs.pop('background', False) super()._run(analysis_method, *args, **kwargs) @@ -116,7 +117,7 @@ def _run(self, analysis_method, *args, **kwargs): # load circuit and simulation # Fixme: Error: circuit not parsed. self._ngspice_shared.load_circuit(str(self)) - self._ngspice_shared.run() + self._ngspice_shared.run(background=background) self._logger.debug(str(self._ngspice_shared.plot_names)) self.reset_analysis() From 7f9b8a60f275f04a7208981b569eac44ff73b812 Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sun, 24 Nov 2024 21:08:57 +0100 Subject: [PATCH 006/115] Bumping NgSpice version --- PySpice/Spice/NgSpice/Simulation.py | 11 +++++++---- PySpice/Spice/NgSpice/SimulationType.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/PySpice/Spice/NgSpice/Simulation.py b/PySpice/Spice/NgSpice/Simulation.py index 3720f842..617a7b65 100644 --- a/PySpice/Spice/NgSpice/Simulation.py +++ b/PySpice/Spice/NgSpice/Simulation.py @@ -119,10 +119,13 @@ def _run(self, analysis_method, *args, **kwargs): self._ngspice_shared.load_circuit(str(self)) self._ngspice_shared.run(background=background) self._logger.debug(str(self._ngspice_shared.plot_names)) - self.reset_analysis() + if not background: + self.reset_analysis() - plot_name = self._ngspice_shared.last_plot - if plot_name == 'const': - raise NameError('Simulation failed') + plot_name = self._ngspice_shared.last_plot + if plot_name == 'const': + raise NameError('Simulation failed') + else: + return True #Nothing to show yet! return self._ngspice_shared.plot(self, plot_name).to_analysis() diff --git a/PySpice/Spice/NgSpice/SimulationType.py b/PySpice/Spice/NgSpice/SimulationType.py index fe07f41a..cc04b31a 100644 --- a/PySpice/Spice/NgSpice/SimulationType.py +++ b/PySpice/Spice/NgSpice/SimulationType.py @@ -82,7 +82,7 @@ 'charge', ) -LAST_VERSION = 34 # released on January 31st, 2021 +LAST_VERSION = 43 # released on January 31st, 2021 for version in range(28, LAST_VERSION +1): SIMULATION_TYPE[version] = SIMULATION_TYPE[27] From 494eede9dcc3cd38300f3245a3f90dd669d34963 Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Sun, 24 Nov 2024 21:28:28 +0100 Subject: [PATCH 007/115] Exception ignored from cffi callback , trying to convert the result back to C: --- PySpice/Spice/NgSpice/Shared.py | 1 + 1 file changed, 1 insertion(+) diff --git a/PySpice/Spice/NgSpice/Shared.py b/PySpice/Spice/NgSpice/Shared.py index 767fa023..a7dcf575 100644 --- a/PySpice/Spice/NgSpice/Shared.py +++ b/PySpice/Spice/NgSpice/Shared.py @@ -709,6 +709,7 @@ def _background_thread_running(is_running, ngspice_id, user_data): self = ffi.from_handle(user_data) self._logger.debug('ngspice_id-{} background_thread_running {}'.format(ngspice_id, is_running)) self._is_running = is_running + return 0 ############################################## From e542ad072566528ef6b783e28c1b62880e3a574a Mon Sep 17 00:00:00 2001 From: Kreijstal Date: Mon, 25 Nov 2024 08:47:39 +0100 Subject: [PATCH 008/115] Don't error on halt --- PySpice/Spice/NgSpice/Shared.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PySpice/Spice/NgSpice/Shared.py b/PySpice/Spice/NgSpice/Shared.py index a7dcf575..526d082d 100644 --- a/PySpice/Spice/NgSpice/Shared.py +++ b/PySpice/Spice/NgSpice/Shared.py @@ -633,6 +633,10 @@ def _send_char(message_c, ngspice_id, user_data): func = self._logger.warning elif content.startswith('Using'): # Ignore "Using ... as Direct Linear Solver" messages func = self._logger.debug + elif content.startswith('doAnalyses:'): + func = self._logger.debug + elif content.startswith('run simulation interrupted'): + func = self._logger.debug else: self._error_in_stderr = True func = self._logger.error From a0a672dc475b719a4ab7467402a1b6730633bd13 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 24 Mar 2022 16:31:00 -0700 Subject: [PATCH 009/115] Add OpenSPICE native Python simulator support --- PySpice/Config/ConfigInstall.py | 6 + PySpice/Spice/NgSpice/Shared.py | 3 + PySpice/Spice/OpenSPICE/RawFile.py | 175 +++ PySpice/Spice/OpenSPICE/Server.py | 140 +++ PySpice/Spice/OpenSPICE/Shared.py | 1194 +++++++++++++++++++++ PySpice/Spice/OpenSPICE/Simulation.py | 71 ++ PySpice/Spice/OpenSPICE/SimulationType.py | 90 ++ PySpice/Spice/OpenSPICE/__init__.py | 0 PySpice/Spice/Simulation.py | 3 + 9 files changed, 1682 insertions(+) create mode 100644 PySpice/Spice/OpenSPICE/RawFile.py create mode 100644 PySpice/Spice/OpenSPICE/Server.py create mode 100644 PySpice/Spice/OpenSPICE/Shared.py create mode 100644 PySpice/Spice/OpenSPICE/Simulation.py create mode 100644 PySpice/Spice/OpenSPICE/SimulationType.py create mode 100644 PySpice/Spice/OpenSPICE/__init__.py diff --git a/PySpice/Config/ConfigInstall.py b/PySpice/Config/ConfigInstall.py index b56f8aff..b8f904a7 100644 --- a/PySpice/Config/ConfigInstall.py +++ b/PySpice/Config/ConfigInstall.py @@ -21,6 +21,8 @@ def __init__(self): self._name = 'windows' elif sys.platform.startswith('darwin'): self._name = 'osx' + elif sys.platform.startswith('freebsd'): + self._name = 'freebsd' ############################################## @@ -40,6 +42,10 @@ def on_windows(self): def on_osx(self): return self._name == 'osx' + @property + def on_freebsd(self): + return self._name == 'freebsd' + OS = OsFactory() #################################################################################################### diff --git a/PySpice/Spice/NgSpice/Shared.py b/PySpice/Spice/NgSpice/Shared.py index 526d082d..f74ad1e1 100644 --- a/PySpice/Spice/NgSpice/Shared.py +++ b/PySpice/Spice/NgSpice/Shared.py @@ -438,6 +438,9 @@ def setup_platform(cls): elif ConfigInstall.OS.on_linux: path = 'libngspice{}.so' + elif ConfigInstall.OS.on_freebsd: + path = 'libngspice{}.so' + else: raise NotImplementedError diff --git a/PySpice/Spice/OpenSPICE/RawFile.py b/PySpice/Spice/OpenSPICE/RawFile.py new file mode 100644 index 00000000..8abf5ffb --- /dev/null +++ b/PySpice/Spice/OpenSPICE/RawFile.py @@ -0,0 +1,175 @@ +#################################################################################################### +# +# PySpice - A Spice Package for Python +# Copyright (C) 2017 Fabrice Salvaire +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +#################################################################################################### + +#################################################################################################### + +import os + +from ..RawFile import VariableAbc, RawFileAbc + +#################################################################################################### + +"""This module provide tools to read the output of Xyce. + +Header + +""" + +#################################################################################################### + +import logging + +#################################################################################################### + +_module_logger = logging.getLogger(__name__) + +#################################################################################################### + +class Variable(VariableAbc): + + ############################################## + + def is_voltage_node(self): + + name = self.name.lower() + return name.startswith('v(') or not self.is_branch_current() + + ############################################## + + def is_branch_current(self): + return self.name.endswith('#branch') + + ############################################## + + @staticmethod + def to_voltage_name(node): + return 'v({})'.format(node) + + ############################################## + + @property + def simplified_name(self): + + name = self.name + if len(name) > 1 and name[1] == '(': + return name[2:-1] + elif name.endswith('#branch'): + return name[:-7] + elif '#' in name: + # Xyce change name of type "output_plus" to "OUTPUT#PLUS" + return name.replace('#', '_') + else: + return self.name + +#################################################################################################### + +class RawFile(RawFileAbc): + + """ This class parse the stdout of ngspice and the raw data output. + + Public Attributes: + + :attr:`data` + + :attr:`date` + + :attr:`flags` + 'real' or 'complex' + + :attr:`number_of_points` + + :attr:`number_of_variables` + + :attr:`plot_name` + AC Analysis, Operating Point, Sensitivity Analysis, DC transfer characteristic + + :attr:`title` + + :attr:`variables` + + """ + + _logger = _module_logger.getChild('RawFile') + + _variable_cls = Variable + + ############################################## + + def __init__(self, output): + + raw_data = self._read_header(output) + self._read_variable_data(raw_data) + # self._to_analysis() + + self._simulation = None + + + ############################################## + + def _read_header(self, output): + + """ Parse the header """ + + # see https://github.com/FabriceSalvaire/PySpice/issues/132 + # Xyce open the file in binary mode and print using: os << "Binary:" << std::endl; + # endl is thus \n + binary_line = b'Binary:\n' + binary_location = output.find(binary_line) + if binary_location < 0: + raise NameError('Cannot locate binary data') + raw_data_start = binary_location + len(binary_line) + self._logger.debug(os.linesep + output[:raw_data_start].decode('utf-8')) + header_lines = output[:binary_location].splitlines() + raw_data = output[raw_data_start:] + header_line_iterator = iter(header_lines) + + self.title = self._read_header_field_line(header_line_iterator, 'Title') + self.date = self._read_header_field_line(header_line_iterator, 'Date') + self.plot_name = self._read_header_field_line(header_line_iterator, 'Plotname') + self.flags = self._read_header_field_line(header_line_iterator, 'Flags') + self.number_of_variables = int(self._read_header_field_line(header_line_iterator, 'No. Variables')) + self.number_of_points = int(self._read_header_field_line(header_line_iterator, 'No. Points')) + self._read_header_field_line(header_line_iterator, 'Variables') + self._read_header_variables(header_line_iterator) + + return raw_data + + ############################################## + + def fix_case(self): + + """ Ngspice return lower case names. This method fixes the case of the variable names. """ + + circuit = self.circuit + element_translation = {element.upper():element for element in circuit.element_names} + node_translation = {node.upper():node for node in circuit.node_names} + for variable in self.variables.values(): + variable.fix_case(element_translation, node_translation) + + ############################################## + + def _to_dc_analysis(self): + + if 'sweep' in self.variables: + sweep_variable = self.variables['sweep'] + else: + raise NotImplementedError + + return super()._to_dc_analysis(sweep_variable) diff --git a/PySpice/Spice/OpenSPICE/Server.py b/PySpice/Spice/OpenSPICE/Server.py new file mode 100644 index 00000000..73208742 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/Server.py @@ -0,0 +1,140 @@ +#################################################################################################### +# +# PySpice - A Spice Package for Python +# Copyright (C) 2017 Fabrice Salvaire +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +#################################################################################################### + +"""This module provides an interface to run OpenSPICE and get back the simulation +output. + +""" + +#################################################################################################### + +import logging +import os +import shutil +import subprocess +import tempfile +import OpenSPICE + +from PySpice.Config import ConfigInstall +from .RawFile import RawFile + +#################################################################################################### + +_module_logger = logging.getLogger(__name__) + +#################################################################################################### + +class OpenSPICEServer: + + """This class wraps the execution of OpenSPICE and convert the output to a Python data structure. + + Example of usage:: + + spice_server = OpenSPICEServer() + raw_file = spice_server(spice_input) + + It returns a :obj:`PySpice.Spice.RawFile` instance. + + """ + + if ConfigInstall.OS.on_freebsd: + OpenSPICE_COMMAND = 'python3 -m OpenSPICE' + else: + raise NotImplementedError + + _logger = _module_logger.getChild('OpenSPICEServer') + + ############################################## + + def __init__(self, **kwargs): + + self._OpenSPICE_command = kwargs.get('OpenSPICE_command') or self.OpenSPICE_COMMAND + + ############################################## + + def _parse_stdout(self, stdout): + + """Parse stdout for errors.""" + + # log Spice output + self._logger.info(os.linesep + stdout.decode('utf-8')) + + error_found = False + simulation_failed = False + warning_found = False + lines = stdout.splitlines() + for line_index, line in enumerate(lines): + if line.startswith(b'Netlist warning'): + warning_found = True + # Fixme: highlight warnings + self._logger.warning(os.linesep + line.decode('utf-8')) + elif line.startswith(b'Netlist error'): + error_found = True + self._logger.error(os.linesep + line.decode('utf-8')) + elif b'Transient failure history' in line: + simulation_failed = True + self._logger.error(os.linesep + line.decode('utf-8')) + if error_found: + raise NameError("Error were found by OpenSPICE") + elif simulation_failed: + raise NameError("OpenSPICE simulation failed") + + ############################################## + + def __call__(self, spice_input): + + """Run SPICE in server mode as a subprocess for the given input and return a + :obj:`PySpice.RawFile.RawFile` instance. + + """ + + self._logger.debug('Start the xyce subprocess') + + tmp_dir = tempfile.mkdtemp() + input_filename = os.path.join(tmp_dir, 'input.cir') + output_filename = os.path.join(tmp_dir, 'output.raw') + with open(input_filename, 'w') as f: + f.write(str(spice_input)) + + # command = "python3 -m OpenSPICE " + input_filename + " -r " + output_filename + # print(command) + # self._logger.info('Run {}'.format(' '.join(command))) + # process = subprocess.Popen( + # command, + # stdin=subprocess.PIPE, + # stdout=subprocess.PIPE, + # stderr=subprocess.PIPE, + # shell=True, + # ) + # stdout, stderr = process.communicate() + # print(stdout) + + # self._parse_stdout(stdout) + + OpenSPICE.spice_input(input_filename, output_filename, get_vsrc) + + with open(output_filename, 'rb') as f: + output = f.read() + # self._logger.debug(output) + + raw_file = RawFile(output) + shutil.rmtree(tmp_dir) + + return raw_file diff --git a/PySpice/Spice/OpenSPICE/Shared.py b/PySpice/Spice/OpenSPICE/Shared.py new file mode 100644 index 00000000..53238e50 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/Shared.py @@ -0,0 +1,1194 @@ +#################################################################################################### +# +# PySpice - A Spice Package for Python +# Copyright (C) 2014 Fabrice Salvaire +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +#################################################################################################### + +"""This module provides a Python interface to the Ngspice shared library described in the *ngspice +as shared library or dynamic link library* section of the Ngspice user manual. + +In comparison to the subprocess interface, it provides an interaction with the simulator through +commands and callbacks and it enables the usage of external voltage and current source in the +circuit. + +.. This approach corresponds to the *standard way* to make an interface to a simulator code. + +.. warning:: Since we don't simulate a circuit in a fresh environment on demand, this approach is + less safe than the subprocess approach. In case of bugs within Ngspice, we can expect some side + effects like memory leaks or worse unexpected things. + +This interface use the CFFI module to interface with the shared library. It is thus suited to run +within the Pypy interpreter which implements JIT optimisation for Python. + +It can also be used to experiment parallel simulation as explained in the Ngspice user manual. But +it seems the Ngspice source code was designed with global variables which imply to use one copy of +the shared library by worker as explained in the manual. + +.. warning:: This interface can strongly slow down the simulation if the input or output callbacks + is used. If the simulation time goes wrong for you then you need to implement the callbacks at a + lower level than Python. You can have look to Pypy, Cython or a C extension module. + +""" + +#################################################################################################### + +# 16.7 Environmental variables +# 16.7.1 Ngspice specific variables +# +# SPICE_LIB_DIR +# default: /usr/local/share/ngspice (Linux, CYGWIN), C:\Spice\share\ngspice (Windows) +# SPICE_EXEC_DIR +# default: /usr/local/bin (Linux, CYGWIN), C:\Spice\bin (Windows) +# SPICE_ASCIIRAWFILE +# default: 0 +# Format of the rawfile. 0 for binary, and 1 for ascii. +# SPICE_SCRIPTS +# default: $SPICE_LIB_DIR/scripts +# In this directory the spinit file will be searched. +# NGSPICE_MEAS_PRECISION +# default: 5 +# Sets the number of digits if output values are printed by the meas(ure) command. +# SPICE_NO_DATASEG_CHECK +# default: undefined +# If defined, will suppress memory resource info (probably obsolete, not used on Windows +# or where the /proc information system is available.) +# NGSPICE_INPUT_DIR +# default: undefined +# If defined, using a valid directory name, will add the given directory to the search path +# when looking for input files (*.cir, *.inc, *.lib). + +#################################################################################################### + +__all__ = [ + 'OpenSPICECircuitError', + 'OpenSPICECommandError', + 'OpenSPICEShared', +] + +#################################################################################################### + +from pathlib import Path +import logging +import os +import platform +import re + +import numpy as np + +from cffi import FFI + +#################################################################################################### + +from PySpice.Config import ConfigInstall +from PySpice.Probe.WaveForm import ( + OperatingPoint, SensitivityAnalysis, + DcAnalysis, AcAnalysis, TransientAnalysis, + PoleZeroAnalysis, NoiseAnalysis, DistortionAnalysis, TransferFunctionAnalysis, + WaveForm, +) +from PySpice.Tools.EnumFactory import EnumFactory +from PySpice.Unit import u_V, u_A, u_s, u_Hz, u_F, u_Degree + +from .SimulationType import SIMULATION_TYPE + +#################################################################################################### + +ffi = FFI() + +#################################################################################################### + +_module_logger = logging.getLogger(__name__) + +#################################################################################################### + +class OpenSPICECircuitError(NameError): + pass + +class OpenSPICECommandError(NameError): + pass + +#################################################################################################### + +def ffi_string_utf8(_): + _ = ffi.string(_) + try: + return _.decode('utf8') + except UnicodeDecodeError: + return _ + +#################################################################################################### + +class Vector: + + """ This class implements a vector in a simulation output. + + Public Attributes: + + :attr:`data` + + :attr:`name` + + """ + + _logger = _module_logger.getChild('Vector') + + ############################################## + + def __init__(self, ngspice_shared, name, type_, data): + + self._ngspice_shared = ngspice_shared + self._name = str(name) + self._type = type_ + self._data = data + self._unit = ngspice_shared.type_to_unit(type_) + if self._unit is None: + self._logger.warning('Unit is None for {0._name} {0._type}'.format(self)) + + ############################################## + + def __repr__(self): + return 'variable: {0._name} {0._type}'.format(self) + + ############################################## + + @property + def is_interval_parameter(self): + return self._name.startswith('@') + + ############################################## + + @property + def is_voltage_node(self): + return self._type == self._ngspice_shared.simulation_type.voltage and not self.is_interval_parameter + + ############################################## + + @property + def is_branch_current(self): + return self._type == self._ngspice_shared.simulation_type.current and not self.is_interval_parameter + + ############################################## + + @property + def simplified_name(self): + + if self.is_voltage_node and self._name.startswith('V('): + return self._name[2:-1] + elif self.is_branch_current: + # return self._name.replace('#branch', '') + return self._name[:-7] + else: + return self._name + + ############################################## + + def to_waveform(self, abscissa=None, to_real=False, to_float=False): + + """ Return a :obj:`PySpice.Probe.WaveForm` instance. """ + + data = self._data + if to_real: + data = data.real + # Fixme: else UnitValue instead of UnitValues + # if to_float: + # data = float(data[0]) + + if self._unit is not None: + return WaveForm.from_unit_values(self.simplified_name, self._unit(data), abscissa=abscissa) + else: + return WaveForm.from_array(self.simplified_name, data, abscissa=abscissa) + +#################################################################################################### + +class Plot(dict): + + """ This class implements a plot in a simulation output. + + Public Attributes: + + :attr:`plot_name` + + """ + + ############################################## + + def __init__(self, simulation, plot_name): + + super().__init__() + + self._simulation = simulation + self.plot_name = plot_name + + ############################################## + + def nodes(self, to_float=False, abscissa=None): + return [variable.to_waveform(abscissa, to_float=to_float) + for variable in self.values() + if variable.is_voltage_node] + + ############################################## + + def branches(self, to_float=False, abscissa=None): + return [variable.to_waveform(abscissa, to_float=to_float) + for variable in self.values() + if variable.is_branch_current] + + ############################################## + + def internal_parameters(self, to_float=False, abscissa=None): + return [variable.to_waveform(abscissa, to_float=to_float) + for variable in self.values() + if variable.is_interval_parameter] + + ############################################## + + def elements(self, abscissa=None): + return [variable.to_waveform(abscissa, to_float=True) + for variable in self.values()] + + ############################################## + + def to_analysis(self): + + if self.plot_name.startswith('op'): + return self._to_operating_point_analysis() + elif self.plot_name.startswith('sens'): + return self._to_sensitivity_analysis() + elif self.plot_name.startswith('dc'): + return self._to_dc_analysis() + elif self.plot_name.startswith('ac'): + return self._to_ac_analysis() + elif self.plot_name.startswith('tran'): + return self._to_transient_analysis() + elif self.plot_name.startswith('disto'): + return self._to_distortion_analysis() + elif self.plot_name.startswith('noise'): + return self._to_noise_analysis() + elif self.plot_name.startswith('pz'): + return self._to_polezero_analysis() + elif self.plot_name.startswith('tf'): + return self._to_transfer_function_analysis() + else: + raise NotImplementedError("Unsupported plot name {}".format(self.plot_name)) + + ############################################## + + def _to_operating_point_analysis(self): + return OperatingPoint( + simulation=self._simulation, + nodes=self.nodes(to_float=True), + branches=self.branches(to_float=True), + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_sensitivity_analysis(self): + # Fixme: separate v(vinput), analysis.R2.m + return SensitivityAnalysis( + simulation=self._simulation, + elements=self.elements(), # Fixme: internal parameters ??? + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_dc_analysis(self): + for name in ('v-sweep', 'i-sweep', 'temp-sweep'): + if name in self: + sweep_variable = self[name] + break + else: + raise NotImplementedError(str(self)) + sweep = sweep_variable.to_waveform() + return DcAnalysis( + simulation=self._simulation, + sweep=sweep, + nodes=self.nodes(), + branches=self.branches(), + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_ac_analysis(self): + frequency = self['frequency'].to_waveform(to_real=True) + return AcAnalysis( + simulation=self._simulation, + frequency=frequency, + nodes=self.nodes(), + branches=self.branches(), + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_transient_analysis(self): + + time = self['time'].to_waveform(to_real=True) + return TransientAnalysis( + simulation=self._simulation, + time=time, + nodes=self.nodes(abscissa=time), + branches=self.branches(abscissa=time), + internal_parameters=self.internal_parameters(abscissa=time), + ) + + ############################################## + + def _to_polezero_analysis(self): + return PoleZeroAnalysis( + simulation=self._simulation, + nodes=self.nodes(), + branches=self.branches(), + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_noise_analysis(self): + return NoiseAnalysis( + simulation=self._simulation, + nodes=self.nodes(), + branches=self.branches(), + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_distortion_analysis(self): + frequency = self['frequency'].to_waveform(to_real=True) + return DistortionAnalysis( + simulation=self._simulation, + frequency=frequency, + nodes=self.nodes(), + branches=self.branches(), + internal_parameters=self.internal_parameters(), + ) + + ############################################## + + def _to_transfer_function_analysis(self): + return TransferFunctionAnalysis( + simulation=self._simulation, + nodes=self.nodes(), + branches=self.branches(), + internal_parameters=self.internal_parameters(), + ) + +#################################################################################################### + +class OpenSPICEShared: + + _logger = _module_logger.getChild('OpenSPICEShared') + + NGSPICE_PATH = None + LIBRARY_PATH = None + + MAX_COMMAND_LENGTH = 1023 + NUMBER_OF_EXEC_CALLS_TO_RELEASE_MEMORY = 10_000 + + ############################################## + + @classmethod + def setup_platform(cls): + + if ConfigInstall.OS.on_windows: + if platform.architecture()[0] != '64bit': + raise NameError('Windows 32bit is no longer supported by OpenSPICE') + + _ = os.environ.get('OPENSPICE_LIBRARY_PATH', None) + if _ is not None: + cls.LIBRARY_PATH = _ + else: + if ConfigInstall.OS.on_windows: + ngspice_path = Path(__file__).parent.joinpath('Spice64_dll') + cls.NGSPICE_PATH = ngspice_path + # path = ngspice_path.joinpath('dll-vs', 'ngspice-{version}{id}.dll') + path = ngspice_path.joinpath('dll-vs', 'ngspice{}.dll') + + elif ConfigInstall.OS.on_osx: + path = 'libngspice{}.dylib' + + elif ConfigInstall.OS.on_linux: + path = 'libngspice{}.so' + + elif ConfigInstall.OS.on_freebsd: + path = 'libngspice{}.so' + + else: + raise NotImplementedError + + cls.LIBRARY_PATH = str(path) + + ############################################## + + _instances = {} + + @classmethod + def new_instance(cls, ngspice_id=0, send_data=False, verbose=False): + """Create an OpenSPICEShared instance""" + + # Fixme: send_data + + if ngspice_id in cls._instances: + return cls._instances[ngspice_id] + else: + cls._logger.debug("New instance for id {}".format(ngspice_id)) + instance = cls(ngspice_id=ngspice_id, send_data=send_data, verbose=verbose) + cls._instances[ngspice_id] = instance + return instance + + ############################################## + + def __init__(self, ngspice_id=0, send_data=False, verbose=False): + + """ Set the *send_data* flag if you want to enable the output callback. + + Set the *ngspice_id* to an integer value if you want to run OpenSPICE in parallel. + """ + + self._ngspice_id = ngspice_id + + self._spinit_not_found = False + + self._number_of_exec_calls = 0 + + self._stdout = [] + self._stderr = [] + self._error_in_stdout = None + self._error_in_stderr = None + + self._has_cider = None + self._has_xspice = None + self._ngspice_version = None + self._extensions = [] + + self._library_path = None + + self._is_running = False + + ############################################## + + @property + def spinit_not_found(self): + return self._spinit_not_found + + ############################################## + + @property + def library_path(self): + if self._library_path is None: + if not self._ngspice_id: + library_prefix = '' + else: + library_prefix = '{}'.format(self._ngspice_id) # id = + library_path = self.LIBRARY_PATH.format(library_prefix) + self._library_path = library_path + return self._library_path + + ############################################## + + @staticmethod + def _send_char(message, ngspice_id, user_data): + + """Callback for sending output from stdout, stderr to caller""" + return self.send_char(message, ngspice_id) + + ############################################## + + @staticmethod + def _send_stat(message, ngspice_id, user_data): + """Callback for simulation status to caller""" + self = ffi.from_handle(user_data) + return self.send_stat(ffi_string_utf8(message), ngspice_id) + + ############################################## + + @staticmethod + def _exit(exit_status, immediate_unloding, quit_exit, ngspice_id, user_data): + """Callback for asking for a reaction after controlled exit""" + self = ffi.from_handle(user_data) + self._logger.debug('ngspice_id-{} exit status={} immediate_unloding={} quit_exit={}'.format( + ngspice_id, + exit_status, + immediate_unloding, + quit_exit)) + return exit_status + + ############################################## + + @staticmethod + def _send_data(data, number_of_vectors, ngspice_id, user_data): + """Callback to send back actual vector data""" + self = ffi.from_handle(user_data) + # self._logger.debug('ngspice_id-{} send_data [{}]'.format(ngspice_id, data.vecindex)) + actual_vector_values = {} + for i in range(int(number_of_vectors)): + actual_vector_value = data.vecsa[i] + vector_name = ffi_string_utf8(actual_vector_value.name) + value = complex(actual_vector_value.creal, actual_vector_value.cimag) + actual_vector_values[vector_name] = value + # self._logger.debug(' Vector: {} {}'.format(vector_name, value)) + return self.send_data(actual_vector_values, number_of_vectors, ngspice_id) + + ############################################## + + @staticmethod + def _send_init_data(data, ngspice_id, user_data): + """Callback to send back initialization vector data""" + self = ffi.from_handle(user_data) + # if self._logger.isEnabledFor(logging.DEBUG): + # self._logger.debug('ngspice_id-{} send_init_data'.format(ngspice_id)) + # number_of_vectors = data.veccount + # for i in range(number_of_vectors): + # self._logger.debug(' Vector: ' + ffi_string_utf8(data.vecs[i].vecname)) + return self.send_init_data(data, ngspice_id) # Fixme: should be a Python object + + ############################################## + + @staticmethod + def _background_thread_running(is_running, ngspice_id, user_data): + """Callback to indicate if background thread is runnin""" + self = ffi.from_handle(user_data) + self._logger.debug('ngspice_id-{} background_thread_running {}'.format(ngspice_id, is_running)) + self._is_running = is_running + + ############################################## + + @staticmethod + def _get_vsrc_data(voltage, time, node, ngspice_id, user_data): + """FFI Callback""" + self = ffi.from_handle(user_data) + return self.get_vsrc_data(voltage, time, ffi_string_utf8(node), ngspice_id) + + ############################################## + + @staticmethod + def _get_isrc_data(current, time, node, ngspice_id, user_data): + """FFI Callback""" + self = ffi.from_handle(user_data) + return self.get_isrc_data(current, time, ffi_string_utf8(node), ngspice_id) + + ############################################## + + def send_char(self, message, ngspice_id): + """ Reimplement this callback in a subclass to process logging messages from the simulator. """ + # self._logger.debug('ngspice-{} send_char {}'.format(ngspice_id, message)) + return 0 + + ############################################## + + def send_stat(self, message, ngspice_id): + """ Reimplement this callback in a subclass to process statistic messages from the simulator. """ + # self._logger.debug('ngspice-{} send_stat {}'.format(ngspice_id, message)) + return 0 + + ############################################## + + def send_data(self, actual_vector_values, number_of_vectors, ngspice_id): + """ Reimplement this callback in a subclass to process the vector actual values. """ + return 0 + + ############################################## + + def send_init_data(self, data, ngspice_id): + """ Reimplement this callback in a subclass to process the initial data. """ + return 0 + + ############################################## + + def get_vsrc_data(self, voltage, time, node, ngspice_id): + """ Reimplement this callback in a subclass to provide external voltage source. """ + self._logger.debug('ngspice_id-{} get_vsrc_data @{} node {}'.format(ngspice_id, time, node)) + return 0 + + ############################################## + + def get_isrc_data(self, current, time, node, ngspice_id): + """ Reimplement this callback in a subclass to provide external current source. """ + self._logger.debug('ngspice_id-{} get_isrc_data @{} node {}'.format(ngspice_id, time, node)) + return 0 + + ############################################## + + @staticmethod + def _convert_string_array(array): + strings = [] + i = 0 + while True: + if array[i] == FFI.NULL: + break + strings.append(ffi_string_utf8(array[i])) + i += 1 + return strings + + ############################################## + + @staticmethod + def _to_python(value): + try: + return int(value) + except ValueError: + try: + # Fixme: return float(value.replace(',', '.')) + return float(value) + except ValueError: + return str(value) + + ############################################## + + @staticmethod + def _lines_to_dicts(lines): + if lines: + values = dict(description=lines[0]) + values.update({ + parts[0]: OpenSPICEShared._to_python(parts[1]) + for parts in map(str.split, lines) + }) + return values + else: + raise ValueError + + ############################################## + + @property + def is_running(self): + return self._is_running + + ############################################## + + def clear_output(self): + self._stdout = [] + self._stderr = [] + self._error_in_stdout = False + self._error_in_stderr = False + + ############################################## + + @property + def stdout(self): + return os.linesep.join(self._stdout) + + @property + def stderr(self): + return os.linesep.join(self._stderr) + + ############################################## + + def exec_command(self, command, join_lines=True): + + """ Execute a command and return the output. """ + + # Ngspice API: ngSpice_Command + + # Prevent memory leaks by periodically freeing ngspice history of past commands + # Each command sent to ngspice is stored in the control structures + if self._number_of_exec_calls > self.NUMBER_OF_EXEC_CALLS_TO_RELEASE_MEMORY: + # Clear the internal control structures + self._ngspice_shared.ngSpice_Command(FFI.NULL) + self._number_of_exec_calls = 0 + self._number_of_exec_calls += 1 + + if len(command) > self.MAX_COMMAND_LENGTH: + raise ValueError('Command must not exceed {} characters'.format(self.MAX_COMMAND_LENGTH)) + + self._logger.debug('Execute command: {}'.format(command)) + + self.clear_output() + + encoded_command = command.encode('ascii') + rc = self._ngspice_shared.ngSpice_Command(encoded_command) + + if rc: # Fixme: when not 0 ??? + raise NameError("ngSpice_Command '{}' returned {}".format(command, rc)) + + if self._error_in_stdout or self._error_in_stderr: + raise OpenSPICECommandError("Command '{}' failed".format(command)) + + if join_lines: + return self.stdout + else: + return self._stdout + + ############################################## + + def _get_version(self): + + self._ngspice_version = None + self._has_xspice = False + self._has_cider = False + self._extensions = [] + + output = self.exec_command('version -f') + for line in output.split('\n'): + match = re.match(r'\*\* ngspice\-(\d+)', line) + if match is not None: + self._ngspice_version = int(match.group(1)) + # if '** XSPICE extensions included' in line: + if '** XSPICE' in line: + self._has_xspice = True + self._extensions.append('XSPICE') + # if '** CIDER 1.b1 (CODECS simulator) included' in line: + if 'CIDER' in line: + self._has_cider = True + self._extensions.append('CIDER') + + self._logger.debug( + 'Ngspice version %s with extensions: %s', + self._ngspice_version, + ', '.join(self._extensions), + ) + + ############################################## + + @property + def ngspice_version(self): + return self._ngspice_version + + @property + def has_xspice(self): + """Return True if libngspice was compiled with XSpice support.""" + return self._has_xspice + + @property + def has_cider(self): + """Return True if libngspice was compiled with CIDER support.""" + return self._has_cider + + ############################################## + + @property + def simulation_type(self): + return self._simulation_type + + def type_to_unit(self, vector_type): + return self._type_to_unit.get(vector_type, None) + + ############################################## + + def _alter(self, command, device, kwargs): + # Performance optimization: dispatch multiple alter commands jointly + device_name = device.lower() + commands = [] + commands_str_len = 0 + for key, value in kwargs.items(): + if isinstance(value, (list, tuple)): + value = '[ ' + ' '.join(value) + ' ]' + cmd = '{} {} {} = {}'.format(command, device_name, key, value) + # performance optimization: collect multiple alter commands and + # dispatch them jointly + commands.append(cmd) + commands_str_len += len(cmd) + if commands_str_len + len(commands) > self.MAX_COMMAND_LENGTH: + self.exec_command(';'.join(commands[:-1])) + commands = commands[-1:] + commands_str_len = len(commands[0]) + if commands: + self.exec_command(';'.join(commands)) + + ############################################## + + def alter_device(self, device, **kwargs): + """Alter device parameters""" + self._alter('alter', device, kwargs) + + ############################################## + + def alter_model(self, model, **kwargs): + """Alter model parameters""" + self._alter('altermod', model, kwargs) + + ############################################## + + def delete(self, debug_number): + """Remove a trace or breakpoint""" + self.exec_command('delete {}'.format(debug_number)) + + ############################################## + + def destroy(self, plot_name='all'): + """Release the memory holding the output data (the given plot or all plots) for the specified runs.""" + self.exec_command('destroy ' + plot_name) + + ############################################## + + def device_help(self, device): + """Shows the user information about the devices available in the simulator. """ + return self.exec_command('devhelp ' + device.lower()) + + ############################################## + + def save(self, vector): + self.exec_command('save ' + vector) + + ############################################## + + def _show(self, command): + lines = self.exec_command(command, join_lines=False) + if lines: + values = self._lines_to_dicts(lines) + return values + else: + return '' + + ############################################## + + def show(self, device): + return self._show('show ' + device.lower()) + + ############################################## + + def showmod(self, device): + return self._show('showmod ' + device.lower()) + + ############################################## + + def source(self, file_path): + """Read a ngspice input file""" + self.exec_command('source ' + file_path) + + ############################################## + + def option(self, **kwargs): + """Set any of the simulator variables.""" + for key, value in kwargs.items(): + self.exec_command('option {} = {}'.format(key, value)) + + ############################################## + + def quit(self): + self.set('noaskquit') + return self.exec_command('quit') + + ############################################## + + def remove_circuit(self): + """Removes the current circuit from the list of circuits sourced into ngspice.""" + self.exec_command('remcirc') + + ############################################## + + def reset(self): + """Throw out any intermediate data in the circuit (e.g, after a breakpoint or after one or more + analyses have been done already), and re-parse the input file. The circuit can then be + re-run from it’s initial state, overriding the affect of any set or alter commands. + + """ + self.exec_command('reset') + + ############################################## + + def ressource_usage(self, *ressources): + + """Print resource usage statistics. If any resources are given, just print the usage of that resource. + + Most resources require that a circuit be loaded. Currently valid resources are: + + * decklineno Number of lines in deck + * netloadtime Nelist loading time + * netparsetime Netlist parsing time + * elapsed The amount of time elapsed since the last rusage elapsed call. + * faults Number of page faults and context switches (BSD only). + * space Data space used. + * time CPU time used so far. + * temp Operating temperature. + * tnom Temperature at which device parameters were measured. + * equations Circuit Equations + * time Total Analysis Time + * totiter Total iterations + * accept Accepted time-points + * rejected Rejected time-points + * loadtime Time spent loading the circuit matrix and RHS. + * reordertime Matrix reordering time + * lutime L-U decomposition time + * solvetime Matrix solve time + * trantime Transient analysis time + * tranpoints Transient time-points + * traniter Transient iterations + * trancuriters Transient iterations for the last time point* + * tranlutime Transient L-U decomposition time + * transolvetime Transient matrix solve time + * everything All of the above. + """ + + if not ressources: + ressources = ['everything'] + + command = 'rusage ' + ' '.join(ressources) + lines = self.exec_command(command, join_lines=False) + values = {} + for line in lines: + if '=' in line: + parts = line.split(' = ') + else: + parts = line.split(': ') + values[parts[0]] = OpenSPICEShared._to_python(parts[1]) + return values + + ############################################## + + def set(self, *args, **kwargs): + """Set the value of variables""" + for key in args: + self.exec_command('set {}'.format(key)) + for key, value in kwargs.items(): + self.exec_command('option {} = {}'.format(key, value)) + + ############################################## + + def set_circuit(self, name): + """Change the current circuit""" + self.exec_command('setcirc {}'.format(name)) + + ############################################## + + def status(self): + """Display breakpoint information""" + return self.exec_command('status') + + ############################################## + + def step(self, number_of_steps=None): + """Run a fixed number of time-points""" + if number_of_steps is not None: + self.exec_command('step {}'.format(number_of_steps)) + else: + self.exec_command('step') + + ############################################## + + def stop(self, *args, **kwargs): + + """Set a breakpoint. + + Examples:: + + ngspice.stop('v(out) > 1', 'v(1) > 10', after=10) + + A when condition can use theses symbols: = <> > < >= <=. + + """ + + command = 'stop' + if 'after' in kwargs: + command += ' after {}'.format(kwargs['after']) + for condition in args: + command += ' when {}'.format(condition) + self.exec_command(command) + + ############################################## + + def trace(self, *args): + """Trace nodes""" + self.exec_command('trace ' + ' '.join(args)) + + ############################################## + + def unset(self, *args): + """Unset variables""" + for key in args: + self.exec_command('unset {}'.format(key)) + + ############################################## + + def where(self): + """Identify troublesome node or device""" + return self.exec_command('where') + + ############################################## + + def load_circuit(self, circuit): + + """Load the given circuit string.""" + + # Ngspice API: ngSpice_Circ + circuit_lines = [line for line in str(circuit).splitlines() if line] + self._logger.debug('ngSpice_Circ\n' + str(circuit)) + + # ngspice 33 requires an empty line at the end + circuit_lines.append("") + + circuit_lines_keepalive = [ffi.new("char[]", line.encode('utf8')) + for line in circuit_lines] + circuit_lines_keepalive += [FFI.NULL] + circuit_array = ffi.new("char *[]", circuit_lines_keepalive) + self.clear_output() + rc = self._ngspice_shared.ngSpice_Circ(circuit_array) + + if rc: # Fixme: when not 0 ??? + raise NameError("ngSpice_Circ returned {}".format(rc)) + + # Fixme: when Ngspice found an error in the circuit, it reports the error in stdout + # Fixme: https://sourceforge.net/p/ngspice/bugs/496/ + if self._error_in_stdout: + self._logger.error('\n' + self.stdout) + raise OpenSPICECircuitError('') + + # for line in circuit_lines: + # rc = self._ngspice_shared.ngSpice_Command(('circbyline ' + line).encode('utf8')) + # if rc: + # raise NameError("ngSpice_Command circbyline returned {}".format(rc)) + + ############################################## + + def listing(self): + command = 'listing' + return self.exec_command(command) + + ############################################## + + def run(self, background=False): + + """ Run the simulation. """ + + # in the background thread and wait until the simulation is done + + command = 'bg_run' if background else 'run' + self.exec_command(command) + + if background: + self._is_running = True + else: + self._logger.debug("Simulation is done") + + # time.sleep(.1) # required before to test if the simulation is running + # while (self._ngspice_shared.ngSpice_running()): + # time.sleep(.1) + # self._logger.debug("Simulation is done") + + ############################################## + + def halt(self): + """ Halt the simulation in the background thread. """ + self.exec_command('bg_halt') + + ############################################## + + def resume(self, background=True): + """ Halt the simulation in the background thread. """ + command = 'bg_resume' if background else 'resume' + self.exec_command(command) + + ############################################## + + @property + def plot_names(self): + """ Return the list of plot names. """ + # Ngspice API: ngSpice_AllPlots + return self._convert_string_array(self._ngspice_shared.ngSpice_AllPlots()) + + ############################################## + + @property + def last_plot(self): + """ Return the last plot name. """ + return self.plot_names[0] + + ############################################## + + @staticmethod + def _flags_to_str(flags): + + # enum dvec_flags { + # VF_REAL = (1 << 0), // The data is real. + # VF_COMPLEX = (1 << 1), // The data is complex. + # VF_ACCUM = (1 << 2), // writedata should save this vector. + # VF_PLOT = (1 << 3), // writedata should incrementally plot it. + # VF_PRINT = (1 << 4), // writedata should print this vector. + # VF_MINGIVEN = (1 << 5), // The v_minsignal value is valid. + # VF_MAXGIVEN = (1 << 6), // The v_maxsignal value is valid. + # VF_PERMANENT = (1 << 7) // Don't garbage collect this vector. + # }; + + if flags & 1: + return 'real' + elif flags & 2: + return 'complex' + else: + raise NotImplementedError + + ############################################## + + @staticmethod + def _vector_is_real(flags): + return flags & 1 + + ############################################## + + @staticmethod + def _vector_is_complex(flags): + return flags & 2 + + ############################################## + + def plot(self, simulation, plot_name): + + """ Return the corresponding plot. """ + + # Ngspice API: ngSpice_AllVecs ngGet_Vec_Info + + # plot_name is for example dc with an integer suffix which is increment for each run + + plot = Plot(simulation, plot_name) + all_vectors_c = self._ngspice_shared.ngSpice_AllVecs(plot_name.encode('utf8')) + i = 0 + while True: + if all_vectors_c[i] == FFI.NULL: + break + + vector_name = ffi_string_utf8(all_vectors_c[i]) + name = '.'.join((plot_name, vector_name)) + vector_info = self._ngspice_shared.ngGet_Vec_Info(name.encode('utf8')) + vector_type = self._simulation_type[vector_info.v_type] + length = vector_info.v_length + # template = 'vector[{}] {} type {} flags {} length {}' + # self._logger.debug(template.format( + # i, + # vector_name, + # vector_type, + # self._flags_to_str(vector_info.v_flags), + # length, + # )) + if vector_info.v_compdata == FFI.NULL: + # for k in range(length): + # print(" [{}] {}".format(k, vector_info.v_realdata[k])) + tmp_array = np.frombuffer(ffi.buffer(vector_info.v_realdata, length*8), dtype=np.float64) + array = np.array(tmp_array, dtype=tmp_array.dtype) # copy data + # import json + # with open(name + '.json', 'w') as fh: + # json.dump(list(array), fh) + else: + # for k in range(length): + # value = vector_info.v_compdata[k] + # print(ffi.addressof(value, field='cx_real'), ffi.addressof(value, field='cx_imag')) + # print(" [{}] {} + i {}".format(k, value.cx_real, value.cx_imag)) + tmp_array = np.frombuffer(ffi.buffer(vector_info.v_compdata, length*8*2), dtype=np.float64) + array = np.array(tmp_array[0::2], dtype=np.complex128) + array.imag = tmp_array[1::2] + plot[vector_name] = Vector(self, vector_name, vector_type, array) + + i += 1 + + return plot + +#################################################################################################### +# +# Platform setup +# + +OpenSPICEShared.setup_platform() diff --git a/PySpice/Spice/OpenSPICE/Simulation.py b/PySpice/Spice/OpenSPICE/Simulation.py new file mode 100644 index 00000000..44d945d8 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/Simulation.py @@ -0,0 +1,71 @@ +################################################################################################### +# +# PySpice - A Spice Package for Python +# Copyright (C) 2017 Fabrice Salvaire +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +#################################################################################################### + +"""This modules implements classes to perform simulations. +""" + +#################################################################################################### + +import logging + +#################################################################################################### + +from ..Simulation import CircuitSimulator +from .Server import OpenSPICEServer + +#################################################################################################### + +_module_logger = logging.getLogger(__name__) + +#################################################################################################### + +class OpenSPICECircuitSimulator(CircuitSimulator): + + _logger = _module_logger.getChild('OpenSPICECircuitSimulator') + + SIMULATOR = 'OpenSPICE' + + ############################################## + + def __init__(self, circuit, **kwargs): + + super().__init__(circuit, **kwargs) + self._OpenSPICE_server = OpenSPICEServer() + + ############################################## + + def str_options(self): + + return super().str_options(unit=False) + + ############################################## + + def _run(self, analysis_method, *args, **kwargs): + + super()._run(analysis_method, *args, **kwargs) + + raw_file = self._OpenSPICE_server(spice_input=str(self)) + self.reset_analysis() + raw_file.simulation = self + + # for field in raw_file.variables: + # print field + + return raw_file.to_analysis() diff --git a/PySpice/Spice/OpenSPICE/SimulationType.py b/PySpice/Spice/OpenSPICE/SimulationType.py new file mode 100644 index 00000000..fe07f41a --- /dev/null +++ b/PySpice/Spice/OpenSPICE/SimulationType.py @@ -0,0 +1,90 @@ +#################################################################################################### +# +# PySpice - A Spice Package for Python +# Copyright (C) 2014 Fabrice Salvaire +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +#################################################################################################### + +#################################################################################################### + +__all__ = [ + 'LAST_VERSION', + 'SIMULATION_TYPE', +] + +#################################################################################################### + +# For a new ngspice relase, we just have to check this file hasn't changed +# ngspice-xx/src/include/ngspice/sim.h + +SIMULATION_TYPE = {} + +SIMULATION_TYPE[26] = ( + 'no_type', + 'time', + 'frequency', + 'voltage', + 'current', + 'output_n_dens', + 'output_noise', + 'input_n_dens', + 'input_noise', + 'pole', + 'zero', + 's_parameter', + 'temperature', + 'res', + 'impedance', + 'admittance', + 'power', + 'phase', + 'db', + 'capacitance', + 'charge', +) + +SIMULATION_TYPE[27] = ( + 'no_type', + 'time', + 'frequency', + 'voltage', + 'current', + 'voltage_density', + 'current_density', + 'sqr_voltage_density', + 'sqr_current_density', + 'sqr_voltage', + 'sqr_current', + 'pole', + 'zero', + 's_parameter', + 'temperature', + 'res', + 'impedance', + 'admittance', + 'power', + 'phase', + 'db', + 'capacitance', + 'charge', +) + +LAST_VERSION = 34 # released on January 31st, 2021 + +for version in range(28, LAST_VERSION +1): + SIMULATION_TYPE[version] = SIMULATION_TYPE[27] + +SIMULATION_TYPE['last'] = SIMULATION_TYPE[LAST_VERSION] diff --git a/PySpice/Spice/OpenSPICE/__init__.py b/PySpice/Spice/OpenSPICE/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/PySpice/Spice/Simulation.py b/PySpice/Spice/Simulation.py index 54488bc5..f2d1b724 100644 --- a/PySpice/Spice/Simulation.py +++ b/PySpice/Spice/Simulation.py @@ -1162,6 +1162,9 @@ def factory(cls, circuit, *args, **kwargs): sub_cls = XyceCircuitSimulator if simulator == 'xyce-parallel': kwargs['parallel'] = True + elif simulator in {'OpenSPICE'}: + from .OpenSPICE.Simulation import OpenSPICECircuitSimulator + sub_cls = OpenSPICECircuitSimulator if sub_cls is not None: return sub_cls(circuit, *args, **kwargs) From 42f7e56ba8b849dba3c704964e6e2fcb3ee1d492 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 28 Dec 2021 10:27:21 -0800 Subject: [PATCH 010/115] First commit --- circuit.cir | 7 ++++++ yspice.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 circuit.cir create mode 100755 yspice.py diff --git a/circuit.cir b/circuit.cir new file mode 100644 index 00000000..b842741b --- /dev/null +++ b/circuit.cir @@ -0,0 +1,7 @@ +V1 1 0 1; +R1 1 2 1; +R2 2 0 1; +R3 2 3 1; +R4 3 4 1; +V2 4 0 1; +R5 3 0 1; diff --git a/yspice.py b/yspice.py new file mode 100755 index 00000000..bb3965ee --- /dev/null +++ b/yspice.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +from arpeggio import ZeroOrMore, EOF, ParserPython +from arpeggio import RegExMatch +import numpy +import sys + +# https://pypi.org/project/Arpeggio/1.0/ + +### Parsing Functions ### + +def root(): + return ZeroOrMore(element), EOF + +# TODO: check +def element(): + return el, node, node, val, RegExMatch(r';') + +def el(): + return RegExMatch(r'(R\d+)|(V\d+)') + +# Only # names +def node(): + return RegExMatch(r'\d+') + +# TODO: check +def val(): + return RegExMatch(r'\d*\.\d*|\d+') + +### Matrix Construction Functions ### + +def get_nodes(ptree): + nodes = [] + for l in ptree: + if str(l) != "": + l = str(l).replace("|", "").split() + if int(l[1]) not in nodes and int(l[1]) != 0: + nodes.append(int(l[1])) + if int(l[2]) not in nodes and int(l[2]) != 0: + nodes.append(int(l[2])) + nodes.sort() + # Don't allow user to skip node numbers + for i in range(len(nodes)-1): + assert nodes[i+1] - nodes[i] == 1 + return nodes + +if __name__ == "__main__": + parser = ParserPython(root) + with open(sys.argv[1], "r") as f: + parse_tree = parser.parse(f.read()) + nodes = get_nodes(parse_tree) + G_matrix = numpy.zeros([len(nodes), len(nodes)]) + for r in parse_tree: + _r = str(r).replace("|", "").split() + if _r != [] and _r[0][0] == "R": + if int(_r[1]) != 0 and int(_r[2]) != 0: + G_matrix[int(_r[1]) - 1][int(_r[2]) - 1] = -1.00 / float(_r[3]) + G_matrix[int(_r[2]) - 1][int(_r[1]) - 1] = -1.00 / float(_r[3]) + if int(_r[1]) != 0: + G_matrix[int(_r[1]) - 1][int(_r[1]) - 1] += 1.00 / float(_r[3]) + if int(_r[2]) != 0: + G_matrix[int(_r[2]) - 1][int(_r[2]) - 1] += 1.00 / float(_r[3]) + print(G_matrix) From c68bab55db52922175c41bf0fb975956183270ea Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 30 Dec 2021 10:53:01 -0800 Subject: [PATCH 011/115] Add matrix solving --- yspice.py | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/yspice.py b/yspice.py index bb3965ee..5fca8626 100755 --- a/yspice.py +++ b/yspice.py @@ -42,22 +42,49 @@ def get_nodes(ptree): # Don't allow user to skip node numbers for i in range(len(nodes)-1): assert nodes[i+1] - nodes[i] == 1 + # Don't allow user to start past node 1 + assert nodes[0] == 1 return nodes +def get_ind_v_srcs(ptree): + ind_v_srcs = [] + for l in ptree: + if str(l) != "": + l = str(l).replace("|", "").split() + if l[0][0] == "V": + ind_v_srcs.append(int(l[0][1:])) + ind_v_srcs.sort() + for i in range(len(ind_v_srcs)-1): + assert ind_v_srcs[i+1] - ind_v_srcs[i] == 1 + assert ind_v_srcs[0] == 1 + return ind_v_srcs + if __name__ == "__main__": parser = ParserPython(root) with open(sys.argv[1], "r") as f: parse_tree = parser.parse(f.read()) nodes = get_nodes(parse_tree) - G_matrix = numpy.zeros([len(nodes), len(nodes)]) + ind_v_srcs = get_ind_v_srcs(parse_tree) + A_matrix = numpy.zeros([len(nodes) + len(ind_v_srcs), len(nodes) + len(ind_v_srcs)]) + z_vector = numpy.zeros([len(nodes) + len(ind_v_srcs), 1]) for r in parse_tree: _r = str(r).replace("|", "").split() if _r != [] and _r[0][0] == "R": if int(_r[1]) != 0 and int(_r[2]) != 0: - G_matrix[int(_r[1]) - 1][int(_r[2]) - 1] = -1.00 / float(_r[3]) - G_matrix[int(_r[2]) - 1][int(_r[1]) - 1] = -1.00 / float(_r[3]) + A_matrix[int(_r[1]) - 1][int(_r[2]) - 1] = -1.00 / float(_r[3]) + A_matrix[int(_r[2]) - 1][int(_r[1]) - 1] = -1.00 / float(_r[3]) + if int(_r[1]) != 0: + A_matrix[int(_r[1]) - 1][int(_r[1]) - 1] += 1.00 / float(_r[3]) + if int(_r[2]) != 0: + A_matrix[int(_r[2]) - 1][int(_r[2]) - 1] += 1.00 / float(_r[3]) + elif _r != [] and _r[0][0] == "V": if int(_r[1]) != 0: - G_matrix[int(_r[1]) - 1][int(_r[1]) - 1] += 1.00 / float(_r[3]) + A_matrix[len(nodes) + int(_r[0][1:]) - 1][int(_r[1]) - 1] = 1.00 + A_matrix[int(_r[1]) - 1][len(nodes) + int(_r[0][1:]) - 1] = 1.00 if int(_r[2]) != 0: - G_matrix[int(_r[2]) - 1][int(_r[2]) - 1] += 1.00 / float(_r[3]) - print(G_matrix) + A_matrix[len(nodes) + int(_r[0][1:]) - 1][int(_r[2]) - 1] = -1.00 + A_matrix[int(_r[2]) - 1][len(nodes) + int(_r[0][1:]) - 1] = -1.00 + z_vector[len(nodes) + int(_r[0][1:]) - 1][0] = float(_r[3]) + soln = numpy.dot(numpy.linalg.inv(A_matrix), z_vector) + for i in range(len(nodes)): + print("Node {}: {} [V]".format(i, soln[i][0])) From 9969d8f5c1a572117e32eb3f52373d50fc873147 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 30 Dec 2021 10:53:18 -0800 Subject: [PATCH 012/115] Add a test circuit with independent current sources --- circuit2.cir | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 circuit2.cir diff --git a/circuit2.cir b/circuit2.cir new file mode 100644 index 00000000..5885f060 --- /dev/null +++ b/circuit2.cir @@ -0,0 +1,17 @@ +.title Lolcatz + +V1 1 0 1 +R1 1 2 1 +R2 2 3 1 +V2 3 4 1 +R3 4 0 1 +R4 2 5 1 +I1 0 5 1 +R5 2 0 1 + +.control + op + mdump +.endc + +.end From 7e0b3ace238ac630540ede658bccd32baad6d146 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 15 Mar 2022 18:27:21 -0700 Subject: [PATCH 013/115] Added inductors, capacitors, and independent current sources --- circuit.cir | 2 ++ yspice.py | 52 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/circuit.cir b/circuit.cir index b842741b..880be276 100644 --- a/circuit.cir +++ b/circuit.cir @@ -1,7 +1,9 @@ V1 1 0 1; R1 1 2 1; +L1 2 3 1; R2 2 0 1; R3 2 3 1; R4 3 4 1; +C1 3 4 1; V2 4 0 1; R5 3 0 1; diff --git a/yspice.py b/yspice.py index 5fca8626..d8a0a427 100755 --- a/yspice.py +++ b/yspice.py @@ -17,7 +17,7 @@ def element(): return el, node, node, val, RegExMatch(r';') def el(): - return RegExMatch(r'(R\d+)|(V\d+)') + return RegExMatch(r'(R\d+)|(V\d+)|(L\d+)|(C\d+)') # Only # names def node(): @@ -46,27 +46,50 @@ def get_nodes(ptree): assert nodes[0] == 1 return nodes -def get_ind_v_srcs(ptree): - ind_v_srcs = [] +def get_ind_srcs(ptree, voltage = True): + ind_srcs = [] for l in ptree: if str(l) != "": l = str(l).replace("|", "").split() - if l[0][0] == "V": - ind_v_srcs.append(int(l[0][1:])) - ind_v_srcs.sort() - for i in range(len(ind_v_srcs)-1): - assert ind_v_srcs[i+1] - ind_v_srcs[i] == 1 - assert ind_v_srcs[0] == 1 - return ind_v_srcs + if (l[0][0] == "V" and voltage) or (l[0][0] == "I" and not voltage): + ind_srcs.append(int(l[0][1:])) + ind_srcs.sort() + for i in range(len(ind_srcs)-1): + assert ind_srcs[i+1] - ind_srcs[i] == 1 + print("ind_srcs = {}, len(ind_srcs) = {}".format(ind_srcs, len(ind_srcs))) + if len(ind_srcs) != 0: + assert ind_srcs[0] == 1 + return ind_srcs + +def lc_filter(ptree): + # Inductors are considered independent sources of voltage 0 + # Capacitors are considered independent sources of current 0 + for l in ptree: + if str(l) != "": + if str(l).replace("|", "").split()[0][0] == "L": + global num_vsrcs + num_vsrcs += 1 + l[0] = "V{}".format(num_vsrcs) + l[3] = "0" + elif str(l).replace("|", "").split()[0][0] == "C": + global num_isrcs + num_isrcs += 1 + l[0] = "I{}".format(num_isrcs) + l[3] = "0" if __name__ == "__main__": parser = ParserPython(root) with open(sys.argv[1], "r") as f: parse_tree = parser.parse(f.read()) nodes = get_nodes(parse_tree) - ind_v_srcs = get_ind_v_srcs(parse_tree) - A_matrix = numpy.zeros([len(nodes) + len(ind_v_srcs), len(nodes) + len(ind_v_srcs)]) - z_vector = numpy.zeros([len(nodes) + len(ind_v_srcs), 1]) + ind_v_srcs = get_ind_srcs(parse_tree) + ind_i_srcs = get_ind_srcs(parse_tree, voltage = False) + global num_vsrcs, num_isrcs + num_vsrcs = len(ind_v_srcs) + num_isrcs = len(ind_i_srcs) + lc_filter(parse_tree) + A_matrix = numpy.zeros([len(nodes) + num_vsrcs, len(nodes) + num_vsrcs]) + z_vector = numpy.zeros([len(nodes) + num_vsrcs, 1]) for r in parse_tree: _r = str(r).replace("|", "").split() if _r != [] and _r[0][0] == "R": @@ -85,6 +108,9 @@ def get_ind_v_srcs(ptree): A_matrix[len(nodes) + int(_r[0][1:]) - 1][int(_r[2]) - 1] = -1.00 A_matrix[int(_r[2]) - 1][len(nodes) + int(_r[0][1:]) - 1] = -1.00 z_vector[len(nodes) + int(_r[0][1:]) - 1][0] = float(_r[3]) + elif _r != [] and _r[0][0] == "I": + z_vector[int(_r[1])][0] -= float(_r[3]) + z_vector[int(_r[2])][0] += float(_r[3]) soln = numpy.dot(numpy.linalg.inv(A_matrix), z_vector) for i in range(len(nodes)): print("Node {}: {} [V]".format(i, soln[i][0])) From 422a21bd3d50c2e5306a31bcccbe162372381c52 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 15 Mar 2022 18:57:22 -0700 Subject: [PATCH 014/115] Make solver more efficient --- yspice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yspice.py b/yspice.py index d8a0a427..95f7c6c0 100755 --- a/yspice.py +++ b/yspice.py @@ -111,6 +111,6 @@ def lc_filter(ptree): elif _r != [] and _r[0][0] == "I": z_vector[int(_r[1])][0] -= float(_r[3]) z_vector[int(_r[2])][0] += float(_r[3]) - soln = numpy.dot(numpy.linalg.inv(A_matrix), z_vector) + soln = numpy.linalg.solve(A_matrix, z_vector) for i in range(len(nodes)): print("Node {}: {} [V]".format(i, soln[i][0])) From 399d588bdf2b9d27256ef2f9992798c40656139d Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Wed, 16 Mar 2022 16:37:19 -0700 Subject: [PATCH 015/115] Intro behavioral source. Root eval implementation --- eval_roots.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 eval_roots.py diff --git a/eval_roots.py b/eval_roots.py new file mode 100755 index 00000000..ef37632d --- /dev/null +++ b/eval_roots.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + +import scipy.optimize + +def roots_from_txt(behav_txt): + return scipy.optimize.root(eval("lambda x : " + behav_txt), [0.0], method = 'lm').x[0] + +if __name__ == "__main__": + print(roots_from_txt("(x[0] ** 2.0) - 1")) From dead93eafc08555a2861dd23c450f0f4d75263d5 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Wed, 16 Mar 2022 18:06:24 -0700 Subject: [PATCH 016/115] Added highly nonlinear, generic, simple solver. Still has bugs --- noodle.py | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100755 noodle.py diff --git a/noodle.py b/noodle.py new file mode 100755 index 00000000..57373a1d --- /dev/null +++ b/noodle.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 + +from arpeggio import ZeroOrMore, EOF, ParserPython +from arpeggio import RegExMatch +import numpy +import sys +import scipy.optimize + +# https://pypi.org/project/Arpeggio/1.0/ + +### Parsing Functions ### + +def root(): + return ZeroOrMore(element), EOF + +# TODO: check +def element(): + return el, node, node, val, RegExMatch(r';') + +def el(): + return RegExMatch(r'(R\d+)|(V\d+)|(L\d+)|(C\d+)') + +# Only # names +def node(): + return RegExMatch(r'\d+') + +# TODO: check +def val(): + return RegExMatch(r'\d*\.\d*|\d+') + +### Matrix Construction Functions ### + +def get_nodes(ptree): + nodes = [] + for l in ptree: + if str(l) != "": + l = str(l).replace("|", "").split() + if int(l[1]) not in nodes and int(l[1]) != 0: + nodes.append(int(l[1])) + if int(l[2]) not in nodes and int(l[2]) != 0: + nodes.append(int(l[2])) + nodes.sort() + # Don't allow user to skip node numbers + for i in range(len(nodes)-1): + assert nodes[i+1] - nodes[i] == 1 + # Don't allow user to start past node 1 + assert nodes[0] == 1 + return nodes + +def get_ind_srcs(ptree, voltage = True): + ind_srcs = [] + for l in ptree: + if str(l) != "": + l = str(l).replace("|", "").split() + if (l[0][0] == "V" and voltage) or (l[0][0] == "I" and not voltage): + ind_srcs.append(int(l[0][1:])) + ind_srcs.sort() + for i in range(len(ind_srcs)-1): + assert ind_srcs[i+1] - ind_srcs[i] == 1 + print("ind_srcs = {}, len(ind_srcs) = {}".format(ind_srcs, len(ind_srcs))) + if len(ind_srcs) != 0: + assert ind_srcs[0] == 1 + return ind_srcs + +def lc_filter(ptree): + # Inductors are considered independent sources of voltage 0 + # Capacitors are considered independent sources of current 0 + for l in ptree: + if str(l) != "": + if str(l).replace("|", "").split()[0][0] == "L": + global num_vsrcs + num_vsrcs += 1 + l[0] = "V{}".format(num_vsrcs) + l[3] = "0" + elif str(l).replace("|", "").split()[0][0] == "C": + global num_isrcs + num_isrcs += 1 + l[0] = "I{}".format(num_isrcs) + l[3] = "0" + +# Calculating functions + +def resistance(vnode_A, vnode_B, ibranch): + return (vnode_A - vnode_B) / ibranch + +def gen_passive_eqn(ptree_node, line_idx): + return lambda x : (eval(_r[3])) - resistance(x[int(_r[1])], x[int(_r[2])], x[num_nodes + line_idx]) + +def gen_vsrc_eqn(ptree_node, line_idx): + return lambda x : (eval(_r[3])) - (x[int(_r[1])] - x[int(_r[2])]) + +def gen_isrc_eqn(ptree_node, line_idx): + return lambda x : (eval(_r[3])) - x[num_nodes + line_idx] + +if __name__ == "__main__": + parser = ParserPython(root) + with open(sys.argv[1], "r") as f: + parse_tree = parser.parse(f.read()) + nodes = get_nodes(parse_tree) + ind_v_srcs = get_ind_srcs(parse_tree) + ind_i_srcs = get_ind_srcs(parse_tree, voltage = False) + global num_vsrcs, num_isrcs, num_nodes + num_vsrcs = len(ind_v_srcs) + num_isrcs = len(ind_i_srcs) + num_nodes = len(nodes) + lc_filter(parse_tree) + line_idx = 0 + lambda_array = [] + for r in parse_tree: + _r = str(r).replace("|", "").split() + if _r != [] and _r[0][0] == "R": + lambda_array.append(gen_passive_eqn(_r, line_idx)) + elif _r != [] and _r[0][0] == "V": + lambda_array.append(gen_vsrc_eqn(_r, line_idx)) + elif _r != [] and _r[0][0] == "I": + lambda_array.append(gen_isrc_eqn(_r, line_idx)) + if _r != []: + line_idx += 1 + top_lambda = lambda x : map(lambda y : y(x), lambda_array) + print("len(lambda_array) = {}, len(x[0]) = {} ({})".format(len(lambda_array), len(numpy.zeros(num_nodes + line_idx)), num_nodes + line_idx)) + print(scipy.optimize.root(top_lambda, numpy.zeros(num_nodes + line_idx))) From 8907403fbdcf883226db336053c8f255c4a9d94b Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 17 Mar 2022 13:57:25 -0700 Subject: [PATCH 017/115] noodle terminates. Still need to fix mismatches with yspice --- noodle.py | 47 ++++++++++++++++++++++++++++++++++++----------- yspice.py | 3 +-- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/noodle.py b/noodle.py index 57373a1d..ba594afb 100755 --- a/noodle.py +++ b/noodle.py @@ -35,16 +35,16 @@ def get_nodes(ptree): for l in ptree: if str(l) != "": l = str(l).replace("|", "").split() - if int(l[1]) not in nodes and int(l[1]) != 0: + if int(l[1]) not in nodes: nodes.append(int(l[1])) - if int(l[2]) not in nodes and int(l[2]) != 0: + if int(l[2]) not in nodes: nodes.append(int(l[2])) nodes.sort() # Don't allow user to skip node numbers for i in range(len(nodes)-1): assert nodes[i+1] - nodes[i] == 1 # Don't allow user to start past node 1 - assert nodes[0] == 1 + assert nodes[0] == 0 return nodes def get_ind_srcs(ptree, voltage = True): @@ -57,7 +57,6 @@ def get_ind_srcs(ptree, voltage = True): ind_srcs.sort() for i in range(len(ind_srcs)-1): assert ind_srcs[i+1] - ind_srcs[i] == 1 - print("ind_srcs = {}, len(ind_srcs) = {}".format(ind_srcs, len(ind_srcs))) if len(ind_srcs) != 0: assert ind_srcs[0] == 1 return ind_srcs @@ -84,13 +83,40 @@ def resistance(vnode_A, vnode_B, ibranch): return (vnode_A - vnode_B) / ibranch def gen_passive_eqn(ptree_node, line_idx): - return lambda x : (eval(_r[3])) - resistance(x[int(_r[1])], x[int(_r[2])], x[num_nodes + line_idx]) + fn_str = "({}) - resistance(x[{}], x[{}], x[{}])".format(ptree_node[3], ptree_node[1], ptree_node[2], num_nodes + line_idx) + return lambda x : (eval(ptree_node[3])) - resistance(x[int(ptree_node[1])], x[int(ptree_node[2])], x[num_nodes + line_idx]) def gen_vsrc_eqn(ptree_node, line_idx): - return lambda x : (eval(_r[3])) - (x[int(_r[1])] - x[int(_r[2])]) + fn_str = "({}) - (x[{}] - x[{}])".format(ptree_node[3], ptree_node[1], ptree_node[2]) + return lambda x : (eval(ptree_node[3])) - (x[int(ptree_node[1])] - x[int(ptree_node[2])]) def gen_isrc_eqn(ptree_node, line_idx): - return lambda x : (eval(_r[3])) - x[num_nodes + line_idx] + fn_str = "({}) - x[{}]".format(ptree_node[3], num_nodes + line_idx) + return lambda x : (eval(ptree_node[3])) - x[num_nodes + line_idx] + +def top_lambda(x): + y_array = [] + global num_nodes, line_idx, lambda_array + for _l in lambda_array: + y_array.append(_l(x)) + if len(y_array) < num_nodes + line_idx: + y_array += [0.0] * (num_nodes + line_idx - len(y_array)) + return y_array + +def solve(top_lambda): + global num_nodes, line_idx + x = scipy.optimize.root(top_lambda, numpy.ones(num_nodes + line_idx)).x + for i in range(1, num_nodes): + x[i] -= x[0] + x[0] = 0.0 + return x + +def fmt_soln(x): + global num_nodes, line_idx + for n in range(num_nodes): + print("V{} = {} [V]".format(n, x[n])) + for l in range(line_idx): + print("I{} = {} [A]".format(l, x[num_nodes + l])) if __name__ == "__main__": parser = ParserPython(root) @@ -99,12 +125,13 @@ def gen_isrc_eqn(ptree_node, line_idx): nodes = get_nodes(parse_tree) ind_v_srcs = get_ind_srcs(parse_tree) ind_i_srcs = get_ind_srcs(parse_tree, voltage = False) - global num_vsrcs, num_isrcs, num_nodes + global num_vsrcs, num_isrcs, num_nodes, line_idx num_vsrcs = len(ind_v_srcs) num_isrcs = len(ind_i_srcs) num_nodes = len(nodes) lc_filter(parse_tree) line_idx = 0 + global lambda_array lambda_array = [] for r in parse_tree: _r = str(r).replace("|", "").split() @@ -116,6 +143,4 @@ def gen_isrc_eqn(ptree_node, line_idx): lambda_array.append(gen_isrc_eqn(_r, line_idx)) if _r != []: line_idx += 1 - top_lambda = lambda x : map(lambda y : y(x), lambda_array) - print("len(lambda_array) = {}, len(x[0]) = {} ({})".format(len(lambda_array), len(numpy.zeros(num_nodes + line_idx)), num_nodes + line_idx)) - print(scipy.optimize.root(top_lambda, numpy.zeros(num_nodes + line_idx))) + fmt_soln(solve(top_lambda)) diff --git a/yspice.py b/yspice.py index 95f7c6c0..fdda3b69 100755 --- a/yspice.py +++ b/yspice.py @@ -56,7 +56,6 @@ def get_ind_srcs(ptree, voltage = True): ind_srcs.sort() for i in range(len(ind_srcs)-1): assert ind_srcs[i+1] - ind_srcs[i] == 1 - print("ind_srcs = {}, len(ind_srcs) = {}".format(ind_srcs, len(ind_srcs))) if len(ind_srcs) != 0: assert ind_srcs[0] == 1 return ind_srcs @@ -113,4 +112,4 @@ def lc_filter(ptree): z_vector[int(_r[2])][0] += float(_r[3]) soln = numpy.linalg.solve(A_matrix, z_vector) for i in range(len(nodes)): - print("Node {}: {} [V]".format(i, soln[i][0])) + print("Node {}: {} [V]".format(i + 1, soln[i][0])) From 78e5053a1b855f54000a1122946affa0ee6bf99e Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 17 Mar 2022 18:23:38 -0700 Subject: [PATCH 018/115] Really trying here. Getting values that at least aren't ludicrous --- noodle.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/noodle.py b/noodle.py index ba594afb..66e761e3 100755 --- a/noodle.py +++ b/noodle.py @@ -32,6 +32,7 @@ def val(): def get_nodes(ptree): nodes = [] + num_lines = 0 for l in ptree: if str(l) != "": l = str(l).replace("|", "").split() @@ -39,13 +40,14 @@ def get_nodes(ptree): nodes.append(int(l[1])) if int(l[2]) not in nodes: nodes.append(int(l[2])) + num_lines += 1 nodes.sort() # Don't allow user to skip node numbers for i in range(len(nodes)-1): assert nodes[i+1] - nodes[i] == 1 # Don't allow user to start past node 1 assert nodes[0] == 0 - return nodes + return nodes,num_lines def get_ind_srcs(ptree, voltage = True): ind_srcs = [] @@ -99,13 +101,18 @@ def top_lambda(x): global num_nodes, line_idx, lambda_array for _l in lambda_array: y_array.append(_l(x)) + assert len(y_array) <= num_nodes + line_idx if len(y_array) < num_nodes + line_idx: y_array += [0.0] * (num_nodes + line_idx - len(y_array)) return y_array +def kcl_prepend(s, branch_idx, plus): + global num_nodes + return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx) + s + def solve(top_lambda): global num_nodes, line_idx - x = scipy.optimize.root(top_lambda, numpy.ones(num_nodes + line_idx)).x + x = scipy.optimize.root(top_lambda, numpy.random.rand(num_nodes + line_idx), method='lm', options = {'xtol' : 1e-9, 'maxiter' : int(1e7)}).x for i in range(1, num_nodes): x[i] -= x[0] x[0] = 0.0 @@ -113,8 +120,11 @@ def solve(top_lambda): def fmt_soln(x): global num_nodes, line_idx + # Ignore ground + # for n in range(1, num_nodes): for n in range(num_nodes): print("V{} = {} [V]".format(n, x[n])) + # TODO: Current correctness is not guaranteed for l in range(line_idx): print("I{} = {} [A]".format(l, x[num_nodes + l])) @@ -122,7 +132,7 @@ def fmt_soln(x): parser = ParserPython(root) with open(sys.argv[1], "r") as f: parse_tree = parser.parse(f.read()) - nodes = get_nodes(parse_tree) + nodes, num_lines = get_nodes(parse_tree) ind_v_srcs = get_ind_srcs(parse_tree) ind_i_srcs = get_ind_srcs(parse_tree, voltage = False) global num_vsrcs, num_isrcs, num_nodes, line_idx @@ -133,6 +143,8 @@ def fmt_soln(x): line_idx = 0 global lambda_array lambda_array = [] + kcl = [""] * (num_nodes - 1) + pwr_cons = "" for r in parse_tree: _r = str(r).replace("|", "").split() if _r != [] and _r[0][0] == "R": @@ -141,6 +153,16 @@ def fmt_soln(x): lambda_array.append(gen_vsrc_eqn(_r, line_idx)) elif _r != [] and _r[0][0] == "I": lambda_array.append(gen_isrc_eqn(_r, line_idx)) + # Must follow this current direction convention. Otherwise, current sources + # break. if _r != []: + pwr_cons += "+((x[{}])*(x[{}] - x[{}]))".format(num_nodes + line_idx, _r[1], _r[2]) + if int(_r[1]) != 0: + kcl[int(_r[1]) - 1] = kcl_prepend(kcl[int(_r[1]) - 1], line_idx, False) + if int(_r[2]) != 0: + kcl[int(_r[2]) - 1] = kcl_prepend(kcl[int(_r[2]) - 1], line_idx, True) line_idx += 1 + lambda_array += [lambda x : eval(eqn) for eqn in kcl] + lambda_array.append(lambda x : eval(pwr_cons)) + assert num_lines == line_idx fmt_soln(solve(top_lambda)) From 1641d06a0b83b8ecbb40b1fe9ab13df1bb9f787b Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 17 Mar 2022 18:23:45 -0700 Subject: [PATCH 019/115] Added comparison test --- cmp_test.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 cmp_test.sh diff --git a/cmp_test.sh b/cmp_test.sh new file mode 100755 index 00000000..dee5a40f --- /dev/null +++ b/cmp_test.sh @@ -0,0 +1,5 @@ +cat circuit.cir +echo " " +./noodle.py circuit.cir +echo " " +./yspice.py circuit.cir From e71ea325675fc1cc9e8416e3fc75fb1ea5c42f28 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 19 Mar 2022 18:13:46 -0700 Subject: [PATCH 020/115] Broyden's method solver works! --- circuit3.cir | 3 +++ noodle.py | 66 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 circuit3.cir diff --git a/circuit3.cir b/circuit3.cir new file mode 100644 index 00000000..4757c4b4 --- /dev/null +++ b/circuit3.cir @@ -0,0 +1,3 @@ +V1 1 0 1; +R1 1 2 1; +R2 2 0 1; diff --git a/noodle.py b/noodle.py index 66e761e3..8a6c809d 100755 --- a/noodle.py +++ b/noodle.py @@ -81,52 +81,56 @@ def lc_filter(ptree): # Calculating functions -def resistance(vnode_A, vnode_B, ibranch): - return (vnode_A - vnode_B) / ibranch - def gen_passive_eqn(ptree_node, line_idx): - fn_str = "({}) - resistance(x[{}], x[{}], x[{}])".format(ptree_node[3], ptree_node[1], ptree_node[2], num_nodes + line_idx) - return lambda x : (eval(ptree_node[3])) - resistance(x[int(ptree_node[1])], x[int(ptree_node[2])], x[num_nodes + line_idx]) + # f = lambda x : (x[num_nodes + line_idx - 1] * (eval(ptree_node[3]))) - ((x[int(ptree_node[1])-1] if int(ptree_node[1]) != 0 else 0.0) - \ + # (x[int(ptree_node[2])-1] if int(ptree_node[2]) != 0 else 0.0)) + s = "(x[{}] * ({})) - (({}) - ({}))".format(num_nodes + line_idx - 1, ptree_node[3], + "x[" + str(int(ptree_node[1])-1) + "]" if int(ptree_node[1]) != 0 else 0.0, + "x[" + str(int(ptree_node[2])-1) + "]" if int(ptree_node[2]) != 0 else 0.0) + return s def gen_vsrc_eqn(ptree_node, line_idx): - fn_str = "({}) - (x[{}] - x[{}])".format(ptree_node[3], ptree_node[1], ptree_node[2]) - return lambda x : (eval(ptree_node[3])) - (x[int(ptree_node[1])] - x[int(ptree_node[2])]) + # f = lambda x : (eval(ptree_node[3])) - ((x[int(ptree_node[1])-1] if int(ptree_node[1]) != 0 else 0.0) - \ + # (x[int(ptree_node[2])-1] if int(ptree_node[2]) != 0 else 0.0)) + s = "({}) - (({}) - ({}))".format(ptree_node[3], + "x[" + str(int(ptree_node[1])-1) + "]" if int(ptree_node[1]) != 0 else 0.0, + "x[" + str(int(ptree_node[2])-1) + "]" if int(ptree_node[2]) != 0 else 0.0) + return s def gen_isrc_eqn(ptree_node, line_idx): - fn_str = "({}) - x[{}]".format(ptree_node[3], num_nodes + line_idx) - return lambda x : (eval(ptree_node[3])) - x[num_nodes + line_idx] + # f = lambda x : (eval(ptree_node[3])) - x[num_nodes + line_idx - 1] + s = "({}) - x[{}]".format(ptree_node[3], num_nodes + line_idx - 1) + return s +global iteration +iteration = 0 def top_lambda(x): y_array = [] global num_nodes, line_idx, lambda_array for _l in lambda_array: y_array.append(_l(x)) - assert len(y_array) <= num_nodes + line_idx - if len(y_array) < num_nodes + line_idx: - y_array += [0.0] * (num_nodes + line_idx - len(y_array)) + assert len(y_array) == num_nodes + line_idx - 1 + # global iteration + # print("iter {} = {}".format(iteration, y_array)) + # iteration += 1 return y_array def kcl_prepend(s, branch_idx, plus): global num_nodes - return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx) + s + return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx - 1) + s def solve(top_lambda): global num_nodes, line_idx - x = scipy.optimize.root(top_lambda, numpy.random.rand(num_nodes + line_idx), method='lm', options = {'xtol' : 1e-9, 'maxiter' : int(1e7)}).x - for i in range(1, num_nodes): - x[i] -= x[0] - x[0] = 0.0 + x = scipy.optimize.root(top_lambda, numpy.ones(num_nodes + line_idx - 1), method='broyden1').x return x def fmt_soln(x): global num_nodes, line_idx - # Ignore ground - # for n in range(1, num_nodes): - for n in range(num_nodes): - print("V{} = {} [V]".format(n, x[n])) + for n in range(num_nodes - 1): + print("V{} = {} [V]".format(n + 1, x[n])) # TODO: Current correctness is not guaranteed for l in range(line_idx): - print("I{} = {} [A]".format(l, x[num_nodes + l])) + print("I{} = {} [A]".format(l, x[num_nodes + l - 1])) if __name__ == "__main__": parser = ParserPython(root) @@ -144,7 +148,6 @@ def fmt_soln(x): global lambda_array lambda_array = [] kcl = [""] * (num_nodes - 1) - pwr_cons = "" for r in parse_tree: _r = str(r).replace("|", "").split() if _r != [] and _r[0][0] == "R": @@ -156,13 +159,22 @@ def fmt_soln(x): # Must follow this current direction convention. Otherwise, current sources # break. if _r != []: - pwr_cons += "+((x[{}])*(x[{}] - x[{}]))".format(num_nodes + line_idx, _r[1], _r[2]) if int(_r[1]) != 0: kcl[int(_r[1]) - 1] = kcl_prepend(kcl[int(_r[1]) - 1], line_idx, False) if int(_r[2]) != 0: kcl[int(_r[2]) - 1] = kcl_prepend(kcl[int(_r[2]) - 1], line_idx, True) line_idx += 1 - lambda_array += [lambda x : eval(eqn) for eqn in kcl] - lambda_array.append(lambda x : eval(pwr_cons)) + lambda_array += kcl assert num_lines == line_idx - fmt_soln(solve(top_lambda)) + l_fn_str = "[" + ",".join(lambda_array) + "]" + l_fn = lambda x : eval(l_fn_str) + soln = solve(l_fn) + fmt_soln(soln) + ### + # print("KCL") + # for _k in kcl: + # print(_k) + ### + # lambda_array += [lambda x : eval(eqn) for eqn in kcl] + # top_lambda = lambda x : [l(x) for l in lambda_array] + # fmt_soln(solve(top_lambda)) From 5962c34ffe405cbe8c35b1bb8c99d852d814b681 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sun, 20 Mar 2022 16:33:14 -0700 Subject: [PATCH 021/115] Limit function in OpenSPICE --- OpenSPICE.py | 29 +++++++++++++++++++++++++++++ circuit4.cir | 12 ++++++++++++ 2 files changed, 41 insertions(+) create mode 100755 OpenSPICE.py create mode 100644 circuit4.cir diff --git a/OpenSPICE.py b/OpenSPICE.py new file mode 100755 index 00000000..19c26848 --- /dev/null +++ b/OpenSPICE.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +from sympy import * + +# Foundational functions + +# Take limit of expression t -> inf +def inflim(expr, dt): + t = symbols('t') + return limit(eval(expr.replace('dt', str(dt))), t, oo, '+') + +# Take array of expressions and initial condition expressions +# and solve op point. + +# Op point +# 1) Substitute constant dt and t -> inf. +# 2) Use Broyden's to solve at a single timestep + +# Transient sim +# 1) Create initial condition equations and calculate +# 2) Set x[0] to initial condition +# 3) Loop. Update t on each timestep. + +if __name__ == "__main__": + dt = 0.1 + print("--- Begin: limit test suite ---") + assert inflim('exp(-t)', dt) == 0.00 + assert inflim('exp(-t+dt)', dt) == 0.00 + assert inflim('exp(-t)*dt', dt) == 0.00 + print("--- End: limit test suite ---") diff --git a/circuit4.cir b/circuit4.cir new file mode 100644 index 00000000..46070e15 --- /dev/null +++ b/circuit4.cir @@ -0,0 +1,12 @@ +V1 1 0 "x[t+dt][0]-1" +R1 1 2 "(x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00)" +L1 2 3 "((x[t+dt][1]-x[t+dt][2])*dt) - 1.00*(x[t+dt][6]-x[t][6])" +R2 2 0 "(x[t+dt][1]-0.00)-(x[t+dt][7]*1.00)" +R3 2 3 "(x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00)" +R4 3 4 "(x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00)" +C1 3 4 "(x[t+dt][10]*dt)-(1.00*(x[t+dt][2]-x[t+dt][3]))" +V2 4 0 "x[t+dt][3]-1" +R5 3 0 "(x[t+dt][2]-0.00)-(x[t+dt][12]*1.00)" + +*** x -> dictionary mapping timestep to vector of currents and voltages +*** TODO: initial conditions From acfe5f752c8769af2bd93a67956e9c59c488e7eb Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 15:18:20 -0700 Subject: [PATCH 022/115] OpenSPICE about 200x slower. Time to start optimizing --- OpenSPICE.py | 92 +++++++++++++++++++++++++++++++++++++++++++++++----- circuit4.cir | 7 ++-- circuit5.cir | 17 ++++++++++ cmp_test.py | 16 +++++++++ 4 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 circuit5.cir create mode 100755 cmp_test.py diff --git a/OpenSPICE.py b/OpenSPICE.py index 19c26848..f9c8db1b 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -1,12 +1,76 @@ #!/usr/bin/env python3 -from sympy import * +import numpy +import re +import scipy.optimize +import sys +import sympy + +# TODO x -> dictionary mapping timestep to vector of currents and voltages +# TODO initial conditions # Foundational functions # Take limit of expression t -> inf def inflim(expr, dt): - t = symbols('t') - return limit(eval(expr.replace('dt', str(dt))), t, oo, '+') + return expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') + +# process netlist expressions with function f +def process_netlist_expr(lines, f, dt): + for i in range(len(lines)): + lines[i][3] = f(lines[i][3], dt) + if len(lines[i]) == 5: + lines[i][4] = f(lines[i][4], dt) + return lines + +def get_nodes(lines): + nodes = [] + for l in lines: + if int(l[1]) not in nodes: + nodes.append(int(l[1])) + if int(l[2]) not in nodes: + nodes.append(int(l[2])) + nodes.sort() + for i in range(len(nodes)-1): + assert nodes[i+1] - nodes[i] == 1 + assert nodes[0] == 0 + return nodes + +def kcl_prepend(s, num_nodes, branch_idx, plus): + return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx - 1) + s + +def get_kcl_eqns(lines): + nodes = get_nodes(lines) + assert nodes[0] == 0 + num_nodes = len(nodes) + num_branches = len(lines) + kcl = [""] * (num_nodes - 1) + for i in range(len(lines)): + if lines[i][1] != "0": + kcl[int(lines[i][1])-1] = kcl_prepend(kcl[int(lines[i][1])-1], num_nodes, i, False) + if lines[i][2] != "0": + kcl[int(lines[i][2])-1] = kcl_prepend(kcl[int(lines[i][2])-1], num_nodes, i, True) + return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] + +def solve(fn, output_len): + return scipy.optimize.root(fn, numpy.ones(output_len), method='broyden1').x + +def fmt_soln(x, num_nodes, num_branches): + for n in range(num_nodes - 1): + print("V{} = {} [V]".format(n + 1, x[n])) + for b in range(num_branches): + print("I{} = {} [A]".format(b, x[num_nodes + b - 1])) + +def make_simple(fn_str, x_len): + for i in range(x_len - 1, -1, -1): + exec("x_{} = sympy.symbols('x_{}')".format(i, i)) + fn_str = fn_str.replace("x[{}]".format(i), "(x_{})".format(i)) + fn_str_arr = eval(fn_str) + for i in range(len(fn_str_arr)): + fn_str_arr[i] = sympy.simplify(fn_str_arr[i]) + fn_str = str(fn_str_arr) + for i in range(x_len - 1, -1, -1): + fn_str = fn_str.replace("x_{}".format(i), "x[{}]".format(i)) + return fn_str # Take array of expressions and initial condition expressions # and solve op point. @@ -14,6 +78,19 @@ def inflim(expr, dt): # Op point # 1) Substitute constant dt and t -> inf. # 2) Use Broyden's to solve at a single timestep +def op_pt(netlist): + dt = 1.0 + lines = [n.split(" ") for n in netlist.split("\n") if n != ""] + lines = process_netlist_expr(lines, inflim, dt) + # Note: Replace len(l) - 1 with 3 for transient nextstep function + l_arr = [l[len(l)-1] for l in lines] + iv_relations = l_arr + [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) + l_fn_str = "[" + ",".join([eval(s.replace('dt', str(dt))) for s in iv_relations + kcl_relations]) + "]" + l_fn_str = make_simple(l_fn_str, len(iv_relations) + len(kcl_relations)) + l_fn = lambda x : eval(l_fn_str) + soln = solve(l_fn, len(iv_relations) + len(kcl_relations)) + return [soln,num_nodes,num_branches] # Transient sim # 1) Create initial condition equations and calculate @@ -21,9 +98,6 @@ def inflim(expr, dt): # 3) Loop. Update t on each timestep. if __name__ == "__main__": - dt = 0.1 - print("--- Begin: limit test suite ---") - assert inflim('exp(-t)', dt) == 0.00 - assert inflim('exp(-t+dt)', dt) == 0.00 - assert inflim('exp(-t)*dt', dt) == 0.00 - print("--- End: limit test suite ---") + with open(sys.argv[1], "r") as txt: + [soln,n_nodes,n_branches] = op_pt(txt.read()) + # fmt_soln(soln, n_nodes, n_branches) diff --git a/circuit4.cir b/circuit4.cir index 46070e15..19b21631 100644 --- a/circuit4.cir +++ b/circuit4.cir @@ -1,12 +1,9 @@ V1 1 0 "x[t+dt][0]-1" R1 1 2 "(x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00)" -L1 2 3 "((x[t+dt][1]-x[t+dt][2])*dt) - 1.00*(x[t+dt][6]-x[t][6])" +L1 2 3 "((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6])" "x[t][1]-x[t][2]" R2 2 0 "(x[t+dt][1]-0.00)-(x[t+dt][7]*1.00)" R3 2 3 "(x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00)" R4 3 4 "(x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00)" -C1 3 4 "(x[t+dt][10]*dt)-(1.00*(x[t+dt][2]-x[t+dt][3]))" +C1 3 4 "(x[t+dt][10]*dt)-(1.00*(x[t+dt][2]-x[t+dt][3]))" "x[t][10]" V2 4 0 "x[t+dt][3]-1" R5 3 0 "(x[t+dt][2]-0.00)-(x[t+dt][12]*1.00)" - -*** x -> dictionary mapping timestep to vector of currents and voltages -*** TODO: initial conditions diff --git a/circuit5.cir b/circuit5.cir new file mode 100644 index 00000000..c6464414 --- /dev/null +++ b/circuit5.cir @@ -0,0 +1,17 @@ +.title Lolcatz + +V1 1 0 1 +R1 1 2 1 +L1 2 3 1 +R2 2 0 1 +R3 2 3 1 +R4 3 4 1 +C1 3 4 1 +V2 4 0 1 +R5 3 0 1 + +.control + op +.endc + +.end diff --git a/cmp_test.py b/cmp_test.py new file mode 100755 index 00000000..79cea373 --- /dev/null +++ b/cmp_test.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import matplotlib.pyplot as plt +import time +import os + +ngspice_start_t = time.time() +os.system("ngspice -b circuit5.cir") +ngspice_end_t = time.time() + +ospice_start_t = time.time() +os.system("./OpenSPICE.py circuit4.cir") +ospice_end_t = time.time() + +print("ngspice exec time = {} [ms]".format((ngspice_end_t - ngspice_start_t) * 1e3)) +print("OpenSPICE exec time = {} [ms]".format((ospice_end_t - ospice_start_t) * 1e3)) From d523a91fca4f0b0f8740fcba4ba683ad9eccb066 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 15:35:23 -0700 Subject: [PATCH 023/115] Halved time by removing sympy --- OpenSPICE.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index f9c8db1b..c70be479 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -1,9 +1,6 @@ #!/usr/bin/env python3 -import numpy -import re import scipy.optimize import sys -import sympy # TODO x -> dictionary mapping timestep to vector of currents and voltages # TODO initial conditions @@ -52,7 +49,7 @@ def get_kcl_eqns(lines): return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] def solve(fn, output_len): - return scipy.optimize.root(fn, numpy.ones(output_len), method='broyden1').x + return scipy.optimize.root(fn, [1.00] * (output_len), method='broyden1').x def fmt_soln(x, num_nodes, num_branches): for n in range(num_nodes - 1): @@ -60,18 +57,6 @@ def fmt_soln(x, num_nodes, num_branches): for b in range(num_branches): print("I{} = {} [A]".format(b, x[num_nodes + b - 1])) -def make_simple(fn_str, x_len): - for i in range(x_len - 1, -1, -1): - exec("x_{} = sympy.symbols('x_{}')".format(i, i)) - fn_str = fn_str.replace("x[{}]".format(i), "(x_{})".format(i)) - fn_str_arr = eval(fn_str) - for i in range(len(fn_str_arr)): - fn_str_arr[i] = sympy.simplify(fn_str_arr[i]) - fn_str = str(fn_str_arr) - for i in range(x_len - 1, -1, -1): - fn_str = fn_str.replace("x_{}".format(i), "x[{}]".format(i)) - return fn_str - # Take array of expressions and initial condition expressions # and solve op point. @@ -87,7 +72,6 @@ def op_pt(netlist): iv_relations = l_arr [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) l_fn_str = "[" + ",".join([eval(s.replace('dt', str(dt))) for s in iv_relations + kcl_relations]) + "]" - l_fn_str = make_simple(l_fn_str, len(iv_relations) + len(kcl_relations)) l_fn = lambda x : eval(l_fn_str) soln = solve(l_fn, len(iv_relations) + len(kcl_relations)) return [soln,num_nodes,num_branches] From 593b8cfa1953b5f8bfa35b4a95ff211892cd9369 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 15:35:32 -0700 Subject: [PATCH 024/115] Should have had this the whole time --- .spiceinit | 1 + 1 file changed, 1 insertion(+) create mode 100644 .spiceinit diff --git a/.spiceinit b/.spiceinit new file mode 100644 index 00000000..b4be6ef7 --- /dev/null +++ b/.spiceinit @@ -0,0 +1 @@ +set ngbehavior=all From b12286f4cc246ecefe6a93cc57e305fc027d7818 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 15:52:01 -0700 Subject: [PATCH 025/115] Doubled speed again by optimizing imports --- OpenSPICE.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index c70be479..149a68a2 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -import scipy.optimize +from scipy.optimize import root import sys # TODO x -> dictionary mapping timestep to vector of currents and voltages @@ -49,7 +49,7 @@ def get_kcl_eqns(lines): return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] def solve(fn, output_len): - return scipy.optimize.root(fn, [1.00] * (output_len), method='broyden1').x + return root(fn, [1.00] * (output_len), method='broyden1').x def fmt_soln(x, num_nodes, num_branches): for n in range(num_nodes - 1): From fa145b01932ac3ab6925a611496576ee3e9fb38a Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 17:32:35 -0700 Subject: [PATCH 026/115] 300x slowdown using OpenSPICE for transient... time to start closing the gap :) --- OpenSPICE.py | 49 +++++++++++++++++++++++++++++++++++----------- circuit4_trans.cir | 9 +++++++++ circuit5_trans.cir | 19 ++++++++++++++++++ cmp_test.py | 5 ++--- 4 files changed, 68 insertions(+), 14 deletions(-) create mode 100644 circuit4_trans.cir create mode 100644 circuit5_trans.cir diff --git a/OpenSPICE.py b/OpenSPICE.py index 149a68a2..06f4a7ab 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -2,21 +2,30 @@ from scipy.optimize import root import sys +END_T = 10.00 +DT = 0.01 + # TODO x -> dictionary mapping timestep to vector of currents and voltages # TODO initial conditions # Foundational functions # Take limit of expression t -> inf -def inflim(expr, dt): - return expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') +def inflim(expr, seed, dt): + if len(seed) == 0: + return expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') + else: + for s in range(len(seed)): + repl_str = 'x[t][{}]'.format(s) + expr = expr.replace(repl_str, str(seed[s])) + return expr.replace('x[t+dt]', 'x') # process netlist expressions with function f -def process_netlist_expr(lines, f, dt): +def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False): for i in range(len(lines)): - lines[i][3] = f(lines[i][3], dt) - if len(lines[i]) == 5: - lines[i][4] = f(lines[i][4], dt) + lines[i][3] = f(lines[i][3], seed, dt) + if len(lines[i]) == 5 and not mid_trans: + lines[i][4] = f(lines[i][4], seed, dt) return lines def get_nodes(lines): @@ -63,12 +72,14 @@ def fmt_soln(x, num_nodes, num_branches): # Op point # 1) Substitute constant dt and t -> inf. # 2) Use Broyden's to solve at a single timestep -def op_pt(netlist): - dt = 1.0 +def op_pt(netlist, mid_trans=False, seed=[], dt=1.0): lines = [n.split(" ") for n in netlist.split("\n") if n != ""] - lines = process_netlist_expr(lines, inflim, dt) + lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans) # Note: Replace len(l) - 1 with 3 for transient nextstep function - l_arr = [l[len(l)-1] for l in lines] + if mid_trans: + l_arr = [l[3] for l in lines] + else: + l_arr = [l[len(l)-1] for l in lines] iv_relations = l_arr [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) l_fn_str = "[" + ",".join([eval(s.replace('dt', str(dt))) for s in iv_relations + kcl_relations]) + "]" @@ -80,8 +91,24 @@ def op_pt(netlist): # 1) Create initial condition equations and calculate # 2) Set x[0] to initial condition # 3) Loop. Update t on each timestep. +def transient(netlist): + trans_soln = [] + for i in range(int(END_T / DT)): + if i == 0: + soln = op_pt(netlist) + else: + soln = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=DT) + trans_soln.append(soln[0]) + return trans_soln if __name__ == "__main__": with open(sys.argv[1], "r") as txt: - [soln,n_nodes,n_branches] = op_pt(txt.read()) + # [soln,n_nodes,n_branches] = op_pt(txt.read()) + x = transient(txt.read()) + print([_x[1] for _x in x]) + # from numpy import linspace + # import matplotlib.pyplot as plt + # t = linspace(0.00, END_T, int(END_T / DT)) + # plt.plot(t, [_x[1] for _x in x]) + # plt.show() # fmt_soln(soln, n_nodes, n_branches) diff --git a/circuit4_trans.cir b/circuit4_trans.cir new file mode 100644 index 00000000..dc194fee --- /dev/null +++ b/circuit4_trans.cir @@ -0,0 +1,9 @@ +V1 1 0 "x[t+dt][0]-1" +R1 1 2 "(x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00)" +L1 2 3 "((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6])" "x[t][6]" +R2 2 0 "(x[t+dt][1]-0.00)-(x[t+dt][7]*1.00)" +R3 2 3 "(x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00)" +R4 3 4 "(x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00)" +C1 3 4 "(x[t+dt][10]*dt)-(1.00*((x[t+dt][2]-x[t+dt][3])-(x[t][2]-x[t][3])))" "x[t][2]-x[t][3]" +V2 4 0 "x[t+dt][3]-1" +R5 3 0 "(x[t+dt][2]-0.00)-(x[t+dt][12]*1.00)" diff --git a/circuit5_trans.cir b/circuit5_trans.cir new file mode 100644 index 00000000..737c3c6c --- /dev/null +++ b/circuit5_trans.cir @@ -0,0 +1,19 @@ +.title Lolcatz + +V1 1 0 1 +R1 1 2 1 +L1 2 3 1 ic=0 +R2 2 0 1 +R3 2 3 1 +R4 3 4 1 +C1 3 4 1 ic=0 +V2 4 0 1 +R5 3 0 1 + +.control + tran 1m 10 uic + print v(1) + quit +.endc + +.end diff --git a/cmp_test.py b/cmp_test.py index 79cea373..5d6bb610 100755 --- a/cmp_test.py +++ b/cmp_test.py @@ -1,15 +1,14 @@ #!/usr/bin/env python3 -import matplotlib.pyplot as plt import time import os ngspice_start_t = time.time() -os.system("ngspice -b circuit5.cir") +os.system("ngspice circuit5_trans.cir") ngspice_end_t = time.time() ospice_start_t = time.time() -os.system("./OpenSPICE.py circuit4.cir") +os.system("./OpenSPICE.py circuit4_trans.cir") ospice_end_t = time.time() print("ngspice exec time = {} [ms]".format((ngspice_end_t - ngspice_start_t) * 1e3)) From fd0922a1f628b96ca0f36b8b469a54d6fc7ef61e Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 17:45:05 -0700 Subject: [PATCH 027/115] Optimize lambda eval to close gap to 100x slowdown --- OpenSPICE.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index 06f4a7ab..c8578682 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -82,8 +82,8 @@ def op_pt(netlist, mid_trans=False, seed=[], dt=1.0): l_arr = [l[len(l)-1] for l in lines] iv_relations = l_arr [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) - l_fn_str = "[" + ",".join([eval(s.replace('dt', str(dt))) for s in iv_relations + kcl_relations]) + "]" - l_fn = lambda x : eval(l_fn_str) + l_fn_str = "lambda x : [" + ",".join([eval(s.replace('dt', str(dt))) for s in iv_relations + kcl_relations]) + "]" + l_fn = eval(l_fn_str) soln = solve(l_fn, len(iv_relations) + len(kcl_relations)) return [soln,num_nodes,num_branches] From f0300e4c0c0bdaa4eee9f507014a54da45d73626 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 17:45:13 -0700 Subject: [PATCH 028/115] Add profiling script --- profile.sh | 1 + 1 file changed, 1 insertion(+) create mode 100755 profile.sh diff --git a/profile.sh b/profile.sh new file mode 100755 index 00000000..76b96cbe --- /dev/null +++ b/profile.sh @@ -0,0 +1 @@ +python3 -m cProfile -s cumtime ./OpenSPICE.py circuit4_trans.cir > log From c71067d3c41fda0b7ab22f1c3494ca48bc62b75f Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 17:54:22 -0700 Subject: [PATCH 029/115] Somehow broyden2 gives 20% speedup over broyden1 --- OpenSPICE.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index c8578682..262edbb6 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -58,7 +58,7 @@ def get_kcl_eqns(lines): return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] def solve(fn, output_len): - return root(fn, [1.00] * (output_len), method='broyden1').x + return root(fn, [1.00] * (output_len), method='broyden2').x def fmt_soln(x, num_nodes, num_branches): for n in range(num_nodes - 1): From c091d9468e5fef8d3b263dff0b2aeb08197a4648 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 18:50:14 -0700 Subject: [PATCH 030/115] Now in the vicinity of about 10x slowdown --- OpenSPICE.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index 262edbb6..0ac7fb4e 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -58,7 +58,7 @@ def get_kcl_eqns(lines): return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] def solve(fn, output_len): - return root(fn, [1.00] * (output_len), method='broyden2').x + return root(fn, [1.00] * (output_len), method='hybrd').x def fmt_soln(x, num_nodes, num_branches): for n in range(num_nodes - 1): From f21ec59cd1be318dd532a09dc282c542a34fb12a Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 18:51:11 -0700 Subject: [PATCH 031/115] Whoops. There was a bug. About 10x slowdown now. --- OpenSPICE.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index 0ac7fb4e..d945d547 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -58,7 +58,7 @@ def get_kcl_eqns(lines): return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] def solve(fn, output_len): - return root(fn, [1.00] * (output_len), method='hybrd').x + return root(fn, [1.00] * (output_len)).x def fmt_soln(x, num_nodes, num_branches): for n in range(num_nodes - 1): From 5c3473d930b63ddc6f9ffb8bc867e4939da38eb6 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 19:19:46 -0700 Subject: [PATCH 032/115] Optimize away one of the evals --- OpenSPICE.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index d945d547..80f0dfb6 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -55,7 +55,7 @@ def get_kcl_eqns(lines): kcl[int(lines[i][1])-1] = kcl_prepend(kcl[int(lines[i][1])-1], num_nodes, i, False) if lines[i][2] != "0": kcl[int(lines[i][2])-1] = kcl_prepend(kcl[int(lines[i][2])-1], num_nodes, i, True) - return [["\"" + k + "\"" for k in kcl],num_nodes,num_branches] + return [kcl,num_nodes,num_branches] def solve(fn, output_len): return root(fn, [1.00] * (output_len)).x @@ -77,12 +77,11 @@ def op_pt(netlist, mid_trans=False, seed=[], dt=1.0): lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans) # Note: Replace len(l) - 1 with 3 for transient nextstep function if mid_trans: - l_arr = [l[3] for l in lines] + iv_relations = [l[3] for l in lines] else: - l_arr = [l[len(l)-1] for l in lines] - iv_relations = l_arr + iv_relations = [l[len(l)-1] for l in lines] [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) - l_fn_str = "lambda x : [" + ",".join([eval(s.replace('dt', str(dt))) for s in iv_relations + kcl_relations]) + "]" + l_fn_str = "lambda x : [" + ",".join([s.replace('dt', str(dt)) for s in iv_relations + kcl_relations]) + "]" l_fn = eval(l_fn_str) soln = solve(l_fn, len(iv_relations) + len(kcl_relations)) return [soln,num_nodes,num_branches] From e06b49257eb327a718b1648a42d6e4ff811dd798 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 21 Mar 2022 19:23:31 -0700 Subject: [PATCH 033/115] Marginal import optimization --- OpenSPICE.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index 80f0dfb6..f502e2a3 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 from scipy.optimize import root -import sys +from sys import argv END_T = 10.00 DT = 0.01 @@ -101,7 +101,7 @@ def transient(netlist): return trans_soln if __name__ == "__main__": - with open(sys.argv[1], "r") as txt: + with open(argv[1], "r") as txt: # [soln,n_nodes,n_branches] = op_pt(txt.read()) x = transient(txt.read()) print([_x[1] for _x in x]) From 44efa0f2034db708c06c57554b7e982707d3dee2 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 22 Mar 2022 11:51:06 -0700 Subject: [PATCH 034/115] Got transient with sine waves working --- OpenSPICE.py | 29 +++++++++++++++-------------- circuit4_trans.cir | 18 +++++++++--------- circuit5_trans.cir | 7 +++++-- cmp_test.py | 2 +- profile.sh | 2 +- 5 files changed, 31 insertions(+), 27 deletions(-) diff --git a/OpenSPICE.py b/OpenSPICE.py index f502e2a3..e93634b7 100755 --- a/OpenSPICE.py +++ b/OpenSPICE.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 +from math import sin, pi from scipy.optimize import root from sys import argv -END_T = 10.00 +END_T = 30.00 DT = 0.01 # TODO x -> dictionary mapping timestep to vector of currents and voltages @@ -11,21 +12,21 @@ # Foundational functions # Take limit of expression t -> inf -def inflim(expr, seed, dt): - if len(seed) == 0: - return expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') +def inflim(expr, seed, dt, mid_trans, timestep): + if not mid_trans: + expr = expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') else: for s in range(len(seed)): - repl_str = 'x[t][{}]'.format(s) - expr = expr.replace(repl_str, str(seed[s])) - return expr.replace('x[t+dt]', 'x') + expr = expr.replace('x[t][%d]' % s, str(seed[s])) + expr = expr.replace('x[t+dt]', 'x') + return expr.replace('dt', str(dt)).replace('t', str(timestep)) # process netlist expressions with function f -def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False): +def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0): for i in range(len(lines)): - lines[i][3] = f(lines[i][3], seed, dt) + lines[i][3] = f(lines[i][3], seed, dt, mid_trans, timestep) if len(lines[i]) == 5 and not mid_trans: - lines[i][4] = f(lines[i][4], seed, dt) + lines[i][4] = f(lines[i][4], seed, dt, mid_trans, timestep) return lines def get_nodes(lines): @@ -72,16 +73,16 @@ def fmt_soln(x, num_nodes, num_branches): # Op point # 1) Substitute constant dt and t -> inf. # 2) Use Broyden's to solve at a single timestep -def op_pt(netlist, mid_trans=False, seed=[], dt=1.0): +def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0): lines = [n.split(" ") for n in netlist.split("\n") if n != ""] - lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans) + lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans, timestep) # Note: Replace len(l) - 1 with 3 for transient nextstep function if mid_trans: iv_relations = [l[3] for l in lines] else: iv_relations = [l[len(l)-1] for l in lines] [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) - l_fn_str = "lambda x : [" + ",".join([s.replace('dt', str(dt)) for s in iv_relations + kcl_relations]) + "]" + l_fn_str = "lambda x : [" + ",".join(iv_relations + kcl_relations) + "]" l_fn = eval(l_fn_str) soln = solve(l_fn, len(iv_relations) + len(kcl_relations)) return [soln,num_nodes,num_branches] @@ -96,7 +97,7 @@ def transient(netlist): if i == 0: soln = op_pt(netlist) else: - soln = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=DT) + soln = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=DT, timestep=DT*i) trans_soln.append(soln[0]) return trans_soln diff --git a/circuit4_trans.cir b/circuit4_trans.cir index dc194fee..11a7343b 100644 --- a/circuit4_trans.cir +++ b/circuit4_trans.cir @@ -1,9 +1,9 @@ -V1 1 0 "x[t+dt][0]-1" -R1 1 2 "(x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00)" -L1 2 3 "((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6])" "x[t][6]" -R2 2 0 "(x[t+dt][1]-0.00)-(x[t+dt][7]*1.00)" -R3 2 3 "(x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00)" -R4 3 4 "(x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00)" -C1 3 4 "(x[t+dt][10]*dt)-(1.00*((x[t+dt][2]-x[t+dt][3])-(x[t][2]-x[t][3])))" "x[t][2]-x[t][3]" -V2 4 0 "x[t+dt][3]-1" -R5 3 0 "(x[t+dt][2]-0.00)-(x[t+dt][12]*1.00)" +V1 1 0 x[t+dt][0]-1 +R1 1 2 (x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00) +L1 2 3 ((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6]) x[t][6] +R2 2 0 (x[t+dt][1]-0.00)-(x[t+dt][7]*1.00) +R3 2 3 (x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00) +R4 3 4 (x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00) +C1 3 4 (x[t+dt][10]*dt)-(1.00*((x[t+dt][2]-x[t+dt][3])-(x[t][2]-x[t][3]))) x[t][2]-x[t][3] +V2 4 0 x[t+dt][3]-1 +R5 3 0 (x[t+dt][2]-0.00)-(x[t+dt][12]*1.00) diff --git a/circuit5_trans.cir b/circuit5_trans.cir index 737c3c6c..bfa889ae 100644 --- a/circuit5_trans.cir +++ b/circuit5_trans.cir @@ -1,17 +1,20 @@ .title Lolcatz -V1 1 0 1 +*** V1 1 0 1 +V1 1 0 SIN(0 1 1 0 0 0) R1 1 2 1 L1 2 3 1 ic=0 R2 2 0 1 R3 2 3 1 R4 3 4 1 C1 3 4 1 ic=0 -V2 4 0 1 +*** V2 4 0 1 +V2 4 0 SIN(0 1 1 0 0 0) R5 3 0 1 .control tran 1m 10 uic + *** plot v(1) print v(1) quit .endc diff --git a/cmp_test.py b/cmp_test.py index 5d6bb610..5472349a 100755 --- a/cmp_test.py +++ b/cmp_test.py @@ -8,7 +8,7 @@ ngspice_end_t = time.time() ospice_start_t = time.time() -os.system("./OpenSPICE.py circuit4_trans.cir") +os.system("./OpenSPICE.py circuit5_trans_os.cir") ospice_end_t = time.time() print("ngspice exec time = {} [ms]".format((ngspice_end_t - ngspice_start_t) * 1e3)) diff --git a/profile.sh b/profile.sh index 76b96cbe..af52d837 100755 --- a/profile.sh +++ b/profile.sh @@ -1 +1 @@ -python3 -m cProfile -s cumtime ./OpenSPICE.py circuit4_trans.cir > log +python3 -m cProfile -s cumtime ./OpenSPICE.py circuit5_trans_os.cir > log From 8764b63c1b02b301e992d6cb1987563a34389470 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 24 Mar 2022 16:29:06 -0700 Subject: [PATCH 035/115] Hacked netlist translation from ngspice PySpice interface --- OpenSPICE.py | 114 ------- OpenSPICE/OpenSPICE.py | 284 ++++++++++++++++++ OpenSPICE/__init__.py | 1 + OpenSPICE/__main__.py | 61 ++++ .../__pycache__/OpenSPICE.cpython-38.pyc | Bin 0 -> 4223 bytes OpenSPICE/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 140 bytes OpenSPICE/__pycache__/__main__.cpython-38.pyc | Bin 0 -> 1284 bytes 7 files changed, 346 insertions(+), 114 deletions(-) delete mode 100755 OpenSPICE.py create mode 100755 OpenSPICE/OpenSPICE.py create mode 100644 OpenSPICE/__init__.py create mode 100644 OpenSPICE/__main__.py create mode 100644 OpenSPICE/__pycache__/OpenSPICE.cpython-38.pyc create mode 100644 OpenSPICE/__pycache__/__init__.cpython-38.pyc create mode 100644 OpenSPICE/__pycache__/__main__.cpython-38.pyc diff --git a/OpenSPICE.py b/OpenSPICE.py deleted file mode 100755 index e93634b7..00000000 --- a/OpenSPICE.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -from math import sin, pi -from scipy.optimize import root -from sys import argv - -END_T = 30.00 -DT = 0.01 - -# TODO x -> dictionary mapping timestep to vector of currents and voltages -# TODO initial conditions - -# Foundational functions - -# Take limit of expression t -> inf -def inflim(expr, seed, dt, mid_trans, timestep): - if not mid_trans: - expr = expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') - else: - for s in range(len(seed)): - expr = expr.replace('x[t][%d]' % s, str(seed[s])) - expr = expr.replace('x[t+dt]', 'x') - return expr.replace('dt', str(dt)).replace('t', str(timestep)) - -# process netlist expressions with function f -def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0): - for i in range(len(lines)): - lines[i][3] = f(lines[i][3], seed, dt, mid_trans, timestep) - if len(lines[i]) == 5 and not mid_trans: - lines[i][4] = f(lines[i][4], seed, dt, mid_trans, timestep) - return lines - -def get_nodes(lines): - nodes = [] - for l in lines: - if int(l[1]) not in nodes: - nodes.append(int(l[1])) - if int(l[2]) not in nodes: - nodes.append(int(l[2])) - nodes.sort() - for i in range(len(nodes)-1): - assert nodes[i+1] - nodes[i] == 1 - assert nodes[0] == 0 - return nodes - -def kcl_prepend(s, num_nodes, branch_idx, plus): - return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx - 1) + s - -def get_kcl_eqns(lines): - nodes = get_nodes(lines) - assert nodes[0] == 0 - num_nodes = len(nodes) - num_branches = len(lines) - kcl = [""] * (num_nodes - 1) - for i in range(len(lines)): - if lines[i][1] != "0": - kcl[int(lines[i][1])-1] = kcl_prepend(kcl[int(lines[i][1])-1], num_nodes, i, False) - if lines[i][2] != "0": - kcl[int(lines[i][2])-1] = kcl_prepend(kcl[int(lines[i][2])-1], num_nodes, i, True) - return [kcl,num_nodes,num_branches] - -def solve(fn, output_len): - return root(fn, [1.00] * (output_len)).x - -def fmt_soln(x, num_nodes, num_branches): - for n in range(num_nodes - 1): - print("V{} = {} [V]".format(n + 1, x[n])) - for b in range(num_branches): - print("I{} = {} [A]".format(b, x[num_nodes + b - 1])) - -# Take array of expressions and initial condition expressions -# and solve op point. - -# Op point -# 1) Substitute constant dt and t -> inf. -# 2) Use Broyden's to solve at a single timestep -def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0): - lines = [n.split(" ") for n in netlist.split("\n") if n != ""] - lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans, timestep) - # Note: Replace len(l) - 1 with 3 for transient nextstep function - if mid_trans: - iv_relations = [l[3] for l in lines] - else: - iv_relations = [l[len(l)-1] for l in lines] - [kcl_relations,num_nodes,num_branches] = get_kcl_eqns(lines) - l_fn_str = "lambda x : [" + ",".join(iv_relations + kcl_relations) + "]" - l_fn = eval(l_fn_str) - soln = solve(l_fn, len(iv_relations) + len(kcl_relations)) - return [soln,num_nodes,num_branches] - -# Transient sim -# 1) Create initial condition equations and calculate -# 2) Set x[0] to initial condition -# 3) Loop. Update t on each timestep. -def transient(netlist): - trans_soln = [] - for i in range(int(END_T / DT)): - if i == 0: - soln = op_pt(netlist) - else: - soln = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=DT, timestep=DT*i) - trans_soln.append(soln[0]) - return trans_soln - -if __name__ == "__main__": - with open(argv[1], "r") as txt: - # [soln,n_nodes,n_branches] = op_pt(txt.read()) - x = transient(txt.read()) - print([_x[1] for _x in x]) - # from numpy import linspace - # import matplotlib.pyplot as plt - # t = linspace(0.00, END_T, int(END_T / DT)) - # plt.plot(t, [_x[1] for _x in x]) - # plt.show() - # fmt_soln(soln, n_nodes, n_branches) diff --git a/OpenSPICE/OpenSPICE.py b/OpenSPICE/OpenSPICE.py new file mode 100755 index 00000000..ef119f95 --- /dev/null +++ b/OpenSPICE/OpenSPICE.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 +from math import sin, pi +from scipy.optimize import root +from sys import argv +from PySpice.Spice.Parser import SpiceParser +import struct + +get_vsrc = None +send_data = None + +END_T = 30.00 +DT = 0.01 + +# TODO x -> dictionary mapping timestep to vector of currents and voltages +# TODO initial conditions + +# Foundational functions + +def set_get_vsrc(_get_vsrc): + global get_vsrc + get_vsrc = _get_vsrc + +def set_send_data(_send_data): + global send_data + send_data = _send_data + +# Take limit of expression t -> inf +def inflim(expr, seed, dt, mid_trans, timestep): + if not mid_trans: + expr = expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') + else: + for s in range(len(seed)): + expr = expr.replace('x[t][%d]' % s, str(seed[s])) + expr = expr.replace('x[t+dt]', 'x') + return expr.replace('dt', str(dt)).replace('t', str(timestep)) + +# process netlist expressions with function f +def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0): + for i in range(len(lines)): + lines[i][3] = f(lines[i][3], seed, dt, mid_trans, timestep) + if len(lines[i]) == 5 and not mid_trans: + lines[i][4] = f(lines[i][4], seed, dt, mid_trans, timestep) + return lines + +def get_nodes(lines): + nodes = [] + for l in lines.split("\n"): + if l != "": + l = l.split(" ") + if int(l[1]) not in nodes: + nodes.append(int(l[1])) + if int(l[2]) not in nodes: + nodes.append(int(l[2])) + nodes.sort() + # for i in range(len(nodes)-1): + # assert nodes[i+1] - nodes[i] == 1 + assert nodes[0] == 0 + return nodes + +def kcl_prepend(s, num_nodes, branch_idx, plus): + return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx - 1) + s + +def get_kcl_eqns(lines): + nodes = get_nodes(lines) + assert nodes[0] == 0 + num_nodes = len(nodes) + node_dict = dict(zip(nodes, range(num_nodes))) + num_branches = len(lines) + kcl = [""] * (num_nodes - 1) + lines = [n.split(" ") for n in lines.split("\n") if n != ""] + for i in range(len(lines)): + node_0 = node_dict[int(lines[i][1])] + node_1 = node_dict[int(lines[i][2])] + if node_0 != 0: + kcl[node_0-1] = kcl_prepend(kcl[node_0-1], num_nodes, i, False) + if node_1 != 0: + kcl[node_1-1] = kcl_prepend(kcl[node_1-1], num_nodes, i, True) + return [kcl,num_nodes,num_branches,node_dict] + +def solve(fn, output_len): + return root(fn, [1.00] * (output_len)).x + +def fmt_soln(x, num_nodes, num_branches): + for n in range(num_nodes - 1): + print("V{} = {} [V]".format(n + 1, x[n])) + for b in range(num_branches): + print("I{} = {} [A]".format(b, x[num_nodes + b - 1])) + +def vsrc_sub(_eqn, timestep=0.00): + global get_vsrc + if get_vsrc: + DUMMY_NODE = 0 + DUMMY_SPICE_ID = 0 + dc_vals = [0.00] + get_vsrc(dc_vals, timestep, DUMMY_NODE, DUMMY_SPICE_ID) + return _eqn.replace("dc", str(dc_vals[0])) + else: + return _eqn + +# Take array of expressions and initial condition expressions +# and solve op point. + +# Op point +# 1) Substitute constant dt and t -> inf. +# 2) Use Powell's to solve at a single timestep +def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0): + lines = [n.split(" ") for n in netlist.split("\n") if n != ""] + lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans, timestep) + # Note: Replace len(l) - 1 with 3 for transient nextstep function + if mid_trans: + iv_relations = [l[3] for l in lines] + else: + iv_relations = [l[len(l)-1] for l in lines] + [kcl_relations,num_nodes,num_branches,node_dict] = get_kcl_eqns("\n".join([" ".join(l) for l in lines])) + final_eqns = [vsrc_sub(_eqn, timestep) for _eqn in iv_relations + kcl_relations] + l_fn_str = "lambda x : [" + ",".join(final_eqns) + "]" + l_fn = eval(l_fn_str) + soln = solve(l_fn, len(final_eqns)) + return [soln,num_nodes,num_branches,node_dict] + +# Transient sim +# 1) Create initial condition equations and calculate +# 2) Set x[0] to initial condition +# 3) Loop. Update t on each timestep. +def transient(netlist): + trans_soln = [] + voltage_list = [] + timesteps = [] + for i in range(int(END_T / DT)): + if i == 0: + [soln,num_nodes,num_branches,node_dict] = op_pt(netlist) + else: + [soln,num_nodes,num_branches,node_dict] = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=DT, timestep=DT*i) + trans_soln.append(soln) + global send_data + DUMMY_SPICE_ID = 0 + voltage_list = ['V({})'.format(n) for n in get_nodes(netlist)] + actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist)])) + actual_vector_values['time'] = DT*i + number_of_vectors = num_nodes + timesteps.append(DT*i) + send_data(actual_vector_values, number_of_vectors, DUMMY_SPICE_ID) + return [trans_soln,voltage_list,timesteps] + +def next_v_txt(node_no): + if node_no == "0": + return "0.00" + else: + return "x[t+dt][{}]".format(int(node_no)-1) + +def curr_v_txt(node_no): + if node_no == "0": + return "0.00" + else: + return "x[t][{}]".format(int(node_no)-1) + +def next_i_txt(branch_no, num_nodes): + return "x[t+dt][{}]".format(num_nodes - 1 + branch_no) + +def curr_i_txt(branch_no, num_nodes): + return "x[t][{}]".format(num_nodes - 1 + branch_no) + +def filter_voltages(input_str, nodes_arr): + for node in nodes_arr: + input_str = input_str.replace("v({})".format(node), next_v_txt(str(node))) + return input_str + +def netlist_translate(netlist_txt, nodes_arr): + new_netlist_txt = "" + line_count = 0 + for line in netlist_txt.split("\n"): + if line != "": + _line = line.split(" ") + if line[0] == "R": + # Resistor + _line[3] = "({}-{})-(({})*({}))".format(next_v_txt(_line[1]), next_v_txt(_line[2]), next_i_txt(line_count, len(nodes_arr)), _line[3].replace("Ohm", "")) + elif line[0] == "V": + # Voltage source + _line[3] = "({}-{})-({})".format(next_v_txt(_line[1]), next_v_txt(_line[2]), _line[3].replace("V", "")) + if len(_line) == 6 and _line[5] == "external": + del _line[5] + del _line[4] + assert len(_line) != 6 + elif line[0] == "I": + # Current source + _line[3] = "({}-{})-({})".format(next_i_txt(line_count, len(nodes_arr)), curr_i_txt(line_count, len(nodes_arr)), _line[3].replace("A", "")) + if len(_line) == 6 and _line[5] == "external": + del _line[5] + del _line[4] + assert len(_line) != 6 + elif line[0] == "L": + # Inductor + _line[3] = "(({}-{})*dt)-(({})*(({})-({}))) (({})-({}))".format(next_v_txt(line[1]), + next_v_txt(line[2]), + _line[3].replace("H", ""), + next_i_txt(line_count, len(nodes_arr)), + curr_i_txt(line_count, len(nodes_arr)), + curr_v_txt(line[1]), + curr_v_txt(line[2])) + elif line[0] == "C": + # Capacitor + _line[3] = "({}*dt)-(({})*(({}-{})-({}-{})))".format(next_i_txt(line_count, len(nodes_arr)), + _line[3].replace("F", ""), + next_v_txt(_line[1]), + next_v_txt(_line[2]), + curr_v_txt(_line[1]), + curr_v_txt(_line[2])) + _line[4] = "({}-{})-{}".format(next_v_txt(_line[1]), next_v_txt(_line[2]), _line[4].replace("ic=","").replace("V","")) + elif line[0] == "B": + # Behavioral sources + if _line[3][0] == "i": + # Behavioral current source + _line[3] = "({})-({})".format(next_i_txt(line_count, len(nodes_arr)), + filter_voltages(_line[3], nodes_arr).replace("i=","")) + elif _line[3][0] == "v": + # Behavioral voltage source + _line[3] = "({})-({})".format(next_v_txt(line_count, len(nodes_arr)), + filter_voltages(_line[3], nodes_arr).replace("v=","")) + else: + assert False + elif line[0] == "E": + # Linear voltage-controlled voltage source + _line = [_line[0], _line[1], _line[2], "({}-{})-({}*({}-{}))".format(next_v_txt(_line[1]), next_v_txt(_line[2]), + _line[5], next_v_txt(_line[3]), next_v_txt(_line[4]))] + else: + assert False + next_line = " ".join(_line) + "\n" + print(next_line) + new_netlist_txt += next_line + line_count += 1 + return new_netlist_txt + +def filter_dot_statements(contents_txt): + del_lines = [] + contents_txt_arr = contents_txt.split("\n") + for line_idx in range(len(contents_txt_arr)): + if contents_txt_arr[line_idx] != "": + if contents_txt_arr[line_idx][0] == ".": + del_lines = [line_idx] + del_lines + for line_idx in del_lines: + del contents_txt_arr[line_idx] + return "\n".join(contents_txt_arr) + +def spice_input(input_filename, output_filename): + # sp = SpiceParser(source=spice_txt) + # print(sp) + # dump raw file for op point sim + with open(input_filename, "r") as netlist_file: + netlist_file_contents = netlist_file.read() + netlist_file_contents = filter_dot_statements(netlist_file_contents) + print(netlist_file_contents) + nodes_arr = get_nodes(netlist_file_contents) + _netlist = netlist_translate(netlist_file_contents, nodes_arr) + [soln,voltage_list,timesteps] = transient(_netlist) + assert len(soln) == len(timesteps) + with open(output_filename, "w") as spice_raw_file: + spice_raw_file_txt = "Title: MyCircuit\n" + spice_raw_file_txt += "Date: Thu Jun 11 23:17:40 2020\n" + spice_raw_file_txt += "Plotname: Transient Analysis\n" + spice_raw_file_txt += "Flags: real\n" + spice_raw_file_txt += "No. Variables: {}\n".format(len(voltage_list)) + spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) + spice_raw_file_txt += "Variables:\n" + spice_raw_file_txt += "\t0\ttime\ttime\n" + spice_raw_file_txt += "\n".join(["\t{}\t{}\tvoltage".format(1+i,v) for i,v in enumerate(voltage_list)]) + spice_raw_file_txt += "Binary:\n" + format_float = lambda x : hex(struct.unpack('&0rl8*|rsuGiTpir-dtt2SC?tvD_yDu&`fG%OIL z29Pb&;KlSYsXQvVT9*Z~TSo|y(P^Yz!=gP#oz z6&Q}c{rQLMe>}(7KdEv27(nATuJFGQf(h=k7I%0{b2LtE&DUFoV<=ts%~sCIDc$h% zEz7Z>o6dm9IR%jy)@$YrHklX@g$-Q{isEbT6vdDzp?^r65oO#<;;b0P{fsy#D!7-$ zc`<_fSuuboNAaW~#>6p+_Bez5K*@=5 zwx{E2_(jfh8D%=}6=CMiBCCjak zkDl)_rJJzOXcX_uK{rUpV)9Gf{LX6hsfgARzSA|JuXQbws~?HAL=#cMqpFeQrQ7lA z4L31mJ!ra#?z;g1h-5YA817C-CPwJGLRwfrGSKowErMZ~SdrIq!^rIc*C`boRxPRn+y9!x)P%gyN*3bN^MI&ScA`Kx;mjVxD403wWbJNYbjg zME8Oy$<;exhydN%GCG1YDcuPXYmwIu9!S}iRYQ*9sl*K0f-v?KP^S?cXu45NS$qKF za0G&gWdX`zToq^)ei@p)f{_NnczBRbj#ZG_Pz2uvfn-r=fhK6l+9(so7~9igHcE6b z5o#}cJF72yYy14ueLg8K;V~qO+(uir>WDIV79Ghzu-!^0<0!1*VO0 z(HXiNXb0FM9MLLwn+Ntq3WNZSaULVG*vY)3WZ z<4Ng@D~dIYHnT zDLEVjx&bR4Rt7A1Y=Hkr0-5EUNRy)SNVoXtWzYVR4YB%Yty}ymYu#C^>dGmJ*^!8N z`8`ahYO1v=kH~B2NO+L&_0uc0Hd;{)s}1hJB%}o~0Iq7pb?A~piFOiwC28oa=MQd>`X|tyheTu@w&}G7l`Bh-D%RIqV^> zkVxCagx5w?EHlIp@-L>(_xSI$ErW<7KY`Icw~=eiu;Y6Xab{{p&Y}A>goOnvEsb`o zb90H_pC%3s?C6fSJGD+UwcxiKbw9ib<a1p1OlLUG4(7$>`NIi( zr^)Y={^4QAQI3;epzm8;A-yq&P~0@@pGG4ZAMKAdQNk|8}@5H~j=3 z2nl+I5;m+EysVXwghr5xM!2N-H~}MJnqCqOd->lu=O?-b^#}N?HYtcVSb_r`ee} zo|q4o?$=fl?f#0Ied@vYF@m~z3pb~rcAP5w(+qtZy{Fup3@9Vd4Wb%GL-GYxe5&*X zZ34+c-bc>~Xeiw1|3~GZ(^6uHC?)k~dN&D+>zP@*7#j)q-Dfgl$ z;m^C36)*DLdHbFx8{1xFt7iA|{d$DXhueX@=&svyv-a%l{M--bXRq6HGqX3kyDx|Bdbt^(bRBXS;=? z!LB}I&ybiUF-PJv64yz5-p$|jg1US$54Tg9RplWu+Smal=5y&qZdG&692CP159JUO zbV?!pkJV)Td5!u`vtlqE_5xH;4=)XE2xgSRwQ*b+6LD-|Fm| zs%qD4)tWoe`YdfJ#;fg!N`MKMU2Re>RWCXQwt-J15l&Kd##CxU zzpfXdq?G4WmeZf6DfR0#mHuu@%GmNQ31V!To>Zc`LQS>Pq5Vgip{|og*+B6=TM~g* zs~rI>7h#g<(N2`^oM?-38boWM)fU^ndz0oLUWF(FKb%NDhGiAXd27hh)m0oGwhGpH KOYN=8+W!Crh+shg literal 0 HcmV?d00001 diff --git a/OpenSPICE/__pycache__/__init__.cpython-38.pyc b/OpenSPICE/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aad6868abd27dcd24407a3d3d0ad85608f89f69 GIT binary patch literal 140 zcmWIL<>g`kf-@=BNg(<$h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vIzqGhWKO;Xk zRlg`dH!)AYJijPgzcRQWGdWe?zaTX)IKb1{RX;vHGcU6wK3=b&@)n0pZhlH>PO2Tq JsLw#m005jT9{K

fgc5Z$$%G;PyRMM9_&Ld%UvG>+322?G@nsDxD7(iDn}khO`oWre@A-jF7w zr*h!NUueaNf530?l~eu#7npT|Xiv^cp4A(_H}h8Z?CYha1qAE+&j+192136SxV+{8 zJccLv3c*7j_ECTxjFG2#`WNJAO!tg)gJG|*f*=;NIJbf>^fO?w!sLxtI@7*wIz?d5 z|6^a^jG=oASw?9l84Wamrf(P3euy^EE3}W^BCp&=wWTq*K{cEjR2+ZmVuhwlhh3R& z!INx4kYM^8kEX??HUjHl=H@B(^ixfuk)|4q@VP$HF0Qsh(8|~uUSC~ZCEL5(ttST# zv2F7Clt3oMeY&L~^puBG4D1DxvktiQnN3<;bbDNq4CacSQ3;xMFC<&6Lz)(`EW3H% zw$@3rVcpA>@A;7oX#gd5VoX^qr_q-cZ45$7dkR zccuiH6JT4p<^Pw?r8Y=o22Os<25HVvXKe<~`V5?nnvoV_0beF99z`OcGBu)@g=wKL zxMVfmxfb`DR_nG>nP9=$Xm$`!Wvz$}Cid}gke;`qU3HWW9y+oKFqJWtq3TSBd zBk|E3v{eBU{*17__oDUOblrgR&~@waAYGhP<015fdjTccHDOe685@-n777mUsOfuW zy(f=gChn39HLswx2^y;j9mBAov6{~mi(z%2QBVDkM_>u$^?H4{d%m4rY literal 0 HcmV?d00001 From 0c81da69275624ca3ea34d23f975beaa4148940a Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 24 Mar 2022 19:52:42 -0700 Subject: [PATCH 036/115] Fix some bugs --- OpenSPICE/OpenSPICE.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/OpenSPICE/OpenSPICE.py b/OpenSPICE/OpenSPICE.py index ef119f95..dd388f88 100755 --- a/OpenSPICE/OpenSPICE.py +++ b/OpenSPICE/OpenSPICE.py @@ -64,16 +64,16 @@ def get_kcl_eqns(lines): nodes = get_nodes(lines) assert nodes[0] == 0 num_nodes = len(nodes) - node_dict = dict(zip(nodes, range(num_nodes))) + node_dict = dict(zip(nodes[1:], range(len(nodes[1:])))) num_branches = len(lines) kcl = [""] * (num_nodes - 1) lines = [n.split(" ") for n in lines.split("\n") if n != ""] for i in range(len(lines)): - node_0 = node_dict[int(lines[i][1])] - node_1 = node_dict[int(lines[i][2])] - if node_0 != 0: + if lines[i][1] != "0": + node_0 = node_dict[int(lines[i][1])] kcl[node_0-1] = kcl_prepend(kcl[node_0-1], num_nodes, i, False) - if node_1 != 0: + if lines[i][2] != "0": + node_1 = node_dict[int(lines[i][2])] kcl[node_1-1] = kcl_prepend(kcl[node_1-1], num_nodes, i, True) return [kcl,num_nodes,num_branches,node_dict] @@ -134,8 +134,8 @@ def transient(netlist): trans_soln.append(soln) global send_data DUMMY_SPICE_ID = 0 - voltage_list = ['V({})'.format(n) for n in get_nodes(netlist)] - actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist)])) + voltage_list = ['V({})'.format(n) for n in get_nodes(netlist) if n != 0] + actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist) if n != 0])) actual_vector_values['time'] = DT*i number_of_vectors = num_nodes timesteps.append(DT*i) @@ -205,7 +205,7 @@ def netlist_translate(netlist_txt, nodes_arr): next_v_txt(_line[2]), curr_v_txt(_line[1]), curr_v_txt(_line[2])) - _line[4] = "({}-{})-{}".format(next_v_txt(_line[1]), next_v_txt(_line[2]), _line[4].replace("ic=","").replace("V","")) + _line[4] = "({}-{})-{}".format(curr_v_txt(_line[1]), curr_v_txt(_line[2]), _line[4].replace("ic=","").replace("V","")) elif line[0] == "B": # Behavioral sources if _line[3][0] == "i": From c56b910a13f86bb0ac532cf6aba269b27d23abd2 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 25 Mar 2022 13:09:07 -0700 Subject: [PATCH 037/115] Fix some node indexing bugs --- OpenSPICE/OpenSPICE.py | 74 ++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/OpenSPICE/OpenSPICE.py b/OpenSPICE/OpenSPICE.py index dd388f88..2fc07883 100755 --- a/OpenSPICE/OpenSPICE.py +++ b/OpenSPICE/OpenSPICE.py @@ -6,10 +6,11 @@ import struct get_vsrc = None +get_isrc = None send_data = None -END_T = 30.00 -DT = 0.01 +END_T = 1000.00 +DT = 0.1 # TODO x -> dictionary mapping timestep to vector of currents and voltages # TODO initial conditions @@ -20,6 +21,10 @@ def set_get_vsrc(_get_vsrc): global get_vsrc get_vsrc = _get_vsrc +def set_get_isrc(_get_isrc): + global get_isrc + get_isrc = _get_isrc + def set_send_data(_send_data): global send_data send_data = _send_data @@ -93,9 +98,18 @@ def vsrc_sub(_eqn, timestep=0.00): DUMMY_SPICE_ID = 0 dc_vals = [0.00] get_vsrc(dc_vals, timestep, DUMMY_NODE, DUMMY_SPICE_ID) - return _eqn.replace("dc", str(dc_vals[0])) - else: - return _eqn + _eqn = _eqn.replace("dcv", str(dc_vals[0])) + return _eqn + +def isrc_sub(_eqn, timestep=0.00): + global get_isrc + if get_isrc: + DUMMY_NODE = 0 + DUMMY_SPICE_ID = 0 + dc_vals = [0.00] + get_isrc(dc_vals, timestep, DUMMY_NODE, DUMMY_SPICE_ID) + _eqn = _eqn.replace("dci", str(dc_vals[0])) + return _eqn # Take array of expressions and initial condition expressions # and solve op point. @@ -112,7 +126,7 @@ def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0): else: iv_relations = [l[len(l)-1] for l in lines] [kcl_relations,num_nodes,num_branches,node_dict] = get_kcl_eqns("\n".join([" ".join(l) for l in lines])) - final_eqns = [vsrc_sub(_eqn, timestep) for _eqn in iv_relations + kcl_relations] + final_eqns = [isrc_sub(vsrc_sub(_eqn, timestep)) for _eqn in iv_relations + kcl_relations] l_fn_str = "lambda x : [" + ",".join(final_eqns) + "]" l_fn = eval(l_fn_str) soln = solve(l_fn, len(final_eqns)) @@ -142,17 +156,19 @@ def transient(netlist): send_data(actual_vector_values, number_of_vectors, DUMMY_SPICE_ID) return [trans_soln,voltage_list,timesteps] -def next_v_txt(node_no): +def next_v_txt(node_no, nodes_arr): + node_dict = dict(zip(nodes_arr[1:], range(len(nodes_arr[1:])))) if node_no == "0": return "0.00" else: - return "x[t+dt][{}]".format(int(node_no)-1) + return "x[t+dt][{}]".format(node_dict[int(node_no)]) -def curr_v_txt(node_no): +def curr_v_txt(node_no, nodes_arr): + node_dict = dict(zip(nodes_arr[1:], range(len(nodes_arr[1:])))) if node_no == "0": return "0.00" else: - return "x[t][{}]".format(int(node_no)-1) + return "x[t][{}]".format(node_dict[int(node_no)]) def next_i_txt(branch_no, num_nodes): return "x[t+dt][{}]".format(num_nodes - 1 + branch_no) @@ -162,7 +178,7 @@ def curr_i_txt(branch_no, num_nodes): def filter_voltages(input_str, nodes_arr): for node in nodes_arr: - input_str = input_str.replace("v({})".format(node), next_v_txt(str(node))) + input_str = input_str.replace("v({})".format(node), next_v_txt(str(node), nodes_arr)) return input_str def netlist_translate(netlist_txt, nodes_arr): @@ -173,16 +189,21 @@ def netlist_translate(netlist_txt, nodes_arr): _line = line.split(" ") if line[0] == "R": # Resistor - _line[3] = "({}-{})-(({})*({}))".format(next_v_txt(_line[1]), next_v_txt(_line[2]), next_i_txt(line_count, len(nodes_arr)), _line[3].replace("Ohm", "")) + _line[3] = "({}-{})-(({})*({}))".format(next_v_txt(_line[1], nodes_arr), + next_v_txt(_line[2], nodes_arr), + next_i_txt(line_count, len(nodes_arr)), _line[3].replace("Ohm", "")) elif line[0] == "V": # Voltage source - _line[3] = "({}-{})-({})".format(next_v_txt(_line[1]), next_v_txt(_line[2]), _line[3].replace("V", "")) + _line[3] = _line[3].replace('dc', 'dcv') + _line[3] = "({}-{})-({})".format(next_v_txt(_line[1], nodes_arr), + next_v_txt(_line[2], nodes_arr), _line[3].replace("V", "")) if len(_line) == 6 and _line[5] == "external": del _line[5] del _line[4] assert len(_line) != 6 elif line[0] == "I": # Current source + _line[3] = _line[3].replace('dc', 'dci') _line[3] = "({}-{})-({})".format(next_i_txt(line_count, len(nodes_arr)), curr_i_txt(line_count, len(nodes_arr)), _line[3].replace("A", "")) if len(_line) == 6 and _line[5] == "external": del _line[5] @@ -190,22 +211,24 @@ def netlist_translate(netlist_txt, nodes_arr): assert len(_line) != 6 elif line[0] == "L": # Inductor - _line[3] = "(({}-{})*dt)-(({})*(({})-({}))) (({})-({}))".format(next_v_txt(line[1]), - next_v_txt(line[2]), + _line[3] = "(({}-{})*dt)-(({})*(({})-({}))) (({})-({}))".format(next_v_txt(line[1], nodes_arr), + next_v_txt(line[2], nodes_arr), _line[3].replace("H", ""), next_i_txt(line_count, len(nodes_arr)), curr_i_txt(line_count, len(nodes_arr)), - curr_v_txt(line[1]), - curr_v_txt(line[2])) + curr_v_txt(line[1], nodes_arr), + curr_v_txt(line[2], nodes_arr)) elif line[0] == "C": # Capacitor _line[3] = "({}*dt)-(({})*(({}-{})-({}-{})))".format(next_i_txt(line_count, len(nodes_arr)), _line[3].replace("F", ""), - next_v_txt(_line[1]), - next_v_txt(_line[2]), - curr_v_txt(_line[1]), - curr_v_txt(_line[2])) - _line[4] = "({}-{})-{}".format(curr_v_txt(_line[1]), curr_v_txt(_line[2]), _line[4].replace("ic=","").replace("V","")) + next_v_txt(_line[1], nodes_arr), + next_v_txt(_line[2], nodes_arr), + curr_v_txt(_line[1], nodes_arr), + curr_v_txt(_line[2], nodes_arr)) + if len(_line) == 5: + _line[4] = "({}-{})-{}".format(curr_v_txt(_line[1], nodes_arr), + curr_v_txt(_line[2], nodes_arr), _line[4].replace("ic=","").replace("V","")) elif line[0] == "B": # Behavioral sources if _line[3][0] == "i": @@ -220,8 +243,10 @@ def netlist_translate(netlist_txt, nodes_arr): assert False elif line[0] == "E": # Linear voltage-controlled voltage source - _line = [_line[0], _line[1], _line[2], "({}-{})-({}*({}-{}))".format(next_v_txt(_line[1]), next_v_txt(_line[2]), - _line[5], next_v_txt(_line[3]), next_v_txt(_line[4]))] + _line = [_line[0], _line[1], _line[2], "({}-{})-({}*({}-{}))".format(next_v_txt(_line[1], nodes_arr), + next_v_txt(_line[2], nodes_arr), + _line[5], next_v_txt(_line[3], nodes_arr), + next_v_txt(_line[4], nodes_arr))] else: assert False next_line = " ".join(_line) + "\n" @@ -248,7 +273,6 @@ def spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() netlist_file_contents = filter_dot_statements(netlist_file_contents) - print(netlist_file_contents) nodes_arr = get_nodes(netlist_file_contents) _netlist = netlist_translate(netlist_file_contents, nodes_arr) [soln,voltage_list,timesteps] = transient(_netlist) From 9367be64f793c59a96a605da4b745b43b3989b97 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 25 Mar 2022 18:30:33 -0700 Subject: [PATCH 038/115] Fixed current sources --- OpenSPICE/OpenSPICE.py | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/OpenSPICE/OpenSPICE.py b/OpenSPICE/OpenSPICE.py index 2fc07883..243996e6 100755 --- a/OpenSPICE/OpenSPICE.py +++ b/OpenSPICE/OpenSPICE.py @@ -37,7 +37,8 @@ def inflim(expr, seed, dt, mid_trans, timestep): for s in range(len(seed)): expr = expr.replace('x[t][%d]' % s, str(seed[s])) expr = expr.replace('x[t+dt]', 'x') - return expr.replace('dt', str(dt)).replace('t', str(timestep)) + expr = expr.replace('dt', str(dt)).replace('t', str(timestep)) + return expr # process netlist expressions with function f def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0): @@ -204,7 +205,8 @@ def netlist_translate(netlist_txt, nodes_arr): elif line[0] == "I": # Current source _line[3] = _line[3].replace('dc', 'dci') - _line[3] = "({}-{})-({})".format(next_i_txt(line_count, len(nodes_arr)), curr_i_txt(line_count, len(nodes_arr)), _line[3].replace("A", "")) + _line[3] = "({})-({})".format(next_i_txt(line_count, len(nodes_arr)), + _line[3].replace("A", "")) if len(_line) == 6 and _line[5] == "external": del _line[5] del _line[4] @@ -250,7 +252,6 @@ def netlist_translate(netlist_txt, nodes_arr): else: assert False next_line = " ".join(_line) + "\n" - print(next_line) new_netlist_txt += next_line line_count += 1 return new_netlist_txt @@ -267,9 +268,6 @@ def filter_dot_statements(contents_txt): return "\n".join(contents_txt_arr) def spice_input(input_filename, output_filename): - # sp = SpiceParser(source=spice_txt) - # print(sp) - # dump raw file for op point sim with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() netlist_file_contents = filter_dot_statements(netlist_file_contents) @@ -293,16 +291,3 @@ def spice_input(input_filename, output_filename): s = soln[j] spice_raw_file_txt += "".join([str(timesteps[j])] + [format_float(v) for i,v in enumerate(s) if i < len(voltage_list)]) + "\n" spice_raw_file.write(spice_raw_file_txt) - -if __name__ == "__main__": - print("argv[1] = {}, argv[2] = {}, argv[3] = {}".format(argv[1], argv[2], argv[3])) - with open(argv[1], "r") as txt: - # spice_input(txt.read()) - spice_input(argv[3]) - # x = transient(txt.read()) - # print([_x[1] for _x in x]) - # from numpy import linspace - # import matplotlib.pyplot as plt - # t = linspace(0.00, END_T, int(END_T / DT)) - # plt.plot(t, [_x[1] for _x in x]) - # plt.show() From 2d2c1ecd5275ca605c00371fc20ccf9d8da6c877 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sun, 27 Mar 2022 15:07:33 -0700 Subject: [PATCH 039/115] Test netlist --- circuit5_trans_os.cir | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 circuit5_trans_os.cir diff --git a/circuit5_trans_os.cir b/circuit5_trans_os.cir new file mode 100644 index 00000000..bdc7b270 --- /dev/null +++ b/circuit5_trans_os.cir @@ -0,0 +1,9 @@ +V1 1 0 x[t+dt][0]-sin(2*pi*t) +R1 1 2 (x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00) +L1 2 3 ((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6]) x[t][6] +R2 2 0 (x[t+dt][1]-0.00)-(x[t+dt][7]*1.00) +R3 2 3 (x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00) +R4 3 4 (x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00) +C1 3 4 (x[t+dt][10]*dt)-(1.00*((x[t+dt][2]-x[t+dt][3])-(x[t][2]-x[t][3]))) x[t][2]-x[t][3] +V2 4 0 x[t+dt][3]-sin(2*pi*t) +R5 3 0 (x[t+dt][2]-0.00)-(x[t+dt][12]*1.00) From 56c263338e38c6c616cefda542b8ba4bb41ef865 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sun, 27 Mar 2022 15:09:08 -0700 Subject: [PATCH 040/115] Remove dead cmp test --- cmp_test.sh | 5 ----- 1 file changed, 5 deletions(-) delete mode 100755 cmp_test.sh diff --git a/cmp_test.sh b/cmp_test.sh deleted file mode 100755 index dee5a40f..00000000 --- a/cmp_test.sh +++ /dev/null @@ -1,5 +0,0 @@ -cat circuit.cir -echo " " -./noodle.py circuit.cir -echo " " -./yspice.py circuit.cir From 6b81d98fe3bb2d5bb01ca1d1eafddcc7ac6a32b2 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sun, 27 Mar 2022 15:48:27 -0700 Subject: [PATCH 041/115] Remove a lot of unnecessary OpenSPICE files --- .spiceinit | 1 - circuit.cir | 9 --- circuit2.cir | 17 ---- circuit3.cir | 3 - circuit4.cir | 9 --- circuit4_trans.cir | 9 --- circuit5.cir | 17 ---- circuit5_trans.cir | 22 ------ circuit5_trans_os.cir | 9 --- cmp_test.py | 15 ---- eval_roots.py | 9 --- noodle.py | 180 ------------------------------------------ profile.sh | 1 - yspice.py | 115 --------------------------- 14 files changed, 416 deletions(-) delete mode 100644 .spiceinit delete mode 100644 circuit.cir delete mode 100644 circuit2.cir delete mode 100644 circuit3.cir delete mode 100644 circuit4.cir delete mode 100644 circuit4_trans.cir delete mode 100644 circuit5.cir delete mode 100644 circuit5_trans.cir delete mode 100644 circuit5_trans_os.cir delete mode 100755 cmp_test.py delete mode 100755 eval_roots.py delete mode 100755 noodle.py delete mode 100755 profile.sh delete mode 100755 yspice.py diff --git a/.spiceinit b/.spiceinit deleted file mode 100644 index b4be6ef7..00000000 --- a/.spiceinit +++ /dev/null @@ -1 +0,0 @@ -set ngbehavior=all diff --git a/circuit.cir b/circuit.cir deleted file mode 100644 index 880be276..00000000 --- a/circuit.cir +++ /dev/null @@ -1,9 +0,0 @@ -V1 1 0 1; -R1 1 2 1; -L1 2 3 1; -R2 2 0 1; -R3 2 3 1; -R4 3 4 1; -C1 3 4 1; -V2 4 0 1; -R5 3 0 1; diff --git a/circuit2.cir b/circuit2.cir deleted file mode 100644 index 5885f060..00000000 --- a/circuit2.cir +++ /dev/null @@ -1,17 +0,0 @@ -.title Lolcatz - -V1 1 0 1 -R1 1 2 1 -R2 2 3 1 -V2 3 4 1 -R3 4 0 1 -R4 2 5 1 -I1 0 5 1 -R5 2 0 1 - -.control - op - mdump -.endc - -.end diff --git a/circuit3.cir b/circuit3.cir deleted file mode 100644 index 4757c4b4..00000000 --- a/circuit3.cir +++ /dev/null @@ -1,3 +0,0 @@ -V1 1 0 1; -R1 1 2 1; -R2 2 0 1; diff --git a/circuit4.cir b/circuit4.cir deleted file mode 100644 index 19b21631..00000000 --- a/circuit4.cir +++ /dev/null @@ -1,9 +0,0 @@ -V1 1 0 "x[t+dt][0]-1" -R1 1 2 "(x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00)" -L1 2 3 "((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6])" "x[t][1]-x[t][2]" -R2 2 0 "(x[t+dt][1]-0.00)-(x[t+dt][7]*1.00)" -R3 2 3 "(x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00)" -R4 3 4 "(x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00)" -C1 3 4 "(x[t+dt][10]*dt)-(1.00*(x[t+dt][2]-x[t+dt][3]))" "x[t][10]" -V2 4 0 "x[t+dt][3]-1" -R5 3 0 "(x[t+dt][2]-0.00)-(x[t+dt][12]*1.00)" diff --git a/circuit4_trans.cir b/circuit4_trans.cir deleted file mode 100644 index 11a7343b..00000000 --- a/circuit4_trans.cir +++ /dev/null @@ -1,9 +0,0 @@ -V1 1 0 x[t+dt][0]-1 -R1 1 2 (x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00) -L1 2 3 ((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6]) x[t][6] -R2 2 0 (x[t+dt][1]-0.00)-(x[t+dt][7]*1.00) -R3 2 3 (x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00) -R4 3 4 (x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00) -C1 3 4 (x[t+dt][10]*dt)-(1.00*((x[t+dt][2]-x[t+dt][3])-(x[t][2]-x[t][3]))) x[t][2]-x[t][3] -V2 4 0 x[t+dt][3]-1 -R5 3 0 (x[t+dt][2]-0.00)-(x[t+dt][12]*1.00) diff --git a/circuit5.cir b/circuit5.cir deleted file mode 100644 index c6464414..00000000 --- a/circuit5.cir +++ /dev/null @@ -1,17 +0,0 @@ -.title Lolcatz - -V1 1 0 1 -R1 1 2 1 -L1 2 3 1 -R2 2 0 1 -R3 2 3 1 -R4 3 4 1 -C1 3 4 1 -V2 4 0 1 -R5 3 0 1 - -.control - op -.endc - -.end diff --git a/circuit5_trans.cir b/circuit5_trans.cir deleted file mode 100644 index bfa889ae..00000000 --- a/circuit5_trans.cir +++ /dev/null @@ -1,22 +0,0 @@ -.title Lolcatz - -*** V1 1 0 1 -V1 1 0 SIN(0 1 1 0 0 0) -R1 1 2 1 -L1 2 3 1 ic=0 -R2 2 0 1 -R3 2 3 1 -R4 3 4 1 -C1 3 4 1 ic=0 -*** V2 4 0 1 -V2 4 0 SIN(0 1 1 0 0 0) -R5 3 0 1 - -.control - tran 1m 10 uic - *** plot v(1) - print v(1) - quit -.endc - -.end diff --git a/circuit5_trans_os.cir b/circuit5_trans_os.cir deleted file mode 100644 index bdc7b270..00000000 --- a/circuit5_trans_os.cir +++ /dev/null @@ -1,9 +0,0 @@ -V1 1 0 x[t+dt][0]-sin(2*pi*t) -R1 1 2 (x[t+dt][0]-x[t+dt][1])-(x[t+dt][5]*1.00) -L1 2 3 ((x[t+dt][1]-x[t+dt][2])*dt)-1.00*(x[t+dt][6]-x[t][6]) x[t][6] -R2 2 0 (x[t+dt][1]-0.00)-(x[t+dt][7]*1.00) -R3 2 3 (x[t+dt][1]-x[t+dt][2])-(x[t+dt][8]*1.00) -R4 3 4 (x[t+dt][2]-x[t+dt][3])-(x[t+dt][9]*1.00) -C1 3 4 (x[t+dt][10]*dt)-(1.00*((x[t+dt][2]-x[t+dt][3])-(x[t][2]-x[t][3]))) x[t][2]-x[t][3] -V2 4 0 x[t+dt][3]-sin(2*pi*t) -R5 3 0 (x[t+dt][2]-0.00)-(x[t+dt][12]*1.00) diff --git a/cmp_test.py b/cmp_test.py deleted file mode 100755 index 5472349a..00000000 --- a/cmp_test.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 - -import time -import os - -ngspice_start_t = time.time() -os.system("ngspice circuit5_trans.cir") -ngspice_end_t = time.time() - -ospice_start_t = time.time() -os.system("./OpenSPICE.py circuit5_trans_os.cir") -ospice_end_t = time.time() - -print("ngspice exec time = {} [ms]".format((ngspice_end_t - ngspice_start_t) * 1e3)) -print("OpenSPICE exec time = {} [ms]".format((ospice_end_t - ospice_start_t) * 1e3)) diff --git a/eval_roots.py b/eval_roots.py deleted file mode 100755 index ef37632d..00000000 --- a/eval_roots.py +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env python3 - -import scipy.optimize - -def roots_from_txt(behav_txt): - return scipy.optimize.root(eval("lambda x : " + behav_txt), [0.0], method = 'lm').x[0] - -if __name__ == "__main__": - print(roots_from_txt("(x[0] ** 2.0) - 1")) diff --git a/noodle.py b/noodle.py deleted file mode 100755 index 8a6c809d..00000000 --- a/noodle.py +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env python3 - -from arpeggio import ZeroOrMore, EOF, ParserPython -from arpeggio import RegExMatch -import numpy -import sys -import scipy.optimize - -# https://pypi.org/project/Arpeggio/1.0/ - -### Parsing Functions ### - -def root(): - return ZeroOrMore(element), EOF - -# TODO: check -def element(): - return el, node, node, val, RegExMatch(r';') - -def el(): - return RegExMatch(r'(R\d+)|(V\d+)|(L\d+)|(C\d+)') - -# Only # names -def node(): - return RegExMatch(r'\d+') - -# TODO: check -def val(): - return RegExMatch(r'\d*\.\d*|\d+') - -### Matrix Construction Functions ### - -def get_nodes(ptree): - nodes = [] - num_lines = 0 - for l in ptree: - if str(l) != "": - l = str(l).replace("|", "").split() - if int(l[1]) not in nodes: - nodes.append(int(l[1])) - if int(l[2]) not in nodes: - nodes.append(int(l[2])) - num_lines += 1 - nodes.sort() - # Don't allow user to skip node numbers - for i in range(len(nodes)-1): - assert nodes[i+1] - nodes[i] == 1 - # Don't allow user to start past node 1 - assert nodes[0] == 0 - return nodes,num_lines - -def get_ind_srcs(ptree, voltage = True): - ind_srcs = [] - for l in ptree: - if str(l) != "": - l = str(l).replace("|", "").split() - if (l[0][0] == "V" and voltage) or (l[0][0] == "I" and not voltage): - ind_srcs.append(int(l[0][1:])) - ind_srcs.sort() - for i in range(len(ind_srcs)-1): - assert ind_srcs[i+1] - ind_srcs[i] == 1 - if len(ind_srcs) != 0: - assert ind_srcs[0] == 1 - return ind_srcs - -def lc_filter(ptree): - # Inductors are considered independent sources of voltage 0 - # Capacitors are considered independent sources of current 0 - for l in ptree: - if str(l) != "": - if str(l).replace("|", "").split()[0][0] == "L": - global num_vsrcs - num_vsrcs += 1 - l[0] = "V{}".format(num_vsrcs) - l[3] = "0" - elif str(l).replace("|", "").split()[0][0] == "C": - global num_isrcs - num_isrcs += 1 - l[0] = "I{}".format(num_isrcs) - l[3] = "0" - -# Calculating functions - -def gen_passive_eqn(ptree_node, line_idx): - # f = lambda x : (x[num_nodes + line_idx - 1] * (eval(ptree_node[3]))) - ((x[int(ptree_node[1])-1] if int(ptree_node[1]) != 0 else 0.0) - \ - # (x[int(ptree_node[2])-1] if int(ptree_node[2]) != 0 else 0.0)) - s = "(x[{}] * ({})) - (({}) - ({}))".format(num_nodes + line_idx - 1, ptree_node[3], - "x[" + str(int(ptree_node[1])-1) + "]" if int(ptree_node[1]) != 0 else 0.0, - "x[" + str(int(ptree_node[2])-1) + "]" if int(ptree_node[2]) != 0 else 0.0) - return s - -def gen_vsrc_eqn(ptree_node, line_idx): - # f = lambda x : (eval(ptree_node[3])) - ((x[int(ptree_node[1])-1] if int(ptree_node[1]) != 0 else 0.0) - \ - # (x[int(ptree_node[2])-1] if int(ptree_node[2]) != 0 else 0.0)) - s = "({}) - (({}) - ({}))".format(ptree_node[3], - "x[" + str(int(ptree_node[1])-1) + "]" if int(ptree_node[1]) != 0 else 0.0, - "x[" + str(int(ptree_node[2])-1) + "]" if int(ptree_node[2]) != 0 else 0.0) - return s - -def gen_isrc_eqn(ptree_node, line_idx): - # f = lambda x : (eval(ptree_node[3])) - x[num_nodes + line_idx - 1] - s = "({}) - x[{}]".format(ptree_node[3], num_nodes + line_idx - 1) - return s - -global iteration -iteration = 0 -def top_lambda(x): - y_array = [] - global num_nodes, line_idx, lambda_array - for _l in lambda_array: - y_array.append(_l(x)) - assert len(y_array) == num_nodes + line_idx - 1 - # global iteration - # print("iter {} = {}".format(iteration, y_array)) - # iteration += 1 - return y_array - -def kcl_prepend(s, branch_idx, plus): - global num_nodes - return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx - 1) + s - -def solve(top_lambda): - global num_nodes, line_idx - x = scipy.optimize.root(top_lambda, numpy.ones(num_nodes + line_idx - 1), method='broyden1').x - return x - -def fmt_soln(x): - global num_nodes, line_idx - for n in range(num_nodes - 1): - print("V{} = {} [V]".format(n + 1, x[n])) - # TODO: Current correctness is not guaranteed - for l in range(line_idx): - print("I{} = {} [A]".format(l, x[num_nodes + l - 1])) - -if __name__ == "__main__": - parser = ParserPython(root) - with open(sys.argv[1], "r") as f: - parse_tree = parser.parse(f.read()) - nodes, num_lines = get_nodes(parse_tree) - ind_v_srcs = get_ind_srcs(parse_tree) - ind_i_srcs = get_ind_srcs(parse_tree, voltage = False) - global num_vsrcs, num_isrcs, num_nodes, line_idx - num_vsrcs = len(ind_v_srcs) - num_isrcs = len(ind_i_srcs) - num_nodes = len(nodes) - lc_filter(parse_tree) - line_idx = 0 - global lambda_array - lambda_array = [] - kcl = [""] * (num_nodes - 1) - for r in parse_tree: - _r = str(r).replace("|", "").split() - if _r != [] and _r[0][0] == "R": - lambda_array.append(gen_passive_eqn(_r, line_idx)) - elif _r != [] and _r[0][0] == "V": - lambda_array.append(gen_vsrc_eqn(_r, line_idx)) - elif _r != [] and _r[0][0] == "I": - lambda_array.append(gen_isrc_eqn(_r, line_idx)) - # Must follow this current direction convention. Otherwise, current sources - # break. - if _r != []: - if int(_r[1]) != 0: - kcl[int(_r[1]) - 1] = kcl_prepend(kcl[int(_r[1]) - 1], line_idx, False) - if int(_r[2]) != 0: - kcl[int(_r[2]) - 1] = kcl_prepend(kcl[int(_r[2]) - 1], line_idx, True) - line_idx += 1 - lambda_array += kcl - assert num_lines == line_idx - l_fn_str = "[" + ",".join(lambda_array) + "]" - l_fn = lambda x : eval(l_fn_str) - soln = solve(l_fn) - fmt_soln(soln) - ### - # print("KCL") - # for _k in kcl: - # print(_k) - ### - # lambda_array += [lambda x : eval(eqn) for eqn in kcl] - # top_lambda = lambda x : [l(x) for l in lambda_array] - # fmt_soln(solve(top_lambda)) diff --git a/profile.sh b/profile.sh deleted file mode 100755 index af52d837..00000000 --- a/profile.sh +++ /dev/null @@ -1 +0,0 @@ -python3 -m cProfile -s cumtime ./OpenSPICE.py circuit5_trans_os.cir > log diff --git a/yspice.py b/yspice.py deleted file mode 100755 index fdda3b69..00000000 --- a/yspice.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python3 - -from arpeggio import ZeroOrMore, EOF, ParserPython -from arpeggio import RegExMatch -import numpy -import sys - -# https://pypi.org/project/Arpeggio/1.0/ - -### Parsing Functions ### - -def root(): - return ZeroOrMore(element), EOF - -# TODO: check -def element(): - return el, node, node, val, RegExMatch(r';') - -def el(): - return RegExMatch(r'(R\d+)|(V\d+)|(L\d+)|(C\d+)') - -# Only # names -def node(): - return RegExMatch(r'\d+') - -# TODO: check -def val(): - return RegExMatch(r'\d*\.\d*|\d+') - -### Matrix Construction Functions ### - -def get_nodes(ptree): - nodes = [] - for l in ptree: - if str(l) != "": - l = str(l).replace("|", "").split() - if int(l[1]) not in nodes and int(l[1]) != 0: - nodes.append(int(l[1])) - if int(l[2]) not in nodes and int(l[2]) != 0: - nodes.append(int(l[2])) - nodes.sort() - # Don't allow user to skip node numbers - for i in range(len(nodes)-1): - assert nodes[i+1] - nodes[i] == 1 - # Don't allow user to start past node 1 - assert nodes[0] == 1 - return nodes - -def get_ind_srcs(ptree, voltage = True): - ind_srcs = [] - for l in ptree: - if str(l) != "": - l = str(l).replace("|", "").split() - if (l[0][0] == "V" and voltage) or (l[0][0] == "I" and not voltage): - ind_srcs.append(int(l[0][1:])) - ind_srcs.sort() - for i in range(len(ind_srcs)-1): - assert ind_srcs[i+1] - ind_srcs[i] == 1 - if len(ind_srcs) != 0: - assert ind_srcs[0] == 1 - return ind_srcs - -def lc_filter(ptree): - # Inductors are considered independent sources of voltage 0 - # Capacitors are considered independent sources of current 0 - for l in ptree: - if str(l) != "": - if str(l).replace("|", "").split()[0][0] == "L": - global num_vsrcs - num_vsrcs += 1 - l[0] = "V{}".format(num_vsrcs) - l[3] = "0" - elif str(l).replace("|", "").split()[0][0] == "C": - global num_isrcs - num_isrcs += 1 - l[0] = "I{}".format(num_isrcs) - l[3] = "0" - -if __name__ == "__main__": - parser = ParserPython(root) - with open(sys.argv[1], "r") as f: - parse_tree = parser.parse(f.read()) - nodes = get_nodes(parse_tree) - ind_v_srcs = get_ind_srcs(parse_tree) - ind_i_srcs = get_ind_srcs(parse_tree, voltage = False) - global num_vsrcs, num_isrcs - num_vsrcs = len(ind_v_srcs) - num_isrcs = len(ind_i_srcs) - lc_filter(parse_tree) - A_matrix = numpy.zeros([len(nodes) + num_vsrcs, len(nodes) + num_vsrcs]) - z_vector = numpy.zeros([len(nodes) + num_vsrcs, 1]) - for r in parse_tree: - _r = str(r).replace("|", "").split() - if _r != [] and _r[0][0] == "R": - if int(_r[1]) != 0 and int(_r[2]) != 0: - A_matrix[int(_r[1]) - 1][int(_r[2]) - 1] = -1.00 / float(_r[3]) - A_matrix[int(_r[2]) - 1][int(_r[1]) - 1] = -1.00 / float(_r[3]) - if int(_r[1]) != 0: - A_matrix[int(_r[1]) - 1][int(_r[1]) - 1] += 1.00 / float(_r[3]) - if int(_r[2]) != 0: - A_matrix[int(_r[2]) - 1][int(_r[2]) - 1] += 1.00 / float(_r[3]) - elif _r != [] and _r[0][0] == "V": - if int(_r[1]) != 0: - A_matrix[len(nodes) + int(_r[0][1:]) - 1][int(_r[1]) - 1] = 1.00 - A_matrix[int(_r[1]) - 1][len(nodes) + int(_r[0][1:]) - 1] = 1.00 - if int(_r[2]) != 0: - A_matrix[len(nodes) + int(_r[0][1:]) - 1][int(_r[2]) - 1] = -1.00 - A_matrix[int(_r[2]) - 1][len(nodes) + int(_r[0][1:]) - 1] = -1.00 - z_vector[len(nodes) + int(_r[0][1:]) - 1][0] = float(_r[3]) - elif _r != [] and _r[0][0] == "I": - z_vector[int(_r[1])][0] -= float(_r[3]) - z_vector[int(_r[2])][0] += float(_r[3]) - soln = numpy.linalg.solve(A_matrix, z_vector) - for i in range(len(nodes)): - print("Node {}: {} [V]".format(i + 1, soln[i][0])) From 1c4cf8833d306349f8f03e7cd4aa0eb301cfbeec Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 28 Mar 2022 10:16:12 -0700 Subject: [PATCH 042/115] Get examples passing. Many tests excluded. No guarantee of correctness. --- OpenSPICE/__init__.py | 1 - OpenSPICE/__main__.py | 61 ------------ .../__pycache__/OpenSPICE.cpython-38.pyc | Bin 4223 -> 0 bytes OpenSPICE/__pycache__/__init__.cpython-38.pyc | Bin 140 -> 0 bytes OpenSPICE/__pycache__/__main__.cpython-38.pyc | Bin 1284 -> 0 bytes .../Spice/OpenSPICE}/OpenSPICE.py | 88 ++++++++++++------ PySpice/Spice/OpenSPICE/Server.py | 5 +- PySpice/Spice/RawFile.py | 9 +- PySpice/Spice/Simulation.py | 4 +- examples/data-analysis/fft.py | 2 +- examples/diode/zener-characteristic-curve.py | 1 + examples/electricity/three-phase.py | 2 +- examples/resistor/voltage-divider.py | 6 +- examples/run-examples | 19 +++- examples/transformer/transformer-example.py | 1 + examples/transistor/nmos-transistor.py | 4 +- 16 files changed, 97 insertions(+), 106 deletions(-) delete mode 100644 OpenSPICE/__init__.py delete mode 100644 OpenSPICE/__main__.py delete mode 100644 OpenSPICE/__pycache__/OpenSPICE.cpython-38.pyc delete mode 100644 OpenSPICE/__pycache__/__init__.cpython-38.pyc delete mode 100644 OpenSPICE/__pycache__/__main__.cpython-38.pyc rename {OpenSPICE => PySpice/Spice/OpenSPICE}/OpenSPICE.py (79%) diff --git a/OpenSPICE/__init__.py b/OpenSPICE/__init__.py deleted file mode 100644 index fea80f99..00000000 --- a/OpenSPICE/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .OpenSPICE import * diff --git a/OpenSPICE/__main__.py b/OpenSPICE/__main__.py deleted file mode 100644 index cfa03a26..00000000 --- a/OpenSPICE/__main__.py +++ /dev/null @@ -1,61 +0,0 @@ -from sys import argv -import struct -# from OpenSPICE import * - -def spice_input(output_filename): - # sp = SpiceParser(source=spice_txt) - # print(sp) - # dump raw file for op point sim - print("--- LOLCATZ :: {} ---".format(output_filename)) - with open(output_filename, "w") as spice_raw_file: - spice_raw_file_txt = "Title: **.subckt rlc\n" - spice_raw_file_txt += "Date: Thu Jun 11 23:17:40 2020\n" - spice_raw_file_txt += "Plotname: Transient Analysis\n" - spice_raw_file_txt += "Flags: real\n" - spice_raw_file_txt += "No. Variables: 31\n" - spice_raw_file_txt += "No. Points: 1\n" - spice_raw_file_txt += "Variables:\n" - spice_raw_file_txt += "\t0\ttime\ttime\n" - spice_raw_file_txt += "\t1\tnode0\tvoltage\n" - spice_raw_file_txt += "\t2\tnode1\tvoltage\n" - spice_raw_file_txt += "\t3\tnode2\tvoltage\n" - spice_raw_file_txt += "\t4\tnode3\tvoltage\n" - spice_raw_file_txt += "\t5\tnode4\tvoltage\n" - spice_raw_file_txt += "\t6\tnode5\tvoltage\n" - spice_raw_file_txt += "\t7\tnode6\tvoltage\n" - spice_raw_file_txt += "\t8\tnode7\tvoltage\n" - spice_raw_file_txt += "\t9\tnode8\tvoltage\n" - spice_raw_file_txt += "\t10\tnode9\tvoltage\n" - spice_raw_file_txt += "\t11\tnode10\tvoltage\n" - spice_raw_file_txt += "\t12\tnode11\tvoltage\n" - spice_raw_file_txt += "\t13\tnode12\tvoltage\n" - spice_raw_file_txt += "\t14\tnode13\tvoltage\n" - spice_raw_file_txt += "\t15\ti(branch0)\tcurrent\n" - spice_raw_file_txt += "\t16\ti(branch1)\tcurrent\n" - spice_raw_file_txt += "\t17\ti(branch2)\tcurrent\n" - spice_raw_file_txt += "\t18\ti(branch3)\tcurrent\n" - spice_raw_file_txt += "\t19\ti(branch4)\tcurrent\n" - spice_raw_file_txt += "\t20\ti(branch5)\tcurrent\n" - spice_raw_file_txt += "\t21\ti(branch6)\tcurrent\n" - spice_raw_file_txt += "\t22\ti(branch7)\tcurrent\n" - spice_raw_file_txt += "\t23\ti(branch8)\tcurrent\n" - spice_raw_file_txt += "\t24\ti(branch9)\tcurrent\n" - spice_raw_file_txt += "\t25\ti(branch10)\tcurrent\n" - spice_raw_file_txt += "\t26\ti(branch11)\tcurrent\n" - spice_raw_file_txt += "\t27\ti(branch12)\tcurrent\n" - spice_raw_file_txt += "\t28\ti(branch13)\tcurrent\n" - spice_raw_file_txt += "\t29\ti(branch14)\tcurrent\n" - spice_raw_file_txt += "\t30\ti(branch15)\tcurrent\n" - spice_raw_file_txt += "Binary:\n" - format_float = lambda x : hex(struct.unpack('&0rl8*|rsuGiTpir-dtt2SC?tvD_yDu&`fG%OIL z29Pb&;KlSYsXQvVT9*Z~TSo|y(P^Yz!=gP#oz z6&Q}c{rQLMe>}(7KdEv27(nATuJFGQf(h=k7I%0{b2LtE&DUFoV<=ts%~sCIDc$h% zEz7Z>o6dm9IR%jy)@$YrHklX@g$-Q{isEbT6vdDzp?^r65oO#<;;b0P{fsy#D!7-$ zc`<_fSuuboNAaW~#>6p+_Bez5K*@=5 zwx{E2_(jfh8D%=}6=CMiBCCjak zkDl)_rJJzOXcX_uK{rUpV)9Gf{LX6hsfgARzSA|JuXQbws~?HAL=#cMqpFeQrQ7lA z4L31mJ!ra#?z;g1h-5YA817C-CPwJGLRwfrGSKowErMZ~SdrIq!^rIc*C`boRxPRn+y9!x)P%gyN*3bN^MI&ScA`Kx;mjVxD403wWbJNYbjg zME8Oy$<;exhydN%GCG1YDcuPXYmwIu9!S}iRYQ*9sl*K0f-v?KP^S?cXu45NS$qKF za0G&gWdX`zToq^)ei@p)f{_NnczBRbj#ZG_Pz2uvfn-r=fhK6l+9(so7~9igHcE6b z5o#}cJF72yYy14ueLg8K;V~qO+(uir>WDIV79Ghzu-!^0<0!1*VO0 z(HXiNXb0FM9MLLwn+Ntq3WNZSaULVG*vY)3WZ z<4Ng@D~dIYHnT zDLEVjx&bR4Rt7A1Y=Hkr0-5EUNRy)SNVoXtWzYVR4YB%Yty}ymYu#C^>dGmJ*^!8N z`8`ahYO1v=kH~B2NO+L&_0uc0Hd;{)s}1hJB%}o~0Iq7pb?A~piFOiwC28oa=MQd>`X|tyheTu@w&}G7l`Bh-D%RIqV^> zkVxCagx5w?EHlIp@-L>(_xSI$ErW<7KY`Icw~=eiu;Y6Xab{{p&Y}A>goOnvEsb`o zb90H_pC%3s?C6fSJGD+UwcxiKbw9ib<a1p1OlLUG4(7$>`NIi( zr^)Y={^4QAQI3;epzm8;A-yq&P~0@@pGG4ZAMKAdQNk|8}@5H~j=3 z2nl+I5;m+EysVXwghr5xM!2N-H~}MJnqCqOd->lu=O?-b^#}N?HYtcVSb_r`ee} zo|q4o?$=fl?f#0Ied@vYF@m~z3pb~rcAP5w(+qtZy{Fup3@9Vd4Wb%GL-GYxe5&*X zZ34+c-bc>~Xeiw1|3~GZ(^6uHC?)k~dN&D+>zP@*7#j)q-Dfgl$ z;m^C36)*DLdHbFx8{1xFt7iA|{d$DXhueX@=&svyv-a%l{M--bXRq6HGqX3kyDx|Bdbt^(bRBXS;=? z!LB}I&ybiUF-PJv64yz5-p$|jg1US$54Tg9RplWu+Smal=5y&qZdG&692CP159JUO zbV?!pkJV)Td5!u`vtlqE_5xH;4=)XE2xgSRwQ*b+6LD-|Fm| zs%qD4)tWoe`YdfJ#;fg!N`MKMU2Re>RWCXQwt-J15l&Kd##CxU zzpfXdq?G4WmeZf6DfR0#mHuu@%GmNQ31V!To>Zc`LQS>Pq5Vgip{|og*+B6=TM~g* zs~rI>7h#g<(N2`^oM?-38boWM)fU^ndz0oLUWF(FKb%NDhGiAXd27hh)m0oGwhGpH KOYN=8+W!Crh+shg diff --git a/OpenSPICE/__pycache__/__init__.cpython-38.pyc b/OpenSPICE/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 8aad6868abd27dcd24407a3d3d0ad85608f89f69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmWIL<>g`kf-@=BNg(<$h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vIzqGhWKO;Xk zRlg`dH!)AYJijPgzcRQWGdWe?zaTX)IKb1{RX;vHGcU6wK3=b&@)n0pZhlH>PO2Tq JsLw#m005jT9{K

fgc5Z$$%G;PyRMM9_&Ld%UvG>+322?G@nsDxD7(iDn}khO`oWre@A-jF7w zr*h!NUueaNf530?l~eu#7npT|Xiv^cp4A(_H}h8Z?CYha1qAE+&j+192136SxV+{8 zJccLv3c*7j_ECTxjFG2#`WNJAO!tg)gJG|*f*=;NIJbf>^fO?w!sLxtI@7*wIz?d5 z|6^a^jG=oASw?9l84Wamrf(P3euy^EE3}W^BCp&=wWTq*K{cEjR2+ZmVuhwlhh3R& z!INx4kYM^8kEX??HUjHl=H@B(^ixfuk)|4q@VP$HF0Qsh(8|~uUSC~ZCEL5(ttST# zv2F7Clt3oMeY&L~^puBG4D1DxvktiQnN3<;bbDNq4CacSQ3;xMFC<&6Lz)(`EW3H% zw$@3rVcpA>@A;7oX#gd5VoX^qr_q-cZ45$7dkR zccuiH6JT4p<^Pw?r8Y=o22Os<25HVvXKe<~`V5?nnvoV_0beF99z`OcGBu)@g=wKL zxMVfmxfb`DR_nG>nP9=$Xm$`!Wvz$}Cid}gke;`qU3HWW9y+oKFqJWtq3TSBd zBk|E3v{eBU{*17__oDUOblrgR&~@waAYGhP<015fdjTccHDOe685@-n777mUsOfuW zy(f=gChn39HLswx2^y;j9mBAov6{~mi(z%2QBVDkM_>u$^?H4{d%m4rY diff --git a/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py similarity index 79% rename from OpenSPICE/OpenSPICE.py rename to PySpice/Spice/OpenSPICE/OpenSPICE.py index 243996e6..531b1d63 100755 --- a/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -53,14 +53,14 @@ def get_nodes(lines): for l in lines.split("\n"): if l != "": l = l.split(" ") - if int(l[1]) not in nodes: - nodes.append(int(l[1])) - if int(l[2]) not in nodes: - nodes.append(int(l[2])) - nodes.sort() - # for i in range(len(nodes)-1): - # assert nodes[i+1] - nodes[i] == 1 - assert nodes[0] == 0 + if l[1] not in nodes: + nodes.append(l[1]) + if l[2] not in nodes: + nodes.append(l[2]) + assert "0" in nodes + nodes.remove("0") + nodes = ["0"] + nodes + assert nodes[0] == "0" return nodes def kcl_prepend(s, num_nodes, branch_idx, plus): @@ -68,7 +68,6 @@ def kcl_prepend(s, num_nodes, branch_idx, plus): def get_kcl_eqns(lines): nodes = get_nodes(lines) - assert nodes[0] == 0 num_nodes = len(nodes) node_dict = dict(zip(nodes[1:], range(len(nodes[1:])))) num_branches = len(lines) @@ -76,10 +75,10 @@ def get_kcl_eqns(lines): lines = [n.split(" ") for n in lines.split("\n") if n != ""] for i in range(len(lines)): if lines[i][1] != "0": - node_0 = node_dict[int(lines[i][1])] + node_0 = node_dict[lines[i][1]] kcl[node_0-1] = kcl_prepend(kcl[node_0-1], num_nodes, i, False) if lines[i][2] != "0": - node_1 = node_dict[int(lines[i][2])] + node_1 = node_dict[lines[i][2]] kcl[node_1-1] = kcl_prepend(kcl[node_1-1], num_nodes, i, True) return [kcl,num_nodes,num_branches,node_dict] @@ -149,8 +148,8 @@ def transient(netlist): trans_soln.append(soln) global send_data DUMMY_SPICE_ID = 0 - voltage_list = ['V({})'.format(n) for n in get_nodes(netlist) if n != 0] - actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist) if n != 0])) + voltage_list = ['V({})'.format(n) for n in get_nodes(netlist) if n != "0"] + actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist) if n != "0"])) actual_vector_values['time'] = DT*i number_of_vectors = num_nodes timesteps.append(DT*i) @@ -162,14 +161,14 @@ def next_v_txt(node_no, nodes_arr): if node_no == "0": return "0.00" else: - return "x[t+dt][{}]".format(node_dict[int(node_no)]) + return "x[t+dt][{}]".format(node_dict[node_no]) def curr_v_txt(node_no, nodes_arr): node_dict = dict(zip(nodes_arr[1:], range(len(nodes_arr[1:])))) if node_no == "0": return "0.00" else: - return "x[t][{}]".format(node_dict[int(node_no)]) + return "x[t][{}]".format(node_dict[node_no]) def next_i_txt(branch_no, num_nodes): return "x[t+dt][{}]".format(num_nodes - 1 + branch_no) @@ -190,11 +189,13 @@ def netlist_translate(netlist_txt, nodes_arr): _line = line.split(" ") if line[0] == "R": # Resistor + _line[3] = _line[3].replace("k","e3") _line[3] = "({}-{})-(({})*({}))".format(next_v_txt(_line[1], nodes_arr), next_v_txt(_line[2], nodes_arr), next_i_txt(line_count, len(nodes_arr)), _line[3].replace("Ohm", "")) elif line[0] == "V": # Voltage source + _line[3] = _line[3].replace("k","e3") _line[3] = _line[3].replace('dc', 'dcv') _line[3] = "({}-{})-({})".format(next_v_txt(_line[1], nodes_arr), next_v_txt(_line[2], nodes_arr), _line[3].replace("V", "")) @@ -204,6 +205,7 @@ def netlist_translate(netlist_txt, nodes_arr): assert len(_line) != 6 elif line[0] == "I": # Current source + _line[3] = _line[3].replace("k","e3") _line[3] = _line[3].replace('dc', 'dci') _line[3] = "({})-({})".format(next_i_txt(line_count, len(nodes_arr)), _line[3].replace("A", "")) @@ -213,6 +215,7 @@ def netlist_translate(netlist_txt, nodes_arr): assert len(_line) != 6 elif line[0] == "L": # Inductor + _line[3] = _line[3].replace("k","e3") _line[3] = "(({}-{})*dt)-(({})*(({})-({}))) (({})-({}))".format(next_v_txt(line[1], nodes_arr), next_v_txt(line[2], nodes_arr), _line[3].replace("H", ""), @@ -222,6 +225,7 @@ def netlist_translate(netlist_txt, nodes_arr): curr_v_txt(line[2], nodes_arr)) elif line[0] == "C": # Capacitor + _line[3] = _line[3].replace("k","e3") _line[3] = "({}*dt)-(({})*(({}-{})-({}-{})))".format(next_i_txt(line_count, len(nodes_arr)), _line[3].replace("F", ""), next_v_txt(_line[1], nodes_arr), @@ -267,27 +271,59 @@ def filter_dot_statements(contents_txt): del contents_txt_arr[line_idx] return "\n".join(contents_txt_arr) -def spice_input(input_filename, output_filename): +def get_sim_type(netlist_file_contents): + lines = netlist_file_contents.split("\n") + for l in lines: + if ".op" in l: + return "op_pt" + elif ".tran" in l: + return "transient" + return "op_pt" + +def _spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() + print(netlist_file_contents) netlist_file_contents = filter_dot_statements(netlist_file_contents) nodes_arr = get_nodes(netlist_file_contents) _netlist = netlist_translate(netlist_file_contents, nodes_arr) - [soln,voltage_list,timesteps] = transient(_netlist) - assert len(soln) == len(timesteps) + sim_type = get_sim_type(netlist_file_contents) + if sim_type == "transient": + [soln,voltage_list,timesteps] = transient(_netlist) + assert len(soln) == len(timesteps) + elif sim_type == "op_pt": + [soln,num_nodes,num_branches,node_dict] = op_pt(_netlist) + voltage_list = ['V({})'.format(n) for n in get_nodes(_netlist) if n != "0"] + else: + assert False with open(output_filename, "w") as spice_raw_file: spice_raw_file_txt = "Title: MyCircuit\n" spice_raw_file_txt += "Date: Thu Jun 11 23:17:40 2020\n" - spice_raw_file_txt += "Plotname: Transient Analysis\n" + if sim_type == "transient": + spice_raw_file_txt += "Plotname: Transient Analysis\n" + elif sim_type == "op_pt": + spice_raw_file_txt += "Plotname: Operating Point\n" spice_raw_file_txt += "Flags: real\n" - spice_raw_file_txt += "No. Variables: {}\n".format(len(voltage_list)) - spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) + if sim_type == "transient": + spice_raw_file_txt += "No. Variables: {}\n".format(1 + len(voltage_list)) + spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) + elif sim_type == "op_pt": + spice_raw_file_txt += "No. Variables: {}\n".format(len(voltage_list)) + spice_raw_file_txt += "No. Points: {}\n".format(1) spice_raw_file_txt += "Variables:\n" - spice_raw_file_txt += "\t0\ttime\ttime\n" - spice_raw_file_txt += "\n".join(["\t{}\t{}\tvoltage".format(1+i,v) for i,v in enumerate(voltage_list)]) + if sim_type == "transient": + spice_raw_file_txt += "\t0\ttime\ttime\n" + spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(1+i,v) for i,v in enumerate(voltage_list)]) + elif sim_type == "op_pt": + spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(i,v) for i,v in enumerate(voltage_list)]) spice_raw_file_txt += "Binary:\n" format_float = lambda x : hex(struct.unpack('d', bytes.fromhex(a))[0] for a in input_data]) input_data = input_data.reshape((self.number_of_points, number_of_columns)) input_data = input_data.transpose() - # np.savetxt('raw.txt', input_data) if self.flags == 'complex': raw_data = input_data input_data = np.array(raw_data[0::2], dtype='complex128') diff --git a/PySpice/Spice/Simulation.py b/PySpice/Spice/Simulation.py index f2d1b724..d82a62b2 100644 --- a/PySpice/Spice/Simulation.py +++ b/PySpice/Spice/Simulation.py @@ -1124,10 +1124,10 @@ class CircuitSimulator(CircuitSimulation): _logger = _module_logger.getChild('CircuitSimulator') if ConfigInstall.OS.on_windows: - DEFAULT_SIMULATOR = 'ngspice-shared' + DEFAULT_SIMULATOR = 'OpenSPICE' else: # DEFAULT_SIMULATOR = 'ngspice-subprocess' - DEFAULT_SIMULATOR = 'ngspice-shared' + DEFAULT_SIMULATOR = 'OpenSPICE' # DEFAULT_SIMULATOR = 'xyce-serial' # DEFAULT_SIMULATOR = 'xyce-parallel' diff --git a/examples/data-analysis/fft.py b/examples/data-analysis/fft.py index 8e82dd2a..a4bc80fe 100644 --- a/examples/data-analysis/fft.py +++ b/examples/data-analysis/fft.py @@ -100,4 +100,4 @@ #################################################################################################### -plt.show() +# plt.show() diff --git a/examples/diode/zener-characteristic-curve.py b/examples/diode/zener-characteristic-curve.py index 93a2c03c..e5e6e0ac 100755 --- a/examples/diode/zener-characteristic-curve.py +++ b/examples/diode/zener-characteristic-curve.py @@ -36,6 +36,7 @@ circuit.R(1, 'in', 'out', 1@u_Ω) # not required for simulation # circuit.X('D1', '1N4148', 'out', circuit.gnd) circuit.X('DZ1', 'd1n5919brl', 'out', circuit.gnd) +print(circuit) simulator = circuit.simulator(temperature=25, nominal_temperature=25) analysis = simulator.dc(Vinput=slice(-10, 2, .05)) # 10mV diff --git a/examples/electricity/three-phase.py b/examples/electricity/three-phase.py index 0a6ce6dc..832c925f 100644 --- a/examples/electricity/three-phase.py +++ b/examples/electricity/three-phase.py @@ -94,6 +94,6 @@ ax.axhline(y=rms_tri, color='blue') ax.axhline(y=-rms_tri, color='blue') -plt.show() +# plt.show() #f# save_figure('figure', 'three-phase.png') diff --git a/examples/resistor/voltage-divider.py b/examples/resistor/voltage-divider.py index 2ae80131..d41675fb 100755 --- a/examples/resistor/voltage-divider.py +++ b/examples/resistor/voltage-divider.py @@ -16,8 +16,8 @@ circuit = Circuit('Voltage Divider') -circuit.V('input', 'in', circuit.gnd, 10@u_V) -circuit.R(1, 'in', 'out', 9@u_kΩ) +circuit.V('input', 'in_node', circuit.gnd, 10@u_V) +circuit.R(1, 'in_node', 'out', 9@u_kΩ) circuit.R(2, 'out', circuit.gnd, 1@u_kΩ) #################################################################################################### @@ -25,7 +25,7 @@ simulator = circuit.simulator(temperature=25, nominal_temperature=25) analysis = simulator.operating_point() -for node in (analysis['in'], analysis.out): # .in is invalid ! +for node in (analysis['in_node'], analysis.out): # .in is invalid ! print('Node {}: {} V'.format(str(node), float(node))) #o# diff --git a/examples/run-examples b/examples/run-examples index 631c78a2..5a665b80 100755 --- a/examples/run-examples +++ b/examples/run-examples @@ -33,11 +33,20 @@ import sys examples_path = Path(__file__).resolve().parent +excluded_topics = [".travis", "transformer", "diode", "fundamental-laws", "relay", + "transmission-lines", "switched-power-supplies", "filter", + "transistor", "ngspice-shared", "power-supplies", + "spice-parser", "passive", "operational-amplifier"] + +print("Running examples!") for topic in os.listdir(examples_path): - python_files = glob.glob(str(examples_path.joinpath(topic, '*.py'))) - for file_name in python_files: - if file_name.islower(): + if topic not in excluded_topics: + print("Topic = " + topic) + python_files = glob.glob(str(examples_path.joinpath(topic, '*.py'))) + for file_name in python_files: print('Run {}'.format(file_name)) - subprocess.call(('python', file_name)) - print('To continue press Enter') + c = subprocess.call(('python3', file_name)) + assert c == 0 + # Only checks passing. Does not check results. + print('Test passed. To continue press Enter...') rc = sys.stdin.readline().strip() diff --git a/examples/transformer/transformer-example.py b/examples/transformer/transformer-example.py index dc4153e3..09ed956c 100644 --- a/examples/transformer/transformer-example.py +++ b/examples/transformer/transformer-example.py @@ -37,6 +37,7 @@ circuit.subcircuit(Transformer(turn_ratio=10)) circuit.X('transformer', 'Transformer', 'input', circuit.gnd, 'output', circuit.gnd) circuit.R('load', 'output', circuit.gnd, 1@u_kΩ) +print(circuit) simulator = circuit.simulator(temperature=25, nominal_temperature=25) analysis = simulator.transient(step_time=ac_line.period/200, end_time=ac_line.period*3) diff --git a/examples/transistor/nmos-transistor.py b/examples/transistor/nmos-transistor.py index fe5b8e11..7d7e9fdc 100644 --- a/examples/transistor/nmos-transistor.py +++ b/examples/transistor/nmos-transistor.py @@ -58,7 +58,7 @@ ax.set_xlabel('Vgs [V]') ax.set_ylabel('Id [mA]') -plt.tight_layout() -plt.show() +# plt.tight_layout() +# plt.show() #f# save_figure('figure', 'transistor-nmos-plot.png') From 628fd5f0ea67513c6b50fb609d3b63ec1d8597cb Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 28 Mar 2022 15:04:00 -0700 Subject: [PATCH 043/115] Made some headway on AC analysis. Need to figure out complex number hack for scipy.optimize.root. --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 96 ++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index 531b1d63..b71a7b80 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -1,9 +1,11 @@ #!/usr/bin/env python3 -from math import sin, pi +from math import sin, pi, exp from scipy.optimize import root from sys import argv from PySpice.Spice.Parser import SpiceParser import struct +from functools import reduce +from operator import concat get_vsrc = None get_isrc = None @@ -181,53 +183,124 @@ def filter_voltages(input_str, nodes_arr): input_str = input_str.replace("v({})".format(node), next_v_txt(str(node), nodes_arr)) return input_str +def paranth_split(arr): + par_split = [(i, k.split(")")) if ")" in k else (i, k) for i,k in enumerate(arr.split("("))] + par_split_dict = dict(par_split) + par_replace = [(_y[0], _y[1][0].replace(" ", ",")) for _y in par_split if type(_y[1]) == list] + par_replace_dict = dict(par_replace) + final_list = [['(' + par_replace_dict[i] + ')'] + v[1:] if type(v) == list else [v] for i,v in enumerate(par_split_dict.values())] + return "".join(reduce(concat, final_list)) + +def filter_sin(txt): + # txt is expected to be of the form SIN(X,X,X,X,X,X) + interior = txt[txt.find("(")+1:][:-1] + assert "SIN(" + interior + ")" == txt + param_list = interior.split(",") + param_names = ["(V0)", "(VA)", "(FREQ)", "(TD)", "(THETA)", "(PHASE)"] + print(param_list) + print(param_names) + assert len(param_list) <= len(param_names) + assert len(param_list) >= 2 + if len(param_list) < len(param_names): + sub_dict = {} + for i in range(len(param_list)): + sub_dict[param_names[i]] = param_list[i].replace("Hz","")\ + .replace("s","")\ + .replace("V","")\ + .replace("k","e3")\ + .replace("u","e-6")\ + .replace("m","e-3") + print("len(param_list) = {}".format(len(param_list))) + if len(param_list) <= 5: + sub_dict[param_names[5]] = str(0.0) + if len(param_list) <= 4: + sub_dict[param_names[4]] = str(0.0) + if len(param_list) <= 3: + sub_dict[param_names[3]] = str(0.0) + if len(param_list) <= 2: + sub_dict[param_names[2]] = str(1.0 / END_T) + else: + sub_dict = dict(zip(param_names, param_list)) + cond0 = "0<=t<(TD)" + cond1 = "t>=(TD)" + state0 = "((V0))" + state1 = "((V0))+((VA)*exp(-(t-((TD)))*((THETA)))*sin(2*pi*((FREQ))*(t-(TD))+((PHASE))))" + for l in param_names: + cond0 = cond0 .replace(l, sub_dict[l]) + cond1 = cond1 .replace(l, sub_dict[l]) + state0 = state0.replace(l, sub_dict[l]) + state1 = state1.replace(l, sub_dict[l]) + interior = "((({})*({}))+(({})*({})))".format(cond0,state0,cond1,state1) + return "sin(" + interior + ")" + def netlist_translate(netlist_txt, nodes_arr): new_netlist_txt = "" line_count = 0 for line in netlist_txt.split("\n"): if line != "": _line = line.split(" ") + print(_line) if line[0] == "R": # Resistor + _line[3] = _line[3].replace("Ohm", "") _line[3] = _line[3].replace("k","e3") + _line[3] = _line[3].replace("u","e-6") + _line[3] = _line[3].replace("m","e-3") _line[3] = "({}-{})-(({})*({}))".format(next_v_txt(_line[1], nodes_arr), next_v_txt(_line[2], nodes_arr), - next_i_txt(line_count, len(nodes_arr)), _line[3].replace("Ohm", "")) + next_i_txt(line_count, len(nodes_arr)), _line[3]) elif line[0] == "V": # Voltage source + _line[3] = _line[3].replace("V", "") _line[3] = _line[3].replace("k","e3") + _line[3] = _line[3].replace("u","e-6") + _line[3] = _line[3].replace("m","e-3") _line[3] = _line[3].replace('dc', 'dcv') + if len(_line) == 8: + dc_offset = _line[4].replace("V","") + ac_amplitude = _line[6].replace("V","") + _line[3] = "({})*({})+({})".format(ac_amplitude, filter_sin(_line[7]), dc_offset) + _line = _line[:4] _line[3] = "({}-{})-({})".format(next_v_txt(_line[1], nodes_arr), - next_v_txt(_line[2], nodes_arr), _line[3].replace("V", "")) + next_v_txt(_line[2], nodes_arr), _line[3]) if len(_line) == 6 and _line[5] == "external": del _line[5] del _line[4] assert len(_line) != 6 elif line[0] == "I": # Current source + _line[3] = _line[3].replace("A", "") _line[3] = _line[3].replace("k","e3") + _line[3] = _line[3].replace("u","e-6") + _line[3] = _line[3].replace("m","e-3") _line[3] = _line[3].replace('dc', 'dci') _line[3] = "({})-({})".format(next_i_txt(line_count, len(nodes_arr)), - _line[3].replace("A", "")) + _line[3]) if len(_line) == 6 and _line[5] == "external": del _line[5] del _line[4] assert len(_line) != 6 elif line[0] == "L": # Inductor + _line[3] = _line[3].replace("H","") _line[3] = _line[3].replace("k","e3") - _line[3] = "(({}-{})*dt)-(({})*(({})-({}))) (({})-({}))".format(next_v_txt(line[1], nodes_arr), - next_v_txt(line[2], nodes_arr), - _line[3].replace("H", ""), + _line[3] = _line[3].replace("u","e-6") + _line[3] = _line[3].replace("m","e-3") + _line[3] = "(({}-{})*dt)-(({})*(({})-({}))) (({})-({}))".format(next_v_txt(_line[1], nodes_arr), + next_v_txt(_line[2], nodes_arr), + _line[3], next_i_txt(line_count, len(nodes_arr)), curr_i_txt(line_count, len(nodes_arr)), - curr_v_txt(line[1], nodes_arr), - curr_v_txt(line[2], nodes_arr)) + curr_v_txt(_line[1], nodes_arr), + curr_v_txt(_line[2], nodes_arr)) elif line[0] == "C": # Capacitor + _line[3] = _line[3].replace("F", "") _line[3] = _line[3].replace("k","e3") + _line[3] = _line[3].replace("u","e-6") + _line[3] = _line[3].replace("m","e-3") _line[3] = "({}*dt)-(({})*(({}-{})-({}-{})))".format(next_i_txt(line_count, len(nodes_arr)), - _line[3].replace("F", ""), + _line[3], next_v_txt(_line[1], nodes_arr), next_v_txt(_line[2], nodes_arr), curr_v_txt(_line[1], nodes_arr), @@ -283,8 +356,9 @@ def get_sim_type(netlist_file_contents): def _spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() - print(netlist_file_contents) netlist_file_contents = filter_dot_statements(netlist_file_contents) + netlist_file_contents = "\n".join([paranth_split(n) for n in netlist_file_contents.split("\n") if n != '']) + print(netlist_file_contents) nodes_arr = get_nodes(netlist_file_contents) _netlist = netlist_translate(netlist_file_contents, nodes_arr) sim_type = get_sim_type(netlist_file_contents) From 7038689851e9caceb7a52bd5b0d088a2c727e39b Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 28 Mar 2022 15:10:57 -0700 Subject: [PATCH 044/115] Enable fundamental laws tests --- examples/run-examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/run-examples b/examples/run-examples index 5a665b80..a9209032 100755 --- a/examples/run-examples +++ b/examples/run-examples @@ -33,7 +33,7 @@ import sys examples_path = Path(__file__).resolve().parent -excluded_topics = [".travis", "transformer", "diode", "fundamental-laws", "relay", +excluded_topics = [".travis", "transformer", "diode", "relay", "transmission-lines", "switched-power-supplies", "filter", "transistor", "ngspice-shared", "power-supplies", "spice-parser", "passive", "operational-amplifier"] From c95759324da20dace6493e707d5e9f1f259dd5cd Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 28 Mar 2022 17:49:51 -0700 Subject: [PATCH 045/115] Got passive test yielding results. Not sure if they're correct --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 98 +++++++++++++++++++++----- PySpice/Spice/RawFile.py | 5 +- examples/passive/capacitor-inductor.py | 8 +-- 3 files changed, 87 insertions(+), 24 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index b71a7b80..c53a4724 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -7,9 +7,9 @@ from functools import reduce from operator import concat -get_vsrc = None -get_isrc = None -send_data = None +get_vsrc = lambda dc_vals, timestep, node_id, ngspice_id : None +get_isrc = lambda dc_vals, timestep, node_id, ngspice_id : None +send_data = lambda actual_vector_values, number_of_vectors, ngspice_id : None END_T = 1000.00 DT = 0.1 @@ -197,8 +197,6 @@ def filter_sin(txt): assert "SIN(" + interior + ")" == txt param_list = interior.split(",") param_names = ["(V0)", "(VA)", "(FREQ)", "(TD)", "(THETA)", "(PHASE)"] - print(param_list) - print(param_names) assert len(param_list) <= len(param_names) assert len(param_list) >= 2 if len(param_list) < len(param_names): @@ -210,7 +208,6 @@ def filter_sin(txt): .replace("k","e3")\ .replace("u","e-6")\ .replace("m","e-3") - print("len(param_list) = {}".format(len(param_list))) if len(param_list) <= 5: sub_dict[param_names[5]] = str(0.0) if len(param_list) <= 4: @@ -233,13 +230,68 @@ def filter_sin(txt): interior = "((({})*({}))+(({})*({})))".format(cond0,state0,cond1,state1) return "sin(" + interior + ")" +def filter_pulse(txt): + # txt is expected to be of the form SIN(X,X,X,X,X,X) + interior = txt[txt.find("(")+1:][:-1] + assert "PULSE(" + interior + ")" == txt + param_list = interior.split(",") + param_names = ["(V1)", "(V2)", "(TD)", "(TR)", "(TF)", "(PW)", "(PER)", "(PHASE)"] + assert len(param_list) <= len(param_names) + assert len(param_list) >= 2 + if len(param_list) < len(param_names): + sub_dict = {} + for i in range(len(param_list)): + sub_dict[param_names[i]] = param_list[i].replace("Hz","")\ + .replace("s","")\ + .replace("V","")\ + .replace("k","e3")\ + .replace("u","e-6")\ + .replace("m","e-3") + if len(param_list) <= 8: + sub_dict[param_names[7]] = str(0.0) + if len(param_list) <= 7: + sub_dict[param_names[6]] = str(END_T) + if len(param_list) <= 6: + sub_dict[param_names[5]] = str(END_T) + if len(param_list) <= 5: + sub_dict[param_names[4]] = str(DT) + if len(param_list) <= 4: + sub_dict[param_names[3]] = str(DT) + if len(param_list) <= 3: + sub_dict[param_names[2]] = str(0.0) + else: + sub_dict = dict(zip(param_names, param_list)) + cond0 = "t<=((TD))" + cond1 = "((TD))d', x).hex() if sim_type == "transient": for j in range(len(soln)): s = soln[j] - spice_raw_file_txt += "".join([str(timesteps[j])] + [format_float(v) for i,v in enumerate(s) if i < len(voltage_list)]) + "\n" + raw_data_arr = [format_padded_float(timesteps[j])] + \ + [format_padded_float(v) for i,v in enumerate(s) if i < len(voltage_list)] + spice_raw_file_txt += "".join(raw_data_arr) + "\n" + assert len(spice_raw_file_txt.split("\n")) >= len(soln) elif sim_type == "op_pt": - spice_raw_file_txt += "".join([format_float(v) for i,v in enumerate(soln) if i < len(voltage_list)]) + "\n" + spice_raw_file_txt += "".join([format_padded_float(v) for i,v in enumerate(soln) if i < len(voltage_list)]) + "\n" else: assert False spice_raw_file.write(spice_raw_file_txt) diff --git a/PySpice/Spice/RawFile.py b/PySpice/Spice/RawFile.py index 742715d9..a9e43fe7 100644 --- a/PySpice/Spice/RawFile.py +++ b/PySpice/Spice/RawFile.py @@ -296,10 +296,11 @@ def _read_variable_data(self, raw_data): raise NotImplementedError input_data = [] - assert len(str(raw_data).split("\n")) == self.number_of_points - for data in str(raw_data).split("\n"): + assert len(str(raw_data).split("\\n")) - 1 == self.number_of_points + for data in str(raw_data).split("\\n")[:-1]: for c in range(number_of_columns): input_data.append(raw_data.decode()[(16*c):(16*(c+1))]) + print("input_data = {}".format(input_data)) input_data = np.array([struct.unpack('>d', bytes.fromhex(a))[0] for a in input_data]) input_data = input_data.reshape((self.number_of_points, number_of_columns)) input_data = input_data.transpose() diff --git a/examples/passive/capacitor-inductor.py b/examples/passive/capacitor-inductor.py index 4cbd948d..e6091bab 100755 --- a/examples/passive/capacitor-inductor.py +++ b/examples/passive/capacitor-inductor.py @@ -44,10 +44,10 @@ circuit = Circuit(element_type.title()) # Fixme: compute value - source = circuit.PulseVoltageSource('input', 'in', circuit.gnd, + source = circuit.PulseVoltageSource('input', 'in_node', circuit.gnd, initial_value=0@u_V, pulsed_value=10@u_V, pulse_width=10@u_ms, period=20@u_ms) - circuit.R(1, 'in', 'out', 1@u_kΩ) + circuit.R(1, 'in_node', 'out', 1@u_kΩ) if element_type == 'capacitor': element = circuit.C value = 1@u_uF @@ -96,10 +96,10 @@ def out_voltage(t, tau): ax.set_title(title) ax.grid() current_scale = 1000 - ax.plot(analysis['in']) + ax.plot(analysis['in_node']) ax.plot(analysis['out']) # Fixme: resistor current, scale - ax.plot(((analysis['in'] - analysis.out)/circuit['R1'].resistance) * current_scale) + ax.plot(((analysis['in_node'] - analysis.out)/circuit['R1'].resistance) * current_scale) ax.axvline(x=float(tau), color='red') ax.set_ylim(-11, 11) ax.set_xlabel('t [s]') From cfcd5ecc4344e50838a26e1256a94c1b377349c4 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 29 Mar 2022 11:37:39 -0700 Subject: [PATCH 046/115] Fixed broken transient sims --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 16 ++++++++++------ PySpice/Spice/RawFile.py | 8 +------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index c53a4724..e71a89c1 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -6,6 +6,7 @@ import struct from functools import reduce from operator import concat +import array get_vsrc = lambda dc_vals, timestep, node_id, ngspice_id : None get_isrc = lambda dc_vals, timestep, node_id, ngspice_id : None @@ -413,6 +414,11 @@ def get_sim_type(netlist_file_contents): return "transient" return "op_pt" +def pack_arr(a): + _a = a[::-1] # reverse order + __a = array.array('d', _a).tobytes()[::-1] # generate bytes + return "".join([hex(d)[2:].zfill(2) for d in __a]) + def _spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() @@ -450,16 +456,14 @@ def _spice_input(input_filename, output_filename): elif sim_type == "op_pt": spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(i,v) for i,v in enumerate(voltage_list)]) spice_raw_file_txt += "Binary:\n" - format_padded_float = lambda x : struct.pack('>d', x).hex() if sim_type == "transient": for j in range(len(soln)): s = soln[j] - raw_data_arr = [format_padded_float(timesteps[j])] + \ - [format_padded_float(v) for i,v in enumerate(s) if i < len(voltage_list)] - spice_raw_file_txt += "".join(raw_data_arr) + "\n" - assert len(spice_raw_file_txt.split("\n")) >= len(soln) + numbers = [timesteps[j]] + [v for i,v in enumerate(s) if i < len(voltage_list)] + raw_data_arr = pack_arr(numbers) + spice_raw_file_txt += "".join(raw_data_arr) elif sim_type == "op_pt": - spice_raw_file_txt += "".join([format_padded_float(v) for i,v in enumerate(soln) if i < len(voltage_list)]) + "\n" + spice_raw_file_txt += "".join(pack_arr([v for i,v in enumerate(soln) if i < len(voltage_list)])) + "\n" else: assert False spice_raw_file.write(spice_raw_file_txt) diff --git a/PySpice/Spice/RawFile.py b/PySpice/Spice/RawFile.py index a9e43fe7..99c93fba 100644 --- a/PySpice/Spice/RawFile.py +++ b/PySpice/Spice/RawFile.py @@ -295,13 +295,7 @@ def _read_variable_data(self, raw_data): else: raise NotImplementedError - input_data = [] - assert len(str(raw_data).split("\\n")) - 1 == self.number_of_points - for data in str(raw_data).split("\\n")[:-1]: - for c in range(number_of_columns): - input_data.append(raw_data.decode()[(16*c):(16*(c+1))]) - print("input_data = {}".format(input_data)) - input_data = np.array([struct.unpack('>d', bytes.fromhex(a))[0] for a in input_data]) + input_data = np.fromstring(raw_data, count=number_of_columns*self.number_of_points, dtype='f8') input_data = input_data.reshape((self.number_of_points, number_of_columns)) input_data = input_data.transpose() if self.flags == 'complex': From 3ba573bce8e51ac032dfd45aaed312bf82244507 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 29 Mar 2022 16:58:55 -0700 Subject: [PATCH 047/115] Enable passive test and results dumping --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 38 ++++++++++++++++----------- PySpice/Spice/OpenSPICE/__init__.py | 1 + examples/resistor/voltage-divider.py | 10 ++++--- examples/run-examples | 2 +- results/voltage-divider.npy | Bin 0 -> 144 bytes 5 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 results/voltage-divider.npy diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index e71a89c1..3e56b8cb 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -184,13 +184,21 @@ def filter_voltages(input_str, nodes_arr): input_str = input_str.replace("v({})".format(node), next_v_txt(str(node), nodes_arr)) return input_str -def paranth_split(arr): - par_split = [(i, k.split(")")) if ")" in k else (i, k) for i,k in enumerate(arr.split("("))] - par_split_dict = dict(par_split) - par_replace = [(_y[0], _y[1][0].replace(" ", ",")) for _y in par_split if type(_y[1]) == list] - par_replace_dict = dict(par_replace) - final_list = [['(' + par_replace_dict[i] + ')'] + v[1:] if type(v) == list else [v] for i,v in enumerate(par_split_dict.values())] - return "".join(reduce(concat, final_list)) +def paranth_split(x): + in_par = False + _x = "" + for _c in range(len(x)): + if x[_c] == "(": + in_par = True + _x += x[_c] + elif x[_c] == ")": + in_par = False + _x += x[_c] + elif in_par and x[_c] == " ": + _x += "," + else: + _x += x[_c] + return _x def filter_sin(txt): # txt is expected to be of the form SIN(X,X,X,X,X,X) @@ -321,9 +329,7 @@ def netlist_translate(netlist_txt, nodes_arr): if "PULSE" in _line[5]: dc_offset = _line[4].replace("V","") _line[3] = "({})+({})".format(filter_pulse(_line[5]), dc_offset) - else: - assert False - _line = _line[:4] + _line = _line[:4] _line[3] = "({}-{})-({})".format(next_v_txt(_line[1], nodes_arr), next_v_txt(_line[2], nodes_arr), _line[3]) if len(_line) == 6 and _line[5] == "external": @@ -415,9 +421,7 @@ def get_sim_type(netlist_file_contents): return "op_pt" def pack_arr(a): - _a = a[::-1] # reverse order - __a = array.array('d', _a).tobytes()[::-1] # generate bytes - return "".join([hex(d)[2:].zfill(2) for d in __a]) + return array.array('d', a).tobytes() def _spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: @@ -456,14 +460,16 @@ def _spice_input(input_filename, output_filename): elif sim_type == "op_pt": spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(i,v) for i,v in enumerate(voltage_list)]) spice_raw_file_txt += "Binary:\n" + spice_raw_file.write(spice_raw_file_txt) + with open(output_filename,"ab") as spice_raw_file: if sim_type == "transient": for j in range(len(soln)): s = soln[j] numbers = [timesteps[j]] + [v for i,v in enumerate(s) if i < len(voltage_list)] raw_data_arr = pack_arr(numbers) - spice_raw_file_txt += "".join(raw_data_arr) + spice_raw_file.write(raw_data_arr) elif sim_type == "op_pt": - spice_raw_file_txt += "".join(pack_arr([v for i,v in enumerate(soln) if i < len(voltage_list)])) + "\n" + packed_arr = pack_arr([v for i,v in enumerate(soln) if i < len(voltage_list)]) + spice_raw_file.write(packed_arr) else: assert False - spice_raw_file.write(spice_raw_file_txt) diff --git a/PySpice/Spice/OpenSPICE/__init__.py b/PySpice/Spice/OpenSPICE/__init__.py index e69de29b..214e6a85 100644 --- a/PySpice/Spice/OpenSPICE/__init__.py +++ b/PySpice/Spice/OpenSPICE/__init__.py @@ -0,0 +1 @@ +from .OpenSPICE import set_get_vsrc, set_get_isrc, set_send_data diff --git a/examples/resistor/voltage-divider.py b/examples/resistor/voltage-divider.py index d41675fb..918f881f 100755 --- a/examples/resistor/voltage-divider.py +++ b/examples/resistor/voltage-divider.py @@ -9,6 +9,7 @@ from PySpice.Spice.Netlist import Circuit from PySpice.Unit import * +import numpy #################################################################################################### @@ -27,10 +28,13 @@ analysis = simulator.operating_point() for node in (analysis['in_node'], analysis.out): # .in is invalid ! print('Node {}: {} V'.format(str(node), float(node))) +data = numpy.array([float(analysis['in_node']), float(analysis.out)]) +numpy.save('./results/voltage-divider', data) #o# # Fixme: Xyce sensitivity analysis -analysis = simulator.dc_sensitivity('v(out)') -for element in analysis.elements.values(): - print(element, float(element)) +# TODO Enable DC sensitivity tests +### analysis = simulator.dc_sensitivity('v(out)') +### for element in analysis.elements.values(): +### print(element, float(element)) #o# diff --git a/examples/run-examples b/examples/run-examples index a9209032..6f3abc8c 100755 --- a/examples/run-examples +++ b/examples/run-examples @@ -36,7 +36,7 @@ examples_path = Path(__file__).resolve().parent excluded_topics = [".travis", "transformer", "diode", "relay", "transmission-lines", "switched-power-supplies", "filter", "transistor", "ngspice-shared", "power-supplies", - "spice-parser", "passive", "operational-amplifier"] + "spice-parser", "operational-amplifier"] print("Running examples!") for topic in os.listdir(examples_path): diff --git a/results/voltage-divider.npy b/results/voltage-divider.npy new file mode 100644 index 0000000000000000000000000000000000000000..671f26f809ca56943f0a818cc3e217687ab86da5 GIT binary patch literal 144 zcmbR27wQ`j$;eQ~P_3SlTAW;@Zl$1ZlV+i=qoAIaUsO_*m=~X4l#&V(cT3DEP6dh= dXCxM+0{I$7I+{8PwF(pfE(S1Aae&Yt>;Vt%9Pj`D literal 0 HcmV?d00001 From 7ce898d0ea7a3f15420779443ed86bd8aecd1d39 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 29 Mar 2022 17:02:47 -0700 Subject: [PATCH 048/115] Make dumping optional --- examples/resistor/voltage-divider.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/resistor/voltage-divider.py b/examples/resistor/voltage-divider.py index 918f881f..5264da74 100755 --- a/examples/resistor/voltage-divider.py +++ b/examples/resistor/voltage-divider.py @@ -10,6 +10,7 @@ from PySpice.Spice.Netlist import Circuit from PySpice.Unit import * import numpy +from sys import argv #################################################################################################### @@ -28,8 +29,9 @@ analysis = simulator.operating_point() for node in (analysis['in_node'], analysis.out): # .in is invalid ! print('Node {}: {} V'.format(str(node), float(node))) -data = numpy.array([float(analysis['in_node']), float(analysis.out)]) -numpy.save('./results/voltage-divider', data) +if len(argv) == 2 and argv[1] == "--dump": + data = numpy.array([float(analysis['in_node']), float(analysis.out)]) + numpy.save('./results/voltage-divider', data) #o# # Fixme: Xyce sensitivity analysis From 231cb7b7e130cc665f695b70e37ab47284df7d25 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 10:56:11 -0700 Subject: [PATCH 049/115] Additional transient parameter support added --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 79 +++++++++++++++++++--------- PySpice/Spice/OpenSPICE/Server.py | 16 ------ 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index 3e56b8cb..33236936 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -12,9 +12,6 @@ get_isrc = lambda dc_vals, timestep, node_id, ngspice_id : None send_data = lambda actual_vector_values, number_of_vectors, ngspice_id : None -END_T = 1000.00 -DT = 0.1 - # TODO x -> dictionary mapping timestep to vector of currents and voltages # TODO initial conditions @@ -33,8 +30,8 @@ def set_send_data(_send_data): send_data = _send_data # Take limit of expression t -> inf -def inflim(expr, seed, dt, mid_trans, timestep): - if not mid_trans: +def inflim(expr, seed, dt, mid_trans, timestep, start_time): + if timestep == start_time: expr = expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') else: for s in range(len(seed)): @@ -44,11 +41,11 @@ def inflim(expr, seed, dt, mid_trans, timestep): return expr # process netlist expressions with function f -def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0): +def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0, start_time=0.0): for i in range(len(lines)): - lines[i][3] = f(lines[i][3], seed, dt, mid_trans, timestep) + lines[i][3] = f(lines[i][3], seed, dt, mid_trans, timestep, start_time) if len(lines[i]) == 5 and not mid_trans: - lines[i][4] = f(lines[i][4], seed, dt, mid_trans, timestep) + lines[i][4] = f(lines[i][4], seed, dt, mid_trans, timestep, start_time) return lines def get_nodes(lines): @@ -120,9 +117,9 @@ def isrc_sub(_eqn, timestep=0.00): # Op point # 1) Substitute constant dt and t -> inf. # 2) Use Powell's to solve at a single timestep -def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0): +def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0, start_time=0.0): lines = [n.split(" ") for n in netlist.split("\n") if n != ""] - lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans, timestep) + lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans, timestep, start_time) # Note: Replace len(l) - 1 with 3 for transient nextstep function if mid_trans: iv_relations = [l[3] for l in lines] @@ -139,23 +136,24 @@ def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0): # 1) Create initial condition equations and calculate # 2) Set x[0] to initial condition # 3) Loop. Update t on each timestep. -def transient(netlist): +def transient(netlist, dt, end_time, start_time, uic): trans_soln = [] voltage_list = [] timesteps = [] - for i in range(int(END_T / DT)): + for i in range(round(end_time / dt)): + curr_timestep = (dt*i) + start_time if i == 0: - [soln,num_nodes,num_branches,node_dict] = op_pt(netlist) + [soln,num_nodes,num_branches,node_dict] = op_pt(netlist, mid_trans=(not uic), dt=dt, timestep=start_time, start_time=start_time) else: - [soln,num_nodes,num_branches,node_dict] = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=DT, timestep=DT*i) + [soln,num_nodes,num_branches,node_dict] = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=dt, timestep=curr_timestep, start_time=start_time) trans_soln.append(soln) global send_data DUMMY_SPICE_ID = 0 voltage_list = ['V({})'.format(n) for n in get_nodes(netlist) if n != "0"] actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist) if n != "0"])) - actual_vector_values['time'] = DT*i + actual_vector_values['time'] = curr_timestep number_of_vectors = num_nodes - timesteps.append(DT*i) + timesteps.append(curr_timestep) send_data(actual_vector_values, number_of_vectors, DUMMY_SPICE_ID) return [trans_soln,voltage_list,timesteps] @@ -239,7 +237,7 @@ def filter_sin(txt): interior = "((({})*({}))+(({})*({})))".format(cond0,state0,cond1,state1) return "sin(" + interior + ")" -def filter_pulse(txt): +def filter_pulse(txt, end_time, dt): # txt is expected to be of the form SIN(X,X,X,X,X,X) interior = txt[txt.find("(")+1:][:-1] assert "PULSE(" + interior + ")" == txt @@ -259,13 +257,13 @@ def filter_pulse(txt): if len(param_list) <= 8: sub_dict[param_names[7]] = str(0.0) if len(param_list) <= 7: - sub_dict[param_names[6]] = str(END_T) + sub_dict[param_names[6]] = str(end_time) if len(param_list) <= 6: - sub_dict[param_names[5]] = str(END_T) + sub_dict[param_names[5]] = str(end_time) if len(param_list) <= 5: - sub_dict[param_names[4]] = str(DT) + sub_dict[param_names[4]] = str(dt) if len(param_list) <= 4: - sub_dict[param_names[3]] = str(DT) + sub_dict[param_names[3]] = str(dt) if len(param_list) <= 3: sub_dict[param_names[2]] = str(0.0) else: @@ -295,7 +293,7 @@ def filter_pulse(txt): cond0,state0,cond1,state1,cond2,state2,cond3,state3,cond4,state4) return "(" + interior + ")" -def netlist_translate(netlist_txt, nodes_arr): +def netlist_translate(netlist_txt, nodes_arr, end_time, dt): new_netlist_txt = "" line_count = 0 for line in netlist_txt.split("\n"): @@ -328,7 +326,7 @@ def netlist_translate(netlist_txt, nodes_arr): elif len(_line) == 6: if "PULSE" in _line[5]: dc_offset = _line[4].replace("V","") - _line[3] = "({})+({})".format(filter_pulse(_line[5]), dc_offset) + _line[3] = "({})+({})".format(filter_pulse(_line[5], end_time, dt), dc_offset) _line = _line[:4] _line[3] = "({}-{})-({})".format(next_v_txt(_line[1], nodes_arr), next_v_txt(_line[2], nodes_arr), _line[3]) @@ -420,6 +418,34 @@ def get_sim_type(netlist_file_contents): return "transient" return "op_pt" +def get_tran_params(netlist_file_contents): + lines = netlist_file_contents.split("\n") + for l in lines: + if ".tran" in l: + _l = l.split(" ") + assert _l[0] == ".tran" + assert len(_l) >= 3 + assert len(_l) <= 6 + dt = float(_l[1].replace("u", "e-6").replace("s", "")) + end_time = float(_l[2].replace("m", "e-3").replace("s", "")) + if len(_l) > 3 and _l[3] != "uic": + start_time = float(_l[3].replace("s", "")) + else: + start_time = 0.00 + # TODO: tmax is never used since variable time-stepping not + # currently supported. + if len(_l) > 4 and _l[4] != "uic": + tmax = float(_l[4].replace("s", "")) + else: + tmax = 0.00 + if _l[len(_l)-1] == "uic": + uic = True + else: + uic = False + return [dt, end_time, start_time, tmax, uic] + assert False + + def pack_arr(a): return array.array('d', a).tobytes() @@ -427,12 +453,15 @@ def _spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() sim_type = get_sim_type(netlist_file_contents) + if sim_type == "transient": + [dt, end_time, start_time, tmax, uic] = get_tran_params(netlist_file_contents) netlist_file_contents = filter_dot_statements(netlist_file_contents) netlist_file_contents = "\n".join([paranth_split(n) for n in netlist_file_contents.split("\n") if n != '']) nodes_arr = get_nodes(netlist_file_contents) - _netlist = netlist_translate(netlist_file_contents, nodes_arr) + _netlist = netlist_translate(netlist_file_contents, nodes_arr, end_time, dt) if sim_type == "transient": - [soln,voltage_list,timesteps] = transient(_netlist) + assert start_time < end_time + [soln,voltage_list,timesteps] = transient(_netlist, dt, end_time, start_time, uic) assert len(soln) == len(timesteps) elif sim_type == "op_pt": [soln,num_nodes,num_branches,node_dict] = op_pt(_netlist) diff --git a/PySpice/Spice/OpenSPICE/Server.py b/PySpice/Spice/OpenSPICE/Server.py index 64c0a900..77cc51c0 100644 --- a/PySpice/Spice/OpenSPICE/Server.py +++ b/PySpice/Spice/OpenSPICE/Server.py @@ -114,26 +114,10 @@ def __call__(self, spice_input): with open(input_filename, 'w') as f: f.write(str(spice_input)) - # command = "python3 -m OpenSPICE " + input_filename + " -r " + output_filename - # print(command) - # self._logger.info('Run {}'.format(' '.join(command))) - # process = subprocess.Popen( - # command, - # stdin=subprocess.PIPE, - # stdout=subprocess.PIPE, - # stderr=subprocess.PIPE, - # shell=True, - # ) - # stdout, stderr = process.communicate() - # print(stdout) - - # self._parse_stdout(stdout) - _spice_input(input_filename, output_filename) with open(output_filename, 'rb') as f: output = f.read() - # self._logger.debug(output) raw_file = RawFile(output) shutil.rmtree(tmp_dir) From f3737251f41c04dab0391d6210dc1d7fc5fec51c Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 11:01:20 -0700 Subject: [PATCH 050/115] Fixed remaining bug breaking examples --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index 33236936..6e1c2cd4 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -453,6 +453,11 @@ def _spice_input(input_filename, output_filename): with open(input_filename, "r") as netlist_file: netlist_file_contents = netlist_file.read() sim_type = get_sim_type(netlist_file_contents) + dt = 0.00 + end_time = 0.00 + start_time = 0.00 + tmax = 0.00 + uic = False if sim_type == "transient": [dt, end_time, start_time, tmax, uic] = get_tran_params(netlist_file_contents) netlist_file_contents = filter_dot_statements(netlist_file_contents) From 3787a507d94db541777a8111140fe0a809413b40 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 11:53:36 -0700 Subject: [PATCH 051/115] Can parse resistors --- OpenSPICE-revamp/blank_netlist.cir | 0 OpenSPICE-revamp/multi_r_netlist.cir | 4 ++++ OpenSPICE-revamp/one_r_netlist.cir | 1 + OpenSPICE-revamp/parser.py | 29 ++++++++++++++++++++++++++++ OpenSPICE-revamp/requirements.txt | 1 + 5 files changed, 35 insertions(+) create mode 100644 OpenSPICE-revamp/blank_netlist.cir create mode 100644 OpenSPICE-revamp/multi_r_netlist.cir create mode 100644 OpenSPICE-revamp/one_r_netlist.cir create mode 100755 OpenSPICE-revamp/parser.py create mode 100644 OpenSPICE-revamp/requirements.txt diff --git a/OpenSPICE-revamp/blank_netlist.cir b/OpenSPICE-revamp/blank_netlist.cir new file mode 100644 index 00000000..e69de29b diff --git a/OpenSPICE-revamp/multi_r_netlist.cir b/OpenSPICE-revamp/multi_r_netlist.cir new file mode 100644 index 00000000..25904b0b --- /dev/null +++ b/OpenSPICE-revamp/multi_r_netlist.cir @@ -0,0 +1,4 @@ +R1 1 0 1 +R2 2 3 1 +R3 1 2 4 +R4 3 0 5 diff --git a/OpenSPICE-revamp/one_r_netlist.cir b/OpenSPICE-revamp/one_r_netlist.cir new file mode 100644 index 00000000..7063cefd --- /dev/null +++ b/OpenSPICE-revamp/one_r_netlist.cir @@ -0,0 +1 @@ +R1 1 0 1 diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py new file mode 100755 index 00000000..d514cadd --- /dev/null +++ b/OpenSPICE-revamp/parser.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython + +def netlist(): + return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) + +def branch(): + return resistor + +def resistor(): + return rcomponent, node, node, passiveValue + +def rcomponent(): + return RegExMatch(r'R\d+') + +def node(): + return RegExMatch(r'\d+') + +def passiveValue(): + return RegExMatch(r'\d+') + +def newline(): + return RegExMatch(r'\n') + +if __name__ == "__main__": + parser = ParserPython(netlist, ws='\t\r ') + with open("multi_r_netlist.cir") as f: + print(parser.parse(f.read()).tree_str()) diff --git a/OpenSPICE-revamp/requirements.txt b/OpenSPICE-revamp/requirements.txt new file mode 100644 index 00000000..bf5db69a --- /dev/null +++ b/OpenSPICE-revamp/requirements.txt @@ -0,0 +1 @@ +Arpeggio==1.10.2 From c350aa23ed6ab2fa9313bdd0f347346bf72a4609 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:27:24 -0700 Subject: [PATCH 052/115] Cleaned up resistor parsing --- OpenSPICE-revamp/parser.py | 42 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index d514cadd..56105096 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -1,6 +1,13 @@ #!/usr/bin/env python3 -from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython +from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython, Terminal, NonTerminal + +####################################################################################### + +class Resistor: + pass + +####################################################################################### def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) @@ -23,7 +30,38 @@ def passiveValue(): def newline(): return RegExMatch(r'\n') +####################################################################################### + +def filter_terms(ptree): + return [_ for _ in ptree if type(_) != Terminal] + +def nonterm_is_branch(nonterm): + assert type(nonterm) == NonTerminal + return "branch" in nonterm.name + +def gen_dict_from_branch(nonterm): + assert nonterm_is_branch(nonterm) + if nonterm[0].rule_name == "rcomponent": + assert len(nonterm) == 4 + return {"component" : Resistor, + "node_plus" : nonterm[1].value, + "node_minus" : nonterm[2].value, + "value" : nonterm[3].value} + else: + assert False + +def gen_dict(nonterm): + if nonterm_is_branch(nonterm): + return gen_dict_from_branch(nonterm) + else: + assert False + +def gen_data_dicts(ptree): + return [gen_dict(_) for _ in ptree] + if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') with open("multi_r_netlist.cir") as f: - print(parser.parse(f.read()).tree_str()) + ptree = parser.parse(f.read()) + ptree = filter_terms(ptree) + print(gen_data_dicts(ptree)) From 8fa340a71b303dae1123e2d0394bcd5afa1b41ea Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:36:01 -0700 Subject: [PATCH 053/115] Added capacitor support. No test yet. --- OpenSPICE-revamp/parser.py | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 56105096..3f9e6f18 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -7,17 +7,29 @@ class Resistor: pass +class Capacitor: + pass + ####################################################################################### def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return resistor + return [resistor, capacitor] + +def capacitor(): + return ccomponent, node, node, passiveValue, Optional(ic) def resistor(): return rcomponent, node, node, passiveValue +def ic(): + return RegExMatch(r'ic='), stateVarValue + +def ccomponent(): + return RegExMatch(r'C\d+') + def rcomponent(): return RegExMatch(r'R\d+') @@ -27,6 +39,9 @@ def node(): def passiveValue(): return RegExMatch(r'\d+') +def stateVarValue(): + return RegExMatch(r'\d+') + def newline(): return RegExMatch(r'\n') @@ -41,12 +56,21 @@ def nonterm_is_branch(nonterm): def gen_dict_from_branch(nonterm): assert nonterm_is_branch(nonterm) - if nonterm[0].rule_name == "rcomponent": - assert len(nonterm) == 4 + if nonterm[0].rule_name == "resistor": + assert len(nonterm[0]) == 4 return {"component" : Resistor, - "node_plus" : nonterm[1].value, - "node_minus" : nonterm[2].value, - "value" : nonterm[3].value} + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : nonterm[0][3].value} + elif nonterm[0].rule_name == "capacitor": + assert len(nonterm[0]) == 4 or len(nonterm[0]) == 5 + _cap = {"component" : Capacitor, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : nonterm[0][3].value} + if len(nonterm[0]) == 5: + _cap["ic" : nonterm[0][4].value.replace("ic=", "")] + return _cap else: assert False From 1a1d42eaa80d90e578e9e0bc22ae82cb284cdef5 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:38:41 -0700 Subject: [PATCH 054/115] Fixed capacitor support --- OpenSPICE-revamp/parser.py | 4 ++-- OpenSPICE-revamp/rc_netlist.cir | 2 ++ OpenSPICE-revamp/rc_netlist_w_ic.cir | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 OpenSPICE-revamp/rc_netlist.cir create mode 100644 OpenSPICE-revamp/rc_netlist_w_ic.cir diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 3f9e6f18..8de29226 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -69,7 +69,7 @@ def gen_dict_from_branch(nonterm): "node_minus" : nonterm[0][2].value, "value" : nonterm[0][3].value} if len(nonterm[0]) == 5: - _cap["ic" : nonterm[0][4].value.replace("ic=", "")] + _cap["ic"] = nonterm[0][4][1].value return _cap else: assert False @@ -85,7 +85,7 @@ def gen_data_dicts(ptree): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("multi_r_netlist.cir") as f: + with open("rc_netlist_w_ic.cir") as f: ptree = parser.parse(f.read()) ptree = filter_terms(ptree) print(gen_data_dicts(ptree)) diff --git a/OpenSPICE-revamp/rc_netlist.cir b/OpenSPICE-revamp/rc_netlist.cir new file mode 100644 index 00000000..85b34bb2 --- /dev/null +++ b/OpenSPICE-revamp/rc_netlist.cir @@ -0,0 +1,2 @@ +R1 1 0 1 +C1 1 0 1 diff --git a/OpenSPICE-revamp/rc_netlist_w_ic.cir b/OpenSPICE-revamp/rc_netlist_w_ic.cir new file mode 100644 index 00000000..be95f4a9 --- /dev/null +++ b/OpenSPICE-revamp/rc_netlist_w_ic.cir @@ -0,0 +1,2 @@ +R1 1 0 1 +C1 1 0 1 ic=1 From 60e347365bf81ba6c624162705f6b23e94436927 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:44:56 -0700 Subject: [PATCH 055/115] Organize code better --- OpenSPICE-revamp/parser.py | 43 ++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 8de29226..8ed8e1e2 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -4,6 +4,8 @@ ####################################################################################### +# Component Classes # + class Resistor: pass @@ -12,26 +14,27 @@ class Capacitor: ####################################################################################### +# Top-Level Netlist Rules # + def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): return [resistor, capacitor] +####################################################################################### + +# Component Rules # + def capacitor(): return ccomponent, node, node, passiveValue, Optional(ic) def resistor(): return rcomponent, node, node, passiveValue -def ic(): - return RegExMatch(r'ic='), stateVarValue - -def ccomponent(): - return RegExMatch(r'C\d+') +####################################################################################### -def rcomponent(): - return RegExMatch(r'R\d+') +# Generic Branch Rules # def node(): return RegExMatch(r'\d+') @@ -45,8 +48,23 @@ def stateVarValue(): def newline(): return RegExMatch(r'\n') +def ic(): + return RegExMatch(r'ic='), stateVarValue + +####################################################################################### + +# Component Identifier Rules # + +def ccomponent(): + return RegExMatch(r'C\d+') + +def rcomponent(): + return RegExMatch(r'R\d+') + ####################################################################################### +# Parsing Functions # + def filter_terms(ptree): return [_ for _ in ptree if type(_) != Terminal] @@ -83,9 +101,12 @@ def gen_dict(nonterm): def gen_data_dicts(ptree): return [gen_dict(_) for _ in ptree] +def parse(txt): + return gen_data_dicts(filter_terms(parser.parse(txt))) + +####################################################################################### + if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("rc_netlist_w_ic.cir") as f: - ptree = parser.parse(f.read()) - ptree = filter_terms(ptree) - print(gen_data_dicts(ptree)) + with open("rc_netlist_w_ic.cir", "r") as f: + print(parse(f.read())) From a1131b77e22dcbede9371df8840cd22d1807e8ae Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:46:13 -0700 Subject: [PATCH 056/115] Added inductor support --- OpenSPICE-revamp/parser.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 8ed8e1e2..7a29e2c3 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -12,6 +12,9 @@ class Resistor: class Capacitor: pass +class Inductor: + pass + ####################################################################################### # Top-Level Netlist Rules # @@ -26,6 +29,9 @@ def branch(): # Component Rules # +def inductor(): + return lcomponent, node, node, passiveValue, Optional(ic) + def capacitor(): return ccomponent, node, node, passiveValue, Optional(ic) @@ -61,6 +67,9 @@ def ccomponent(): def rcomponent(): return RegExMatch(r'R\d+') +def lcomponent(): + return RegExMatch(r'L\d+') + ####################################################################################### # Parsing Functions # @@ -89,6 +98,15 @@ def gen_dict_from_branch(nonterm): if len(nonterm[0]) == 5: _cap["ic"] = nonterm[0][4][1].value return _cap + elif nonterm[0].rule_name == "inductor": + assert len(nonterm[0]) == 4 or len(nonterm[0]) == 5 + _ind = {"component" : Inductor, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : nonterm[0][3].value} + if len(nonterm[0]) == 5: + _cap["ic"] = nonterm[0][4][1].value + return _ind else: assert False From f7fdefc48647255067cd2e0daa319ac736bd9cd2 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:48:42 -0700 Subject: [PATCH 057/115] Fixed RLC bugs --- OpenSPICE-revamp/parser.py | 6 +++--- OpenSPICE-revamp/rl_netlist.cir | 2 ++ OpenSPICE-revamp/rlc_netlist.cir | 3 +++ OpenSPICE-revamp/rlc_netlist_w_ic.cir | 3 +++ 4 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 OpenSPICE-revamp/rl_netlist.cir create mode 100644 OpenSPICE-revamp/rlc_netlist.cir create mode 100644 OpenSPICE-revamp/rlc_netlist_w_ic.cir diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 7a29e2c3..10123a08 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -23,7 +23,7 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return [resistor, capacitor] + return [resistor, capacitor, inductor] ####################################################################################### @@ -105,7 +105,7 @@ def gen_dict_from_branch(nonterm): "node_minus" : nonterm[0][2].value, "value" : nonterm[0][3].value} if len(nonterm[0]) == 5: - _cap["ic"] = nonterm[0][4][1].value + _ind["ic"] = nonterm[0][4][1].value return _ind else: assert False @@ -126,5 +126,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("rc_netlist_w_ic.cir", "r") as f: + with open("rlc_netlist_w_ic.cir", "r") as f: print(parse(f.read())) diff --git a/OpenSPICE-revamp/rl_netlist.cir b/OpenSPICE-revamp/rl_netlist.cir new file mode 100644 index 00000000..ba4825b6 --- /dev/null +++ b/OpenSPICE-revamp/rl_netlist.cir @@ -0,0 +1,2 @@ +R1 1 0 1 +L1 1 0 1 diff --git a/OpenSPICE-revamp/rlc_netlist.cir b/OpenSPICE-revamp/rlc_netlist.cir new file mode 100644 index 00000000..2b934dab --- /dev/null +++ b/OpenSPICE-revamp/rlc_netlist.cir @@ -0,0 +1,3 @@ +R1 1 0 1 +L1 1 0 1 +C1 1 0 1 diff --git a/OpenSPICE-revamp/rlc_netlist_w_ic.cir b/OpenSPICE-revamp/rlc_netlist_w_ic.cir new file mode 100644 index 00000000..85fa2e59 --- /dev/null +++ b/OpenSPICE-revamp/rlc_netlist_w_ic.cir @@ -0,0 +1,3 @@ +R1 1 0 1 +L1 1 0 1 ic=1 +C1 1 0 1 ic=1 From 5966890e945a61e4ca1c9fae26d3cbce85d5ed1d Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 12:57:04 -0700 Subject: [PATCH 058/115] Technical plan for OpenSPICE revamp --- OpenSPICE-revamp/todos | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 OpenSPICE-revamp/todos diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos new file mode 100644 index 00000000..4e40c1e2 --- /dev/null +++ b/OpenSPICE-revamp/todos @@ -0,0 +1,37 @@ +1) Voltage sources +2) Current sources +3) External source modifications for voltage +4) External source modifications for current +5) Linear dependent sources + (a) VCVS + (b) CCVS + (c) CCCS + (d) VCCS +6) Behavioral sources +7) .control statements for... + (a) DC op point + (b) transient sim +----- parser.py done ------ +0) Break off cap, ind, res, etc. classes into a separate file +imported by parser.py and eqnstr.py +1) Strategy pattern skeleton +2) Equation formatting for transient and op pt +3) Document interface at top of eqnstr.py +4) Document that parser.py's interface is simply ngspice netlist +5) Write OpenSPICE.py as top-level file to call both. +----- eqnstr.py done ------ +1) ****** FIGURE OUT HOW TO DEAL WITH GET_VSRC, SEND_DATA, etc. ****** +2) Implement strategy pattern skeleton. +3) scipy.optimize.root one such strategy. Add comment about being able to +feed into other simulators as a separate strategy. May involve stealing code +from existing OpenSPICE. +4) Document interface at top of solver.py +5) Add to OpenSPICE.py +----- solver.py done ----- +1) Take binary generation function from existing OpenSPICE code +2) Document interface and output at top of genout.py +3) Add to OpenSPICE.py +----- genout.py done ----- +1) Organize test suite in directory with a loop in OpenSPICE main function +2) Plug in to PySpice +3) Run examples and debug From 0f7c8cca05ca560fc9ba235ba6e8c37910de45de Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 14:54:51 -0700 Subject: [PATCH 059/115] Devplan --- OpenSPICE-revamp/todos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 4e40c1e2..5add1883 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -1,4 +1,4 @@ -1) Voltage sources +1) Voltage sources (X) 2) Current sources 3) External source modifications for voltage 4) External source modifications for current From 97d6d892a9a5c7da33e24d4254fbe5debbfcaa2a Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 14:55:00 -0700 Subject: [PATCH 060/115] Added vsources --- OpenSPICE-revamp/parser.py | 19 +++++++++++++++++-- OpenSPICE-revamp/vsource.cir | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 OpenSPICE-revamp/vsource.cir diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 10123a08..be0f6237 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -15,6 +15,9 @@ class Capacitor: class Inductor: pass +class VSource: + pass + ####################################################################################### # Top-Level Netlist Rules # @@ -23,7 +26,7 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return [resistor, capacitor, inductor] + return [resistor, capacitor, inductor, vsource] ####################################################################################### @@ -38,6 +41,9 @@ def capacitor(): def resistor(): return rcomponent, node, node, passiveValue +def vsource(): + return vcomponent, node, node, passiveValue + ####################################################################################### # Generic Branch Rules # @@ -70,6 +76,9 @@ def rcomponent(): def lcomponent(): return RegExMatch(r'L\d+') +def vcomponent(): + return RegExMatch(r'V\d+') + ####################################################################################### # Parsing Functions # @@ -107,6 +116,12 @@ def gen_dict_from_branch(nonterm): if len(nonterm[0]) == 5: _ind["ic"] = nonterm[0][4][1].value return _ind + elif nonterm[0].rule_name == "vsource": + assert len(nonterm[0]) == 4 + return {"component" : VSource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : nonterm[0][3].value} else: assert False @@ -126,5 +141,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("rlc_netlist_w_ic.cir", "r") as f: + with open("vsource.cir", "r") as f: print(parse(f.read())) diff --git a/OpenSPICE-revamp/vsource.cir b/OpenSPICE-revamp/vsource.cir new file mode 100644 index 00000000..5feba1a3 --- /dev/null +++ b/OpenSPICE-revamp/vsource.cir @@ -0,0 +1,2 @@ +V1 1 0 1 +R1 1 0 1 From 63b914784797db55988674f2c5d79401daf2a1d9 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 14:56:29 -0700 Subject: [PATCH 061/115] Added isources --- OpenSPICE-revamp/isource.cir | 2 ++ OpenSPICE-revamp/parser.py | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 OpenSPICE-revamp/isource.cir diff --git a/OpenSPICE-revamp/isource.cir b/OpenSPICE-revamp/isource.cir new file mode 100644 index 00000000..0f1454a4 --- /dev/null +++ b/OpenSPICE-revamp/isource.cir @@ -0,0 +1,2 @@ +I1 1 0 1 +R1 1 0 1 diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index be0f6237..b3974191 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -18,6 +18,9 @@ class Inductor: class VSource: pass +class ISource: + pass + ####################################################################################### # Top-Level Netlist Rules # @@ -26,7 +29,7 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return [resistor, capacitor, inductor, vsource] + return [resistor, capacitor, inductor, vsource, isource] ####################################################################################### @@ -44,6 +47,9 @@ def resistor(): def vsource(): return vcomponent, node, node, passiveValue +def isource(): + return icomponent, node, node, passiveValue + ####################################################################################### # Generic Branch Rules # @@ -79,6 +85,9 @@ def lcomponent(): def vcomponent(): return RegExMatch(r'V\d+') +def icomponent(): + return RegExMatch(r'I\d+') + ####################################################################################### # Parsing Functions # @@ -122,6 +131,12 @@ def gen_dict_from_branch(nonterm): "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, "value" : nonterm[0][3].value} + elif nonterm[0].rule_name == "isource": + assert len(nonterm[0]) == 4 + return {"component" : ISource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : nonterm[0][3].value} else: assert False @@ -141,5 +156,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("vsource.cir", "r") as f: + with open("isource.cir", "r") as f: print(parse(f.read())) From 2786cdde595454ab3f2aa1ba266e45bdecdb9725 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 14:57:02 -0700 Subject: [PATCH 062/115] Check off current sources from todo list --- OpenSPICE-revamp/todos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 5add1883..c1f3a387 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -1,5 +1,5 @@ 1) Voltage sources (X) -2) Current sources +2) Current sources (X) 3) External source modifications for voltage 4) External source modifications for current 5) Linear dependent sources From 74c4517913988953c4e196116eacbb771c174e6a Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:03:49 -0700 Subject: [PATCH 063/115] Add external sources --- OpenSPICE-revamp/ext_sources.cir | 4 ++++ OpenSPICE-revamp/parser.py | 31 +++++++++++++++++++++++++++++-- OpenSPICE-revamp/todos | 4 ++-- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 OpenSPICE-revamp/ext_sources.cir diff --git a/OpenSPICE-revamp/ext_sources.cir b/OpenSPICE-revamp/ext_sources.cir new file mode 100644 index 00000000..19fa9d33 --- /dev/null +++ b/OpenSPICE-revamp/ext_sources.cir @@ -0,0 +1,4 @@ +V1 1 0 dc 0 external +R1 1 2 1 +R2 2 3 1 +I1 3 0 dc 0 external diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index b3974191..546ffd3b 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -29,7 +29,7 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return [resistor, capacitor, inductor, vsource, isource] + return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource] ####################################################################################### @@ -50,6 +50,12 @@ def vsource(): def isource(): return icomponent, node, node, passiveValue +def extvsource(): + return vcomponent, node, node, dc, zero, external + +def extisource(): + return icomponent, node, node, dc, zero, external + ####################################################################################### # Generic Branch Rules # @@ -69,6 +75,15 @@ def newline(): def ic(): return RegExMatch(r'ic='), stateVarValue +def dc(): + return RegExMatch(r'dc') + +def zero(): + return RegExMatch(r'0') + +def external(): + return RegExMatch(r'external') + ####################################################################################### # Component Identifier Rules # @@ -137,6 +152,18 @@ def gen_dict_from_branch(nonterm): "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, "value" : nonterm[0][3].value} + elif nonterm[0].rule_name == "extvsource": + assert len(nonterm[0]) == 6 + return {"component" : VSource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : "get_vsrc()"} + elif nonterm[0].rule_name == "extisource": + assert len(nonterm[0]) == 6 + return {"component" : ISource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : "get_isrc()"} else: assert False @@ -156,5 +183,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("isource.cir", "r") as f: + with open("ext_sources.cir", "r") as f: print(parse(f.read())) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index c1f3a387..ec0e255a 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -1,7 +1,7 @@ 1) Voltage sources (X) 2) Current sources (X) -3) External source modifications for voltage -4) External source modifications for current +3) External source modifications for voltage (X) +4) External source modifications for current (X) 5) Linear dependent sources (a) VCVS (b) CCVS From 61e6be788048896125c557cdf1abcee620206f87 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:37:02 -0700 Subject: [PATCH 064/115] Add VCCS to parser --- OpenSPICE-revamp/parser.py | 21 +++++++++++++++++++-- OpenSPICE-revamp/todos | 5 ++++- OpenSPICE-revamp/vccs.cir | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 OpenSPICE-revamp/vccs.cir diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 546ffd3b..28795fe5 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -29,7 +29,7 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource] + return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, vccssource] ####################################################################################### @@ -56,6 +56,9 @@ def extvsource(): def extisource(): return icomponent, node, node, dc, zero, external +def vccssource(): + return vccscomponent, node, node, node, node, passiveValue + ####################################################################################### # Generic Branch Rules # @@ -103,6 +106,9 @@ def vcomponent(): def icomponent(): return RegExMatch(r'I\d+') +def vccscomponent(): + return RegExMatch(r'G\d+') + ####################################################################################### # Parsing Functions # @@ -164,9 +170,20 @@ def gen_dict_from_branch(nonterm): "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, "value" : "get_isrc()"} + elif nonterm[0].rule_name == "vccssource": + assert len(nonterm[0]) == 6 + return {"component" : ISource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : "(({})*(({})-({})))".format(nonterm[0][5].value, + v_format(nonterm[0][3]), + v_format(nonterm[0][4]))} else: assert False +def v_format(s): + return "x['v({})']".format(s) + def gen_dict(nonterm): if nonterm_is_branch(nonterm): return gen_dict_from_branch(nonterm) @@ -183,5 +200,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("ext_sources.cir", "r") as f: + with open("vccs.cir", "r") as f: print(parse(f.read())) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index ec0e255a..1838e7d6 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -3,7 +3,7 @@ 3) External source modifications for voltage (X) 4) External source modifications for current (X) 5) Linear dependent sources - (a) VCVS + (a) VCVS (X) (b) CCVS (c) CCCS (d) VCCS @@ -35,3 +35,6 @@ from existing OpenSPICE. 1) Organize test suite in directory with a loop in OpenSPICE main function 2) Plug in to PySpice 3) Run examples and debug + +Down the road: +- Add multiplier m for current sources diff --git a/OpenSPICE-revamp/vccs.cir b/OpenSPICE-revamp/vccs.cir new file mode 100644 index 00000000..4c0d7b21 --- /dev/null +++ b/OpenSPICE-revamp/vccs.cir @@ -0,0 +1,2 @@ +G1 1 0 1 0 1 +R1 1 0 1 From 25d2ac5e8830525a6e6829417ea541f86a9b44b5 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:41:31 -0700 Subject: [PATCH 065/115] Add generic dependent source formatting --- OpenSPICE-revamp/parser.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 28795fe5..1bf1ad89 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -175,15 +175,23 @@ def gen_dict_from_branch(nonterm): return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : "(({})*(({})-({})))".format(nonterm[0][5].value, - v_format(nonterm[0][3]), - v_format(nonterm[0][4]))} + "value" : linear_dep_src(nonterm[0][3].value, + nonterm[0][4].value, + nonterm[0][5].value, + is_voltage_controlled=True)} else: assert False def v_format(s): return "x['v({})']".format(s) +def i_format(s): + return "x['i({})']".format(s) + +def linear_dep_src(s_plus, s_minus, gain, is_voltage_controlled=True): + return "(({})*(({})-({})))".format(gain, v_format(s_plus) if is_voltage_controlled else i_format(s_plus), + v_format(s_minus) if is_voltage_controlled else i_format(s_minus)) + def gen_dict(nonterm): if nonterm_is_branch(nonterm): return gen_dict_from_branch(nonterm) From 5d6289fdbbdbd558941b3ba2e3348891ce3f5aa6 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:45:38 -0700 Subject: [PATCH 066/115] Added full linear dependent source support --- OpenSPICE-revamp/dep_sources.cir | 5 ++++ OpenSPICE-revamp/parser.py | 50 ++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 OpenSPICE-revamp/dep_sources.cir diff --git a/OpenSPICE-revamp/dep_sources.cir b/OpenSPICE-revamp/dep_sources.cir new file mode 100644 index 00000000..92727885 --- /dev/null +++ b/OpenSPICE-revamp/dep_sources.cir @@ -0,0 +1,5 @@ +G1 1 0 1 0 1 +E1 1 0 1 0 1 +F1 1 0 1 0 1 +H1 1 0 1 0 1 +R1 1 0 1 diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 1bf1ad89..c736b4d2 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -29,7 +29,8 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): - return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, vccssource] + return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, + vccssource, vcvssource, ccvssource, cccssource] ####################################################################################### @@ -59,6 +60,15 @@ def extisource(): def vccssource(): return vccscomponent, node, node, node, node, passiveValue +def vcvssource(): + return vcvscomponent, node, node, node, node, passiveValue + +def ccvssource(): + return ccvscomponent, node, node, node, node, passiveValue + +def cccssource(): + return cccscomponent, node, node, node, node, passiveValue + ####################################################################################### # Generic Branch Rules # @@ -109,6 +119,15 @@ def icomponent(): def vccscomponent(): return RegExMatch(r'G\d+') +def vcvscomponent(): + return RegExMatch(r'E\d+') + +def ccvscomponent(): + return RegExMatch(r'H\d+') + +def cccscomponent(): + return RegExMatch(r'F\d+') + ####################################################################################### # Parsing Functions # @@ -179,6 +198,33 @@ def gen_dict_from_branch(nonterm): nonterm[0][4].value, nonterm[0][5].value, is_voltage_controlled=True)} + elif nonterm[0].rule_name == "vcvssource": + assert len(nonterm[0]) == 6 + return {"component" : VSource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : linear_dep_src(nonterm[0][3].value, + nonterm[0][4].value, + nonterm[0][5].value, + is_voltage_controlled=True)} + elif nonterm[0].rule_name == "ccvssource": + assert len(nonterm[0]) == 6 + return {"component" : VSource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : linear_dep_src(nonterm[0][3].value, + nonterm[0][4].value, + nonterm[0][5].value, + is_voltage_controlled=False)} + elif nonterm[0].rule_name == "cccssource": + assert len(nonterm[0]) == 6 + return {"component" : ISource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : linear_dep_src(nonterm[0][3].value, + nonterm[0][4].value, + nonterm[0][5].value, + is_voltage_controlled=False)} else: assert False @@ -208,5 +254,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("vccs.cir", "r") as f: + with open("dep_sources.cir", "r") as f: print(parse(f.read())) From 44c994256f01cdf9c1e35ab41323f4fbfb35c8c9 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:46:50 -0700 Subject: [PATCH 067/115] Checked off linear dependent sources from todo list --- OpenSPICE-revamp/todos | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 1838e7d6..571e51b8 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -2,11 +2,11 @@ 2) Current sources (X) 3) External source modifications for voltage (X) 4) External source modifications for current (X) -5) Linear dependent sources +5) Linear dependent sources (X) (a) VCVS (X) - (b) CCVS - (c) CCCS - (d) VCCS + (b) CCVS (X) + (c) CCCS (X) + (d) VCCS (X) 6) Behavioral sources 7) .control statements for... (a) DC op point From bd5c1727ccc1bba8946998074e62a05643b4f6c8 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:53:50 -0700 Subject: [PATCH 068/115] Add scaffolding for behavioral sources. Fix later. --- OpenSPICE-revamp/parser.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index c736b4d2..66687679 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -30,7 +30,7 @@ def netlist(): def branch(): return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, - vccssource, vcvssource, ccvssource, cccssource] + vccssource, vcvssource, ccvssource, cccssource, behavisource] ####################################################################################### @@ -69,6 +69,12 @@ def ccvssource(): def cccssource(): return cccscomponent, node, node, node, node, passiveValue +def behavisource(): + return behavsrccomponent, node, node, iequalsbehav + +def behavvsource(): + return behavsrccomponent, node, node, vequalsbehav + ####################################################################################### # Generic Branch Rules # @@ -97,6 +103,16 @@ def zero(): def external(): return RegExMatch(r'external') +def iequalsbehav(): + return RegExMatch(r'i='), behavexpr + +def vequalsbehav(): + return RegExMatch(r'v='), behavexpr + +def behavexpr(): + # TODO + return RegExMatch('') + ####################################################################################### # Component Identifier Rules # @@ -128,6 +144,9 @@ def ccvscomponent(): def cccscomponent(): return RegExMatch(r'F\d+') +def behavsrccomponent(): + return RegExMatch(r'B\d+') + ####################################################################################### # Parsing Functions # From f6f123a787c686c3f06146d75ef7181798d2c1df Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 15:54:44 -0700 Subject: [PATCH 069/115] Administrative changes for behav sources --- OpenSPICE-revamp/parser.py | 3 ++- OpenSPICE-revamp/todos | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 66687679..7894e459 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -29,8 +29,9 @@ def netlist(): return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) def branch(): + # TODO: Enable behavisource and behavvsource return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, - vccssource, vcvssource, ccvssource, cccssource, behavisource] + vccssource, vcvssource, ccvssource, cccssource] ####################################################################################### diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 571e51b8..6ec44282 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -7,7 +7,7 @@ (b) CCVS (X) (c) CCCS (X) (d) VCCS (X) -6) Behavioral sources +6) Behavioral sources (1/2) 7) .control statements for... (a) DC op point (b) transient sim From 50dec1727ab678d4824547b14ac42ccf6f4bafea Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:04:42 -0700 Subject: [PATCH 070/115] Add behavioral source todo --- OpenSPICE-revamp/todos | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 6ec44282..e4ca6652 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -38,3 +38,4 @@ from existing OpenSPICE. Down the road: - Add multiplier m for current sources +- Finish behavioral sources From 00b12fdc16ece866282e56d21dd8b21decb93df0 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:04:59 -0700 Subject: [PATCH 071/115] Add initial scaffolding for control expression --- OpenSPICE-revamp/parser.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 7894e459..9d7cb188 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -26,13 +26,47 @@ class ISource: # Top-Level Netlist Rules # def netlist(): - return ZeroOrMore(branch, OneOrMore(newline)), Optional(branch) + return ZeroOrMore(branch, OneOrMore(newline)), Optional([branch, ctrl]) def branch(): # TODO: Enable behavisource and behavvsource return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, vccssource, vcvssource, ccvssource, cccssource] +def ctrl(): + return control, OneOrMore(newline), [op_pt, tran], OneOrMore(newline), end + +####################################################################################### + +# Control Rules # + +def control(): + return RegExMatch('.control') + +def op_pt(): + return RegExMatch('.op') + +def tran(): + return RegExMatch('.tran'), tstep, tstop, Optional(tstart, Optional(tmax)), Optional(uic) + +def tstep(): + return _float() + +def tstop(): + return _float() + +def tstart(): + return _float() + +def tmax(): + return _float() + +def uic(): + return RegExMatch("uic") + +def _float(): + return RegExMatch(r'[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)') + ####################################################################################### # Component Rules # From 51fd5386912a512bf6830dd494ebd7d0915578ec Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:15:39 -0700 Subject: [PATCH 072/115] Added control parsing logic. No testing yet. --- OpenSPICE-revamp/parser.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 9d7cb188..82ba6928 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -64,6 +64,9 @@ def tmax(): def uic(): return RegExMatch("uic") +def end(): + return RegExMatch(".end") + def _float(): return RegExMatch(r'[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)') @@ -193,6 +196,37 @@ def nonterm_is_branch(nonterm): assert type(nonterm) == NonTerminal return "branch" in nonterm.name +def nonterm_is_ctrl(nonterm): + assert type(nonterm) == NonTerminal + return "ctrl" in nonterm.name + +def gen_dict_from_ctrl(nonterm): + assert nonterm_is_ctrl(nonterm) + rule_names = [n.rule_name for n in nonterm] + if "op_pt" in rule_names: + return {"test_type" : "op_pt"} + elif "tran" in rule_names: + tran_node = nonterm[rule_names.index("tran")] + tran_node_rule_names = [n.rule_name for n in tran_node] + tran_d = {"test_type" : "tran", + "tstep" : tran_node[1].value, + "tstop" : tran_node[2].value} + if "tstart" in tran_node_rule_names: + tran_d["tstart"] = tran_node[3].value + if "tmax" in tran_node_rule_names: + tran_d["tmax"] = tran_node[4].value + if "uic" in tran_node_rule_names: + tran_d["uic"] = tran_node[5].value + else: + if "uic" in tran_node_rule_names: + tran_d["uic"] = tran_node[4].value + else: + if "uic" in tran_node_rule_names: + tran_d["uic"] = tran_node[3].value + return tran_d + else: + assert False + def gen_dict_from_branch(nonterm): assert nonterm_is_branch(nonterm) if nonterm[0].rule_name == "resistor": @@ -295,6 +329,8 @@ def linear_dep_src(s_plus, s_minus, gain, is_voltage_controlled=True): def gen_dict(nonterm): if nonterm_is_branch(nonterm): return gen_dict_from_branch(nonterm) + elif nonterm_is_ctrl(nonterm): + return gen_dict_from_ctrl(nonterm) else: assert False From 92e5ac07068b1dad9b96449b4f3ecf0cc78a160f Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:18:10 -0700 Subject: [PATCH 073/115] Op point parsing working --- OpenSPICE-revamp/op_pt.cir | 6 ++++++ OpenSPICE-revamp/parser.py | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 OpenSPICE-revamp/op_pt.cir diff --git a/OpenSPICE-revamp/op_pt.cir b/OpenSPICE-revamp/op_pt.cir new file mode 100644 index 00000000..fd5592b3 --- /dev/null +++ b/OpenSPICE-revamp/op_pt.cir @@ -0,0 +1,6 @@ +V1 1 0 1 +R1 1 0 1 + +.control + .op +.end diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index 82ba6928..fa0096d9 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -335,7 +335,9 @@ def gen_dict(nonterm): assert False def gen_data_dicts(ptree): - return [gen_dict(_) for _ in ptree] + branches = [gen_dict_from_branch(_) for _ in ptree if nonterm_is_branch(_)] + ctrl = [gen_dict_from_ctrl (_) for _ in ptree if nonterm_is_ctrl (_)] + return {"branches" : branches, "ctrl" : ctrl} def parse(txt): return gen_data_dicts(filter_terms(parser.parse(txt))) @@ -344,5 +346,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("dep_sources.cir", "r") as f: + with open("op_pt.cir", "r") as f: print(parse(f.read())) From ba242160b71928949977ab818c5c4177e1ba70b0 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:19:28 -0700 Subject: [PATCH 074/115] Basic tran working --- OpenSPICE-revamp/parser.py | 2 +- OpenSPICE-revamp/tran.cir | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 OpenSPICE-revamp/tran.cir diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index fa0096d9..e0a52ae7 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -346,5 +346,5 @@ def parse(txt): if __name__ == "__main__": parser = ParserPython(netlist, ws='\t\r ') - with open("op_pt.cir", "r") as f: + with open("tran.cir", "r") as f: print(parse(f.read())) diff --git a/OpenSPICE-revamp/tran.cir b/OpenSPICE-revamp/tran.cir new file mode 100644 index 00000000..92b72c45 --- /dev/null +++ b/OpenSPICE-revamp/tran.cir @@ -0,0 +1,7 @@ +V1 1 0 1 +R1 1 2 1 +C1 2 0 1 + +.control + .tran 1 100 0 1 uic +.end From af9b5c002e7f365cc682e096cb0b7ec46c9fef0f Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:20:07 -0700 Subject: [PATCH 075/115] Updated TODOs file --- OpenSPICE-revamp/todos | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index e4ca6652..d1c87e26 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -8,9 +8,9 @@ (c) CCCS (X) (d) VCCS (X) 6) Behavioral sources (1/2) -7) .control statements for... - (a) DC op point - (b) transient sim +7) .control statements for... (X) + (a) DC op point (X) + (b) transient sim (X) ----- parser.py done ------ 0) Break off cap, ind, res, etc. classes into a separate file imported by parser.py and eqnstr.py @@ -39,3 +39,4 @@ from existing OpenSPICE. Down the road: - Add multiplier m for current sources - Finish behavioral sources +- May need some control modifications. For instance, .endc ending and not .end. From bf3fa2ffe1ca430423032fd56e3fca85dc1b4c90 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 16:22:19 -0700 Subject: [PATCH 076/115] Added another comment todos file. --- OpenSPICE-revamp/todos | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index d1c87e26..0191e945 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -40,3 +40,4 @@ Down the road: - Add multiplier m for current sources - Finish behavioral sources - May need some control modifications. For instance, .endc ending and not .end. +- Consider recycling any PySpice ngspice netlist parser. Basic parser working for now. From ba2da1a7620def61a4cd8e6e7943978057177d5d Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 17:59:25 -0700 Subject: [PATCH 077/115] Broke off component classes into components.py file --- OpenSPICE-revamp/components.py | 16 ++++++++++++++++ OpenSPICE-revamp/eqnstr.py | 3 +++ OpenSPICE-revamp/parser.py | 20 +------------------- OpenSPICE-revamp/todos | 2 +- 4 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 OpenSPICE-revamp/components.py create mode 100755 OpenSPICE-revamp/eqnstr.py diff --git a/OpenSPICE-revamp/components.py b/OpenSPICE-revamp/components.py new file mode 100644 index 00000000..aa06e29f --- /dev/null +++ b/OpenSPICE-revamp/components.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +class Resistor: + pass + +class Capacitor: + pass + +class Inductor: + pass + +class VSource: + pass + +class ISource: + pass diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py new file mode 100755 index 00000000..eee4cd77 --- /dev/null +++ b/OpenSPICE-revamp/eqnstr.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 + +from components import Resistor, Capacitor, Inductor, VSource, ISource diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/parser.py index e0a52ae7..a3581371 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/parser.py @@ -1,25 +1,7 @@ #!/usr/bin/env python3 from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython, Terminal, NonTerminal - -####################################################################################### - -# Component Classes # - -class Resistor: - pass - -class Capacitor: - pass - -class Inductor: - pass - -class VSource: - pass - -class ISource: - pass +from components import Resistor, Capacitor, Inductor, VSource, ISource ####################################################################################### diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 0191e945..dcd53d6c 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -13,7 +13,7 @@ (b) transient sim (X) ----- parser.py done ------ 0) Break off cap, ind, res, etc. classes into a separate file -imported by parser.py and eqnstr.py +imported by parser.py and eqnstr.py (X) 1) Strategy pattern skeleton 2) Equation formatting for transient and op pt 3) Document interface at top of eqnstr.py From e2ec25385bf47113ed14222b915ce26c8c7d6ccc Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 18:05:21 -0700 Subject: [PATCH 078/115] Add strategy pattern skeleton to eqnstr.py --- OpenSPICE-revamp/eqnstr.py | 12 ++++++++++++ OpenSPICE-revamp/todos | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index eee4cd77..531ba240 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -1,3 +1,15 @@ #!/usr/bin/env python3 from components import Resistor, Capacitor, Inductor, VSource, ISource +from abc import ABC, abstractmethod + +class EqnStrContext: + def __init__(self, strategy): + self.strategy = strategy + def execute_strategy(self, parser_output_dict): + return self.strategy.do_operation(parser_output_dict) + +class EqnStrStrategy(ABC): + @abstractmethod + def do_operation(self, parser_output_dict): + pass diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index dcd53d6c..8379877a 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -14,7 +14,7 @@ ----- parser.py done ------ 0) Break off cap, ind, res, etc. classes into a separate file imported by parser.py and eqnstr.py (X) -1) Strategy pattern skeleton +1) Strategy pattern skeleton (X) 2) Equation formatting for transient and op pt 3) Document interface at top of eqnstr.py 4) Document that parser.py's interface is simply ngspice netlist From 93129be2ef409965d4c9958fc30ee778d71d6a52 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:03:08 -0700 Subject: [PATCH 079/115] Basic KCL op point formatting working --- OpenSPICE-revamp/common.py | 7 +++ OpenSPICE-revamp/eqnstr.py | 67 +++++++++++++++++++++- OpenSPICE-revamp/{parser.py => netlist.py} | 57 +++++++++--------- OpenSPICE-revamp/todos | 4 ++ 4 files changed, 103 insertions(+), 32 deletions(-) create mode 100644 OpenSPICE-revamp/common.py rename OpenSPICE-revamp/{parser.py => netlist.py} (89%) diff --git a/OpenSPICE-revamp/common.py b/OpenSPICE-revamp/common.py new file mode 100644 index 00000000..fb97b776 --- /dev/null +++ b/OpenSPICE-revamp/common.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python3 + +def v_format(s): + return "x['v({})']".format(s) + +def i_format(s): + return "x['i({})']".format(s) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 531ba240..171d6a52 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -2,14 +2,75 @@ from components import Resistor, Capacitor, Inductor, VSource, ISource from abc import ABC, abstractmethod +from common import v_format, i_format + +################################################################# + +# Top-Level Classes for Strategy Pattern # class EqnStrContext: def __init__(self, strategy): self.strategy = strategy - def execute_strategy(self, parser_output_dict): - return self.strategy.do_operation(parser_output_dict) + def execute_strategy(self, branch_dicts): + return self.strategy.gen_eqns(branch_dicts) class EqnStrStrategy(ABC): @abstractmethod - def do_operation(self, parser_output_dict): + def gen_eqns(self, branch_dicts): + pass + +################################################################# + +# Strategies # + +class EqnStrOpPtStrategy(EqnStrStrategy): + def __init__(self): pass + def gen_eqns(self, branch_dicts): + return [self.gen_eqn_from_branch(_b) for _b in branch_dicts.items()] + self.gen_kcl_eqns(branch_dicts) + def gen_kcl_eqns(self, branch_dicts): + nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branch_dicts])) + assert "0" in nodes + nodes.remove("0") + kcl_dict = dict(zip(nodes, [[]] * len(nodes))) + for b in branch_dicts: + if b["node_plus"] != "0": + kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"]))) + if b["node_minus"] != "0": + kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"]))) + return ["".join(v) for v in kcl_dict.values()] + def gen_eqn_from_branch(self, _b): + if type(_b) == Resistor: + return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), + v_format(_b["node_minus"]), + i_format(_b["branch_idx"]), + _b["value"]) + elif type(_b) == Capacitor: + return "(({})-({}))".format(i_format(_b["branch_idx"]), 0.00) + elif type(_b) == Inductor: + return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), + v_format(_b["node_minus"]), 0.00) + elif type(_b) == VSource: + return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), + v_format(_b["node_minus"]), + _b["value"]) + elif type(_b) == ISource: + return "(({})-({}))".format(i_format(_b["branch_idx"]), + _b["value"]) + else: + assert False + +class EqnStrTransientStrategy(EqnStrStrategy): + def __init__(self): + pass + def gen_eqns(self, branch_dicts): + pass + +################################################################# + +if __name__ == "__main__": + import netlist + with open("op_pt.cir", "r") as f: + branch_dicts = netlist.parse(f.read())["branches"] + strat = EqnStrOpPtStrategy() + print(strat.gen_kcl_eqns(branch_dicts)) diff --git a/OpenSPICE-revamp/parser.py b/OpenSPICE-revamp/netlist.py similarity index 89% rename from OpenSPICE-revamp/parser.py rename to OpenSPICE-revamp/netlist.py index a3581371..18472869 100755 --- a/OpenSPICE-revamp/parser.py +++ b/OpenSPICE-revamp/netlist.py @@ -2,6 +2,7 @@ from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython, Terminal, NonTerminal from components import Resistor, Capacitor, Inductor, VSource, ISource +from common import v_format, i_format ####################################################################################### @@ -209,20 +210,22 @@ def gen_dict_from_ctrl(nonterm): else: assert False -def gen_dict_from_branch(nonterm): +def gen_dict_from_branch(nonterm, branch_idx): assert nonterm_is_branch(nonterm) if nonterm[0].rule_name == "resistor": assert len(nonterm[0]) == 4 return {"component" : Resistor, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value} + "value" : nonterm[0][3].value, + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "capacitor": assert len(nonterm[0]) == 4 or len(nonterm[0]) == 5 _cap = {"component" : Capacitor, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value} + "value" : nonterm[0][3].value, + "branch_idx" : branch_idx} if len(nonterm[0]) == 5: _cap["ic"] = nonterm[0][4][1].value return _cap @@ -231,7 +234,8 @@ def gen_dict_from_branch(nonterm): _ind = {"component" : Inductor, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value} + "value" : nonterm[0][3].value, + "branch_idx" : branch_idx} if len(nonterm[0]) == 5: _ind["ic"] = nonterm[0][4][1].value return _ind @@ -240,25 +244,29 @@ def gen_dict_from_branch(nonterm): return {"component" : VSource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value} + "value" : nonterm[0][3].value, + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "isource": assert len(nonterm[0]) == 4 return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value} + "value" : nonterm[0][3].value, + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "extvsource": assert len(nonterm[0]) == 6 return {"component" : VSource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : "get_vsrc()"} + "value" : "get_vsrc()", + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "extisource": assert len(nonterm[0]) == 6 return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : "get_isrc()"} + "value" : "get_isrc()", + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "vccssource": assert len(nonterm[0]) == 6 return {"component" : ISource, @@ -267,7 +275,8 @@ def gen_dict_from_branch(nonterm): "value" : linear_dep_src(nonterm[0][3].value, nonterm[0][4].value, nonterm[0][5].value, - is_voltage_controlled=True)} + is_voltage_controlled=True), + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "vcvssource": assert len(nonterm[0]) == 6 return {"component" : VSource, @@ -276,7 +285,8 @@ def gen_dict_from_branch(nonterm): "value" : linear_dep_src(nonterm[0][3].value, nonterm[0][4].value, nonterm[0][5].value, - is_voltage_controlled=True)} + is_voltage_controlled=True), + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "ccvssource": assert len(nonterm[0]) == 6 return {"component" : VSource, @@ -285,7 +295,8 @@ def gen_dict_from_branch(nonterm): "value" : linear_dep_src(nonterm[0][3].value, nonterm[0][4].value, nonterm[0][5].value, - is_voltage_controlled=False)} + is_voltage_controlled=False), + "branch_idx" : branch_idx} elif nonterm[0].rule_name == "cccssource": assert len(nonterm[0]) == 6 return {"component" : ISource, @@ -294,39 +305,27 @@ def gen_dict_from_branch(nonterm): "value" : linear_dep_src(nonterm[0][3].value, nonterm[0][4].value, nonterm[0][5].value, - is_voltage_controlled=False)} + is_voltage_controlled=False), + "branch_idx" : branch_idx} else: assert False -def v_format(s): - return "x['v({})']".format(s) - -def i_format(s): - return "x['i({})']".format(s) - def linear_dep_src(s_plus, s_minus, gain, is_voltage_controlled=True): return "(({})*(({})-({})))".format(gain, v_format(s_plus) if is_voltage_controlled else i_format(s_plus), v_format(s_minus) if is_voltage_controlled else i_format(s_minus)) -def gen_dict(nonterm): - if nonterm_is_branch(nonterm): - return gen_dict_from_branch(nonterm) - elif nonterm_is_ctrl(nonterm): - return gen_dict_from_ctrl(nonterm) - else: - assert False - def gen_data_dicts(ptree): - branches = [gen_dict_from_branch(_) for _ in ptree if nonterm_is_branch(_)] - ctrl = [gen_dict_from_ctrl (_) for _ in ptree if nonterm_is_ctrl (_)] + branches = [_ for _ in ptree if nonterm_is_branch(_)] + branches = [gen_dict_from_branch(_, branch_idx) for branch_idx,_ in enumerate(branches)] + ctrl = [gen_dict_from_ctrl(_) for _ in ptree if nonterm_is_ctrl(_)] return {"branches" : branches, "ctrl" : ctrl} def parse(txt): + parser = ParserPython(netlist, ws='\t\r ') return gen_data_dicts(filter_terms(parser.parse(txt))) ####################################################################################### if __name__ == "__main__": - parser = ParserPython(netlist, ws='\t\r ') with open("tran.cir", "r") as f: print(parse(f.read())) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 8379877a..5cb35798 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -16,6 +16,10 @@ imported by parser.py and eqnstr.py (X) 1) Strategy pattern skeleton (X) 2) Equation formatting for transient and op pt + (a) Op pt formatting (X) + (b) Transient formatting + (c) Add KCL equations for op pt (X) + (d) Add KCL equations for transient 3) Document interface at top of eqnstr.py 4) Document that parser.py's interface is simply ngspice netlist 5) Write OpenSPICE.py as top-level file to call both. From 706dbe73942ffa845ac20a6ce7376c8ac216b4ca Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:09:37 -0700 Subject: [PATCH 080/115] Enabled equation generation for op point sims --- OpenSPICE-revamp/eqnstr.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 171d6a52..9c5bd392 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -27,7 +27,7 @@ class EqnStrOpPtStrategy(EqnStrStrategy): def __init__(self): pass def gen_eqns(self, branch_dicts): - return [self.gen_eqn_from_branch(_b) for _b in branch_dicts.items()] + self.gen_kcl_eqns(branch_dicts) + return [self.gen_eqn_from_branch(_b) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts) def gen_kcl_eqns(self, branch_dicts): nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branch_dicts])) assert "0" in nodes @@ -40,21 +40,21 @@ def gen_kcl_eqns(self, branch_dicts): kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"]))) return ["".join(v) for v in kcl_dict.values()] def gen_eqn_from_branch(self, _b): - if type(_b) == Resistor: + if _b["component"] == Resistor: return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), v_format(_b["node_minus"]), i_format(_b["branch_idx"]), _b["value"]) - elif type(_b) == Capacitor: + elif _b["component"] == Capacitor: return "(({})-({}))".format(i_format(_b["branch_idx"]), 0.00) - elif type(_b) == Inductor: + elif _b["component"] == Inductor: return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), v_format(_b["node_minus"]), 0.00) - elif type(_b) == VSource: + elif _b["component"] == VSource: return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), v_format(_b["node_minus"]), _b["value"]) - elif type(_b) == ISource: + elif _b["component"] == ISource: return "(({})-({}))".format(i_format(_b["branch_idx"]), _b["value"]) else: @@ -73,4 +73,4 @@ def gen_eqns(self, branch_dicts): with open("op_pt.cir", "r") as f: branch_dicts = netlist.parse(f.read())["branches"] strat = EqnStrOpPtStrategy() - print(strat.gen_kcl_eqns(branch_dicts)) + print(strat.gen_eqns(branch_dicts)) From 7d9fcbe2a238f64e00a754aeed20c0bbfb68af98 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:28:02 -0700 Subject: [PATCH 081/115] Modify common formatting to support most of the behavioral source syntax --- OpenSPICE-revamp/common.py | 4 ++-- OpenSPICE-revamp/todos | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSPICE-revamp/common.py b/OpenSPICE-revamp/common.py index fb97b776..08725f39 100644 --- a/OpenSPICE-revamp/common.py +++ b/OpenSPICE-revamp/common.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 def v_format(s): - return "x['v({})']".format(s) + return "v({})".format(s) def i_format(s): - return "x['i({})']".format(s) + return "i({})".format(s) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 5cb35798..60bf5b35 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -7,7 +7,7 @@ (b) CCVS (X) (c) CCCS (X) (d) VCCS (X) -6) Behavioral sources (1/2) +6) Behavioral sources (X) 7) .control statements for... (X) (a) DC op point (X) (b) transient sim (X) From c08d45f2ab304f54b47ead9a9f38b2b64d010c03 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:39:03 -0700 Subject: [PATCH 082/115] Move function to abstract class --- OpenSPICE-revamp/eqnstr.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 9c5bd392..18776d9f 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -18,16 +18,6 @@ class EqnStrStrategy(ABC): @abstractmethod def gen_eqns(self, branch_dicts): pass - -################################################################# - -# Strategies # - -class EqnStrOpPtStrategy(EqnStrStrategy): - def __init__(self): - pass - def gen_eqns(self, branch_dicts): - return [self.gen_eqn_from_branch(_b) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts) def gen_kcl_eqns(self, branch_dicts): nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branch_dicts])) assert "0" in nodes @@ -39,6 +29,16 @@ def gen_kcl_eqns(self, branch_dicts): if b["node_minus"] != "0": kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"]))) return ["".join(v) for v in kcl_dict.values()] + +################################################################# + +# Strategies # + +class EqnStrOpPtStrategy(EqnStrStrategy): + def __init__(self): + pass + def gen_eqns(self, branch_dicts): + return [self.gen_eqn_from_branch(_b) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts) def gen_eqn_from_branch(self, _b): if _b["component"] == Resistor: return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), From fb90b6ad3142de5882ee535494c38343fb2d5c56 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:39:53 -0700 Subject: [PATCH 083/115] Move another function to abstract class --- OpenSPICE-revamp/eqnstr.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 18776d9f..47d9a2ab 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -16,8 +16,10 @@ def execute_strategy(self, branch_dicts): class EqnStrStrategy(ABC): @abstractmethod - def gen_eqns(self, branch_dicts): + def gen_eqn_from_branch(self, _b): pass + def gen_eqns(self, branch_dicts): + return [self.gen_eqn_from_branch(_b) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts) def gen_kcl_eqns(self, branch_dicts): nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branch_dicts])) assert "0" in nodes @@ -37,8 +39,6 @@ def gen_kcl_eqns(self, branch_dicts): class EqnStrOpPtStrategy(EqnStrStrategy): def __init__(self): pass - def gen_eqns(self, branch_dicts): - return [self.gen_eqn_from_branch(_b) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts) def gen_eqn_from_branch(self, _b): if _b["component"] == Resistor: return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), From 70a2b97e96b95d254d4894cbdfa33f38b455d088 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:49:35 -0700 Subject: [PATCH 084/115] Added transient equations --- OpenSPICE-revamp/common.py | 6 ++++++ OpenSPICE-revamp/eqnstr.py | 27 +++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/OpenSPICE-revamp/common.py b/OpenSPICE-revamp/common.py index 08725f39..2578ef8b 100644 --- a/OpenSPICE-revamp/common.py +++ b/OpenSPICE-revamp/common.py @@ -1,7 +1,13 @@ #!/usr/bin/env python3 +def dv_format(s): + return "dv({})".format(s) + def v_format(s): return "v({})".format(s) +def di_format(s): + return "di({})".format(s) + def i_format(s): return "i({})".format(s) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 47d9a2ab..b9d0dadc 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -63,8 +63,31 @@ def gen_eqn_from_branch(self, _b): class EqnStrTransientStrategy(EqnStrStrategy): def __init__(self): pass - def gen_eqns(self, branch_dicts): - pass + def gen_eqn_from_branch(self, _b): + if _b["component"] == Resistor: + return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), + v_format(_b["node_minus"]), + i_format(_b["branch_idx"]), + _b["value"]) + elif _b["component"] == Capacitor: + return "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"]), + _b["value"], + dv_format(_b["node_plus"]), + dv_format(_b["node_minus"])) + elif _b["component"] == Inductor: + return "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"]), + v_format(_b["node_minus"]), + _b["value"], + di_format(_b["branch_idx"])) + elif _b["component"] == VSource: + return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), + v_format(_b["node_minus"]), + _b["value"]) + elif _b["component"] == ISource: + return "(({})-({}))".format(i_format(_b["branch_idx"]), + _b["value"]) + else: + assert False ################################################################# From b4d71e76828513d13dba3b8593ddf3bfa551113f Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 20:51:46 -0700 Subject: [PATCH 085/115] Transient equations working --- OpenSPICE-revamp/eqnstr.py | 4 ++++ OpenSPICE-revamp/todos | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index b9d0dadc..e68a544f 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -97,3 +97,7 @@ def gen_eqn_from_branch(self, _b): branch_dicts = netlist.parse(f.read())["branches"] strat = EqnStrOpPtStrategy() print(strat.gen_eqns(branch_dicts)) + with open("tran.cir", "r") as f: + branch_dicts = netlist.parse(f.read())["branches"] + strat = EqnStrOpPtStrategy() + print(strat.gen_eqns(branch_dicts)) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index 60bf5b35..ade9c6da 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -17,9 +17,9 @@ imported by parser.py and eqnstr.py (X) 1) Strategy pattern skeleton (X) 2) Equation formatting for transient and op pt (a) Op pt formatting (X) - (b) Transient formatting + (b) Transient formatting (X) (c) Add KCL equations for op pt (X) - (d) Add KCL equations for transient + (d) Add KCL equations for transient (X) 3) Document interface at top of eqnstr.py 4) Document that parser.py's interface is simply ngspice netlist 5) Write OpenSPICE.py as top-level file to call both. From fadd3d3443c798a46c1794e5bf6b1fb5b272c11c Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 31 Mar 2022 21:05:22 -0700 Subject: [PATCH 086/115] Get OpenSPICE preliminary top level script working --- OpenSPICE-revamp/OpenSPICE.py | 11 +++++++++++ OpenSPICE-revamp/eqnstr.py | 19 ++++++++++++------- OpenSPICE-revamp/netlist.py | 2 +- OpenSPICE-revamp/todos | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) create mode 100755 OpenSPICE-revamp/OpenSPICE.py diff --git a/OpenSPICE-revamp/OpenSPICE.py b/OpenSPICE-revamp/OpenSPICE.py new file mode 100755 index 00000000..73b12447 --- /dev/null +++ b/OpenSPICE-revamp/OpenSPICE.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +import netlist +import eqnstr +import sys + +if __name__ == "__main__": + with open(sys.argv[1], "r") as f: + file_txt = f.read() + ptree = netlist.parse(file_txt) + eqns = eqnstr.gen_eqns_top(ptree) + print(eqns) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index e68a544f..e7e4b252 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -2,7 +2,7 @@ from components import Resistor, Capacitor, Inductor, VSource, ISource from abc import ABC, abstractmethod -from common import v_format, i_format +from common import v_format, i_format, dv_format, di_format ################################################################# @@ -89,15 +89,20 @@ def gen_eqn_from_branch(self, _b): else: assert False +def gen_eqns_top(parse_dict): + # TODO need to support multiple test types? + if parse_dict["ctrl"][0]["test_type"] == "op_pt": + return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"]) + elif parse_dict["ctrl"][0]["test_type"] == "tran" : + return EqnStrTransientStrategy().gen_eqns(parse_dict["branches"]) + else: + assert False + ################################################################# if __name__ == "__main__": import netlist with open("op_pt.cir", "r") as f: - branch_dicts = netlist.parse(f.read())["branches"] - strat = EqnStrOpPtStrategy() - print(strat.gen_eqns(branch_dicts)) + print(gen_eqns_top(netlist.parse(f.read()))) with open("tran.cir", "r") as f: - branch_dicts = netlist.parse(f.read())["branches"] - strat = EqnStrOpPtStrategy() - print(strat.gen_eqns(branch_dicts)) + print(gen_eqns_top(netlist.parse(f.read()))) diff --git a/OpenSPICE-revamp/netlist.py b/OpenSPICE-revamp/netlist.py index 18472869..e2319c19 100755 --- a/OpenSPICE-revamp/netlist.py +++ b/OpenSPICE-revamp/netlist.py @@ -14,7 +14,7 @@ def netlist(): def branch(): # TODO: Enable behavisource and behavvsource return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, - vccssource, vcvssource, ccvssource, cccssource] + vccssource, vcvssource, ccvssource, cccssource, behavisource, behavvsource] def ctrl(): return control, OneOrMore(newline), [op_pt, tran], OneOrMore(newline), end diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos index ade9c6da..a6907734 100644 --- a/OpenSPICE-revamp/todos +++ b/OpenSPICE-revamp/todos @@ -22,7 +22,7 @@ imported by parser.py and eqnstr.py (X) (d) Add KCL equations for transient (X) 3) Document interface at top of eqnstr.py 4) Document that parser.py's interface is simply ngspice netlist -5) Write OpenSPICE.py as top-level file to call both. +5) Write OpenSPICE.py as top-level file to call both. (X) ----- eqnstr.py done ------ 1) ****** FIGURE OUT HOW TO DEAL WITH GET_VSRC, SEND_DATA, etc. ****** 2) Implement strategy pattern skeleton. From 745831083d95e46d1cb4b73494bafe3284dd9621 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 1 Apr 2022 09:44:18 -0700 Subject: [PATCH 087/115] Remove unnecessary context object --- OpenSPICE-revamp/eqnstr.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index e7e4b252..858e5507 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -8,12 +8,6 @@ # Top-Level Classes for Strategy Pattern # -class EqnStrContext: - def __init__(self, strategy): - self.strategy = strategy - def execute_strategy(self, branch_dicts): - return self.strategy.gen_eqns(branch_dicts) - class EqnStrStrategy(ABC): @abstractmethod def gen_eqn_from_branch(self, _b): From 721a556a4adb66530a8ddb0f7d5a539a0c57e4ad Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 1 Apr 2022 12:45:11 -0700 Subject: [PATCH 088/115] Fixed equation string formatting for op pt sims --- OpenSPICE-revamp/common.py | 8 +- OpenSPICE-revamp/eqnstr.py | 40 +++++----- OpenSPICE-revamp/netlist.py | 151 +++++++++++++++++++++++++++++------- 3 files changed, 145 insertions(+), 54 deletions(-) diff --git a/OpenSPICE-revamp/common.py b/OpenSPICE-revamp/common.py index 2578ef8b..c8544297 100644 --- a/OpenSPICE-revamp/common.py +++ b/OpenSPICE-revamp/common.py @@ -3,11 +3,11 @@ def dv_format(s): return "dv({})".format(s) -def v_format(s): - return "v({})".format(s) +def v_format(s, n): + return "(x[{}])".format(n.index(s)) if s != "0" else "(0.00)" def di_format(s): return "di({})".format(s) -def i_format(s): - return "i({})".format(s) +def i_format(s, n): + return "(x[{}])".format(len(n) + int(s)) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 858e5507..f290a3df 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -12,18 +12,15 @@ class EqnStrStrategy(ABC): @abstractmethod def gen_eqn_from_branch(self, _b): pass - def gen_eqns(self, branch_dicts): - return [self.gen_eqn_from_branch(_b) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts) - def gen_kcl_eqns(self, branch_dicts): - nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branch_dicts])) - assert "0" in nodes - nodes.remove("0") + def gen_eqns(self, branch_dicts, nodes): + return [self.gen_eqn_from_branch(_b, nodes) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts, nodes) + def gen_kcl_eqns(self, branch_dicts, nodes): kcl_dict = dict(zip(nodes, [[]] * len(nodes))) for b in branch_dicts: if b["node_plus"] != "0": - kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"]))) + kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"], nodes))) if b["node_minus"] != "0": - kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"]))) + kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"], nodes))) return ["".join(v) for v in kcl_dict.values()] ################################################################# @@ -33,23 +30,23 @@ def gen_kcl_eqns(self, branch_dicts): class EqnStrOpPtStrategy(EqnStrStrategy): def __init__(self): pass - def gen_eqn_from_branch(self, _b): + def gen_eqn_from_branch(self, _b, _n): if _b["component"] == Resistor: - return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), - v_format(_b["node_minus"]), - i_format(_b["branch_idx"]), + return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"], _n), + v_format(_b["node_minus"], _n), + i_format(_b["branch_idx"], _n), _b["value"]) elif _b["component"] == Capacitor: - return "(({})-({}))".format(i_format(_b["branch_idx"]), 0.00) + return "(({})-({}))".format(i_format(_b["branch_idx"], _n), 0.00) elif _b["component"] == Inductor: - return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), - v_format(_b["node_minus"]), 0.00) + return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n), + v_format(_b["node_minus"], _n), 0.00) elif _b["component"] == VSource: - return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), - v_format(_b["node_minus"]), + return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n), + v_format(_b["node_minus"], _n), _b["value"]) elif _b["component"] == ISource: - return "(({})-({}))".format(i_format(_b["branch_idx"]), + return "(({})-({}))".format(i_format(_b["branch_idx"], _n), _b["value"]) else: assert False @@ -57,7 +54,7 @@ def gen_eqn_from_branch(self, _b): class EqnStrTransientStrategy(EqnStrStrategy): def __init__(self): pass - def gen_eqn_from_branch(self, _b): + def gen_eqn_from_branch(self, _b, _n): if _b["component"] == Resistor: return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), v_format(_b["node_minus"]), @@ -86,9 +83,9 @@ def gen_eqn_from_branch(self, _b): def gen_eqns_top(parse_dict): # TODO need to support multiple test types? if parse_dict["ctrl"][0]["test_type"] == "op_pt": - return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"]) + return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"], parse_dict["nodes"]) elif parse_dict["ctrl"][0]["test_type"] == "tran" : - return EqnStrTransientStrategy().gen_eqns(parse_dict["branches"]) + return EqnStrTransientStrategy().gen_eqns(parse_dict["branches"], parse_dict["nodes"]) else: assert False @@ -98,5 +95,6 @@ def gen_eqns_top(parse_dict): import netlist with open("op_pt.cir", "r") as f: print(gen_eqns_top(netlist.parse(f.read()))) + assert False with open("tran.cir", "r") as f: print(gen_eqns_top(netlist.parse(f.read()))) diff --git a/OpenSPICE-revamp/netlist.py b/OpenSPICE-revamp/netlist.py index e2319c19..e9c69d54 100755 --- a/OpenSPICE-revamp/netlist.py +++ b/OpenSPICE-revamp/netlist.py @@ -3,6 +3,7 @@ from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython, Terminal, NonTerminal from components import Resistor, Capacitor, Inductor, VSource, ISource from common import v_format, i_format +from abc import ABC, abstractmethod ####################################################################################### @@ -55,6 +56,93 @@ def _float(): ####################################################################################### +# Text Formatting Classes # + +class TextFmt(ABC): + @abstractmethod + def gen_txt_str(self, nodes): + pass + +class ResistorTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + return self.value + +class CapacitorTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + return self.value + +class InductorTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + return self.value + +class VSourceTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + return self.value + +class ISourceTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + return self.value + +class ExtVSourceTextFmt(TextFmt): + def __init__(self): + pass + def gen_txt_str(self, nodes): + return "(get_vsrc())" + +class ExtISourceTextFmt(TextFmt): + def __init__(self, value): + pass + def gen_txt_str(self, nodes): + return "(get_isrc())" + +class VCCSSourceTextFmt(TextFmt): + def __init__(self, value, node_plus, node_minus): + self.value = value + self.node_plus = node_plus + self.node_minus = node_minus + def gen_txt_str(self, nodes): + return "(({})*(({})-({})))".format(self.value, v_format(self.node_plus, nodes), + v_format(self.node_minus, nodes)) + +class VCVSSourceTextFmt(TextFmt): + def __init__(self, value, node_plus, node_minus): + self.value = value + self.node_plus = node_plus + self.node_minus = node_minus + def gen_txt_str(self, nodes): + return "(({})*(({})-({})))".format(self.value, v_format(self.node_plus, nodes), + v_format(self.node_minus, nodes)) + +class CCVSSourceTextFmt(TextFmt): + def __init__(self, value, branch_plus, branch_minus): + self.value = value + self.branch_plus = branch_plus + self.branch_minus = branch_minus + def gen_txt_str(self, nodes): + return "(({})*(({})-({})))".format(self.value, i_format(self.branch_plus, nodes), + i_format(self.branch_minus, nodes)) + +class CCCSSourceTextFmt(TextFmt): + def __init__(self, value, branch_plus, branch_minus): + self.value = value + self.branch_plus = branch_plus + self.branch_minus = branch_minus + def gen_txt_str(self, nodes): + return "(({})*(({})-({})))".format(self.value, i_format(self.branch_plus, nodes), + i_format(self.branch_minus, nodes)) + +####################################################################################### + # Component Rules # def inductor(): @@ -172,6 +260,15 @@ def behavsrccomponent(): # Parsing Functions # +class Netlist: + def __init__(self): + self.nodes = [] + self.branches = [] + + def gen_dict_from_branch(self, nonterm, branch_idx): + assert nonterm_is_branch(nonterm) + + def filter_terms(ptree): return [_ for _ in ptree if type(_) != Terminal] @@ -217,14 +314,14 @@ def gen_dict_from_branch(nonterm, branch_idx): return {"component" : Resistor, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value, + "value" : ResistorTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "capacitor": assert len(nonterm[0]) == 4 or len(nonterm[0]) == 5 _cap = {"component" : Capacitor, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value, + "value" : CapacitorTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} if len(nonterm[0]) == 5: _cap["ic"] = nonterm[0][4][1].value @@ -234,7 +331,7 @@ def gen_dict_from_branch(nonterm, branch_idx): _ind = {"component" : Inductor, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value, + "value" : InductorTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} if len(nonterm[0]) == 5: _ind["ic"] = nonterm[0][4][1].value @@ -244,81 +341,77 @@ def gen_dict_from_branch(nonterm, branch_idx): return {"component" : VSource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value, + "value" : VSourceTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "isource": assert len(nonterm[0]) == 4 return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : nonterm[0][3].value, + "value" : ISourceTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "extvsource": assert len(nonterm[0]) == 6 return {"component" : VSource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : "get_vsrc()", + "value" : ExtVSourceTextFmt(), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "extisource": assert len(nonterm[0]) == 6 return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : "get_isrc()", + "value" : ExtISourceTextFmt(), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "vccssource": assert len(nonterm[0]) == 6 return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : linear_dep_src(nonterm[0][3].value, - nonterm[0][4].value, - nonterm[0][5].value, - is_voltage_controlled=True), + "value" : VCCSSourceTextFmt(nonterm[0][5].value, + nonterm[0][3].value, + nonterm[0][4].value), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "vcvssource": assert len(nonterm[0]) == 6 return {"component" : VSource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : linear_dep_src(nonterm[0][3].value, - nonterm[0][4].value, - nonterm[0][5].value, - is_voltage_controlled=True), + "value" : VCVSSourceTextFmt(nonterm[0][5].value, + nonterm[0][3].value, + nonterm[0][4].value), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "ccvssource": assert len(nonterm[0]) == 6 return {"component" : VSource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : linear_dep_src(nonterm[0][3].value, - nonterm[0][4].value, - nonterm[0][5].value, - is_voltage_controlled=False), + "value" : CCVSSourceTextFmt(nonterm[0][5].value, + nonterm[0][3].value, + nonterm[0][4].value), "branch_idx" : branch_idx} elif nonterm[0].rule_name == "cccssource": assert len(nonterm[0]) == 6 return {"component" : ISource, "node_plus" : nonterm[0][1].value, "node_minus" : nonterm[0][2].value, - "value" : linear_dep_src(nonterm[0][3].value, - nonterm[0][4].value, - nonterm[0][5].value, - is_voltage_controlled=False), + "value" : CCCSSourceTextFmt(nonterm[0][5].value, + nonterm[0][3].value, + nonterm[0][4].value), "branch_idx" : branch_idx} else: assert False -def linear_dep_src(s_plus, s_minus, gain, is_voltage_controlled=True): - return "(({})*(({})-({})))".format(gain, v_format(s_plus) if is_voltage_controlled else i_format(s_plus), - v_format(s_minus) if is_voltage_controlled else i_format(s_minus)) - def gen_data_dicts(ptree): branches = [_ for _ in ptree if nonterm_is_branch(_)] branches = [gen_dict_from_branch(_, branch_idx) for branch_idx,_ in enumerate(branches)] + nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branches])) + assert "0" in nodes + nodes.remove("0") + [_.update({"value" : _["value"].gen_txt_str(nodes)}) for _ in branches] ctrl = [gen_dict_from_ctrl(_) for _ in ptree if nonterm_is_ctrl(_)] - return {"branches" : branches, "ctrl" : ctrl} + return {"branches" : branches, "nodes" : nodes, "ctrl" : ctrl} def parse(txt): parser = ParserPython(netlist, ws='\t\r ') @@ -327,5 +420,5 @@ def parse(txt): ####################################################################################### if __name__ == "__main__": - with open("tran.cir", "r") as f: + with open("dep_sources.cir", "r") as f: print(parse(f.read())) From a5d5717e7208753a452efef4aa4421b405561a14 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 1 Apr 2022 13:00:10 -0700 Subject: [PATCH 089/115] Fixed transient sim eqn gen --- OpenSPICE-revamp/common.py | 22 ++++++++++++++-------- OpenSPICE-revamp/eqnstr.py | 25 ++++++++++++------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/OpenSPICE-revamp/common.py b/OpenSPICE-revamp/common.py index c8544297..dc106473 100644 --- a/OpenSPICE-revamp/common.py +++ b/OpenSPICE-revamp/common.py @@ -1,13 +1,19 @@ #!/usr/bin/env python3 -def dv_format(s): - return "dv({})".format(s) +def dv_format(s, n): + return "(({})-({}))".format(v_format(s, n, trans=True, prev=False), + v_format(s, n, trans=True, prev=True )) -def v_format(s, n): - return "(x[{}])".format(n.index(s)) if s != "0" else "(0.00)" +def v_format(s, n, trans=False, prev=False): + inner = "t+dt" if not prev else "t" + return "(x{}[{}])".format("[{}]".format(inner) if trans else "", + n.index(s)) if s != "0" else "(0.00)" -def di_format(s): - return "di({})".format(s) +def di_format(s, n): + return "(({})-({}))".format(i_format(s, n, trans=True, prev=False), + i_format(s, n, trans=True, prev=True )) -def i_format(s, n): - return "(x[{}])".format(len(n) + int(s)) +def i_format(s, n, trans=False, prev=False): + inner = "t+dt" if not prev else "t" + return "(x{}[{}])".format("[{}]".format(inner) if trans else "", + len(n) + int(s)) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index f290a3df..c7798efc 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -56,26 +56,26 @@ def __init__(self): pass def gen_eqn_from_branch(self, _b, _n): if _b["component"] == Resistor: - return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"]), - v_format(_b["node_minus"]), - i_format(_b["branch_idx"]), + return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"], _n, trans=True), + v_format(_b["node_minus"], _n, trans=True), + i_format(_b["branch_idx"], _n, trans=True), _b["value"]) elif _b["component"] == Capacitor: - return "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"]), + return "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"], _n, trans=True), _b["value"], - dv_format(_b["node_plus"]), - dv_format(_b["node_minus"])) + dv_format(_b["node_plus"], _n), + dv_format(_b["node_minus"], _n)) elif _b["component"] == Inductor: - return "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"]), - v_format(_b["node_minus"]), + return "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"], _n, trans=True), + v_format(_b["node_minus"], _n, trans=True), _b["value"], - di_format(_b["branch_idx"])) + di_format(_b["branch_idx"], _n)) elif _b["component"] == VSource: - return "((({})-({}))-({}))".format(v_format(_b["node_plus"]), - v_format(_b["node_minus"]), + return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n, trans=True), + v_format(_b["node_minus"], _n, trans=True), _b["value"]) elif _b["component"] == ISource: - return "(({})-({}))".format(i_format(_b["branch_idx"]), + return "(({})-({}))".format(i_format(_b["branch_idx"], _n, trans=True), _b["value"]) else: assert False @@ -95,6 +95,5 @@ def gen_eqns_top(parse_dict): import netlist with open("op_pt.cir", "r") as f: print(gen_eqns_top(netlist.parse(f.read()))) - assert False with open("tran.cir", "r") as f: print(gen_eqns_top(netlist.parse(f.read()))) From 3e348b09639f526f54d016cd6b105e0e47b472e2 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 1 Apr 2022 17:17:16 -0700 Subject: [PATCH 090/115] Add initial conditions to eqnstr --- OpenSPICE-revamp/eqnstr.py | 28 ++++++++++++++++++++-------- OpenSPICE-revamp/tran.cir | 2 +- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index c7798efc..36a48bd0 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -61,15 +61,26 @@ def gen_eqn_from_branch(self, _b, _n): i_format(_b["branch_idx"], _n, trans=True), _b["value"]) elif _b["component"] == Capacitor: - return "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"], _n, trans=True), - _b["value"], - dv_format(_b["node_plus"], _n), - dv_format(_b["node_minus"], _n)) + if "ic" in _b.keys(): + prefix = "((({})-({}))-({})) if t == 0 else ".format(v_format(_b["node_plus"], _n, trans=True), + v_format(_b["node_minus"], _n, trans=True), + _b["ic"]) + else: + prefix = "" + return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"], _n, trans=True), + _b["value"], + dv_format(_b["node_plus"], _n), + dv_format(_b["node_minus"], _n)) elif _b["component"] == Inductor: - return "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"], _n, trans=True), - v_format(_b["node_minus"], _n, trans=True), - _b["value"], - di_format(_b["branch_idx"], _n)) + if "ic" in _b.keys(): + prefix = "(({})-({})) if t == 0 else ".format(i_format(_b["branch_idx"], _n, trans=True), + _b["ic"]) + else: + prefix = "" + return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"], _n, trans=True), + v_format(_b["node_minus"], _n, trans=True), + _b["value"], + di_format(_b["branch_idx"], _n)) elif _b["component"] == VSource: return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n, trans=True), v_format(_b["node_minus"], _n, trans=True), @@ -82,6 +93,7 @@ def gen_eqn_from_branch(self, _b, _n): def gen_eqns_top(parse_dict): # TODO need to support multiple test types? + # TODO disable ic if uic arg is not provided to trans if parse_dict["ctrl"][0]["test_type"] == "op_pt": return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"], parse_dict["nodes"]) elif parse_dict["ctrl"][0]["test_type"] == "tran" : diff --git a/OpenSPICE-revamp/tran.cir b/OpenSPICE-revamp/tran.cir index 92b72c45..dc8b4b73 100644 --- a/OpenSPICE-revamp/tran.cir +++ b/OpenSPICE-revamp/tran.cir @@ -1,6 +1,6 @@ V1 1 0 1 R1 1 2 1 -C1 2 0 1 +C1 2 0 1 ic=1 .control .tran 1 100 0 1 uic From b86b2718bad24d77919a7edd913adabf784cfc2c Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 1 Apr 2022 18:21:03 -0700 Subject: [PATCH 091/115] Solvers works, but spits out incorrect result --- OpenSPICE-revamp/op_pt_divider.cir | 7 ++++++ OpenSPICE-revamp/solve.py | 34 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 OpenSPICE-revamp/op_pt_divider.cir create mode 100755 OpenSPICE-revamp/solve.py diff --git a/OpenSPICE-revamp/op_pt_divider.cir b/OpenSPICE-revamp/op_pt_divider.cir new file mode 100644 index 00000000..9e9aeeaf --- /dev/null +++ b/OpenSPICE-revamp/op_pt_divider.cir @@ -0,0 +1,7 @@ +V1 1 0 1 +R1 1 2 1 +R2 2 0 1 + +.control + .op +.end diff --git a/OpenSPICE-revamp/solve.py b/OpenSPICE-revamp/solve.py new file mode 100755 index 00000000..334d414e --- /dev/null +++ b/OpenSPICE-revamp/solve.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +from abc import ABC, abstractmethod +from scipy.optimize import root + +################################################################# + +# Top-Level Classes for Strategy Pattern # + +class SolverStrategy(ABC): + @abstractmethod + def solve_eqns(self): + pass + +class OpPtSolverStrategy(SolverStrategy): + def __init__(self, eqns): + self.eqns = eqns + def solve_eqns(self): + # https://bugs.python.org/issue4831 + ldict = locals() + s = "y = lambda x : [" + ",".join(self.eqns) + "]" + exec(s, globals(), ldict) + y = ldict['y'] + return root(y, [1.00] * len(self.eqns)).x + +if __name__ == "__main__": + import netlist + import eqnstr + with open("op_pt_divider.cir", "r") as f: + txt = f.read() + n = netlist.parse(txt) + eqn = eqnstr.gen_eqns_top(n) + strat = OpPtSolverStrategy(eqn) + print(strat.solve_eqns()) From 06d5e4cb3844ea7a4a55812cbbbd64ff08ec78f1 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 2 Apr 2022 20:47:17 -0700 Subject: [PATCH 092/115] Fixed op point bug --- OpenSPICE-revamp/eqnstr.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index 36a48bd0..cf49cc8b 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -18,9 +18,11 @@ def gen_kcl_eqns(self, branch_dicts, nodes): kcl_dict = dict(zip(nodes, [[]] * len(nodes))) for b in branch_dicts: if b["node_plus"] != "0": - kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"], nodes))) + # TODO: Why does this syntax not work? + # kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"], nodes))) + kcl_dict[b["node_plus"]] = kcl_dict[b["node_plus"]] + ["-({})".format(i_format(b["branch_idx"], nodes))] if b["node_minus"] != "0": - kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"], nodes))) + kcl_dict[b["node_minus"]] = kcl_dict[b["node_minus"]] + ["+({})".format(i_format(b["branch_idx"], nodes))] return ["".join(v) for v in kcl_dict.values()] ################################################################# @@ -105,7 +107,10 @@ def gen_eqns_top(parse_dict): if __name__ == "__main__": import netlist - with open("op_pt.cir", "r") as f: - print(gen_eqns_top(netlist.parse(f.read()))) - with open("tran.cir", "r") as f: - print(gen_eqns_top(netlist.parse(f.read()))) + # with open("op_pt.cir", "r") as f: + # print(gen_eqns_top(netlist.parse(f.read()))) + # with open("tran.cir", "r") as f: + # print(gen_eqns_top(netlist.parse(f.read()))) + with open("op_pt_divider.cir", "r") as f: + txt = f.read() + print(gen_eqns_top(netlist.parse(txt))) From 035824b42795311ce21ddc40d1942c52b27a80b3 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 2 Apr 2022 21:12:47 -0700 Subject: [PATCH 093/115] Narrowed down bizarre bug --- OpenSPICE-revamp/eqnstr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSPICE-revamp/eqnstr.py b/OpenSPICE-revamp/eqnstr.py index cf49cc8b..10f54bd2 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/OpenSPICE-revamp/eqnstr.py @@ -22,7 +22,7 @@ def gen_kcl_eqns(self, branch_dicts, nodes): # kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"], nodes))) kcl_dict[b["node_plus"]] = kcl_dict[b["node_plus"]] + ["-({})".format(i_format(b["branch_idx"], nodes))] if b["node_minus"] != "0": - kcl_dict[b["node_minus"]] = kcl_dict[b["node_minus"]] + ["+({})".format(i_format(b["branch_idx"], nodes))] + kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"], nodes))) return ["".join(v) for v in kcl_dict.values()] ################################################################# From 0c6e5a62257b880de11af96d977df235c6dc19be Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 2 Apr 2022 22:04:08 -0700 Subject: [PATCH 094/115] Added transient solver code --- OpenSPICE-revamp/solve.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/OpenSPICE-revamp/solve.py b/OpenSPICE-revamp/solve.py index 334d414e..4ae4173d 100755 --- a/OpenSPICE-revamp/solve.py +++ b/OpenSPICE-revamp/solve.py @@ -2,6 +2,7 @@ from abc import ABC, abstractmethod from scipy.optimize import root +from functools import partial ################################################################# @@ -23,6 +24,28 @@ def solve_eqns(self): y = ldict['y'] return root(y, [1.00] * len(self.eqns)).x +class TransientSolverStrategy(SolverStrategy): + def __init__(self, eqns, ctrl): + self.eqns = eqns + self.ctrl = ctrl + def solve_eqns(self): + # https://bugs.python.org/issue4831 + ldict = locals() + print(self.eqns) + s = "y = lambda x , x_prev , t , dt : [" + ",".join(self.eqns) + "]" + exec(s, globals(), ldict) + y = ldict['y'] + soln = [] + seed = [0.00] * len(self.eqns) + t = float(self.ctrl["tstart"]) + dt = float(self.ctrl["tstep"]) + tstop = float(self.ctrl["tstop"]) + while t < tstop: + _y = lambda x : partial(y, x_prev=seed, t=t, dt=dt)(x) + soln.append(root(_y, [1.00] * len(self.eqns)).x) + t += dt + return soln + if __name__ == "__main__": import netlist import eqnstr @@ -32,3 +55,10 @@ def solve_eqns(self): eqn = eqnstr.gen_eqns_top(n) strat = OpPtSolverStrategy(eqn) print(strat.solve_eqns()) + with open("tran.cir", "r") as f: + txt = f.read() + n = netlist.parse(txt) + eqn = eqnstr.gen_eqns_top(n) + # TODO need to support multiple test types? + strat = TransientSolverStrategy(eqn, n["ctrl"][0]) + print(strat.solve_eqns()) From 2e71e701a49d39269d77e963b56714b02f7b0c3c Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 2 Apr 2022 22:28:50 -0700 Subject: [PATCH 095/115] Updated eqn generation for transient sims --- OpenSPICE-revamp/common.py | 10 ++++------ OpenSPICE-revamp/solve.py | 4 +++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/OpenSPICE-revamp/common.py b/OpenSPICE-revamp/common.py index dc106473..b9359258 100644 --- a/OpenSPICE-revamp/common.py +++ b/OpenSPICE-revamp/common.py @@ -5,15 +5,13 @@ def dv_format(s, n): v_format(s, n, trans=True, prev=True )) def v_format(s, n, trans=False, prev=False): - inner = "t+dt" if not prev else "t" - return "(x{}[{}])".format("[{}]".format(inner) if trans else "", - n.index(s)) if s != "0" else "(0.00)" + outer = "x" if not prev else "x_prev" + return "({}[{}])".format(outer, n.index(s)) if s != "0" else "(0.00)" def di_format(s, n): return "(({})-({}))".format(i_format(s, n, trans=True, prev=False), i_format(s, n, trans=True, prev=True )) def i_format(s, n, trans=False, prev=False): - inner = "t+dt" if not prev else "t" - return "(x{}[{}])".format("[{}]".format(inner) if trans else "", - len(n) + int(s)) + outer = "x" if not prev else "x_prev" + return "({}[{}])".format(outer, len(n) + int(s)) diff --git a/OpenSPICE-revamp/solve.py b/OpenSPICE-revamp/solve.py index 4ae4173d..614d4244 100755 --- a/OpenSPICE-revamp/solve.py +++ b/OpenSPICE-revamp/solve.py @@ -37,12 +37,14 @@ def solve_eqns(self): y = ldict['y'] soln = [] seed = [0.00] * len(self.eqns) + print(self.eqns) t = float(self.ctrl["tstart"]) dt = float(self.ctrl["tstep"]) tstop = float(self.ctrl["tstop"]) while t < tstop: _y = lambda x : partial(y, x_prev=seed, t=t, dt=dt)(x) - soln.append(root(_y, [1.00] * len(self.eqns)).x) + seed = root(_y, [1.00] * len(self.eqns)).x + soln.append(seed) t += dt return soln From 61d74c06e475e0c9064a888a9bebffa5147e32e1 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 4 Apr 2022 11:39:21 -0700 Subject: [PATCH 096/115] Finish up basic OpenSPICE script --- OpenSPICE-revamp/OpenSPICE.py | 23 ++++++++++++++++++----- OpenSPICE-revamp/genout.py | 19 +++++++++++++++++++ OpenSPICE-revamp/netlist.py | 27 +++++++++++++++++++++++++-- OpenSPICE-revamp/solve.py | 5 +++-- 4 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 OpenSPICE-revamp/genout.py diff --git a/OpenSPICE-revamp/OpenSPICE.py b/OpenSPICE-revamp/OpenSPICE.py index 73b12447..f1128f20 100755 --- a/OpenSPICE-revamp/OpenSPICE.py +++ b/OpenSPICE-revamp/OpenSPICE.py @@ -2,10 +2,23 @@ import netlist import eqnstr import sys +import solve +import genout -if __name__ == "__main__": - with open(sys.argv[1], "r") as f: +def run(input_fname, output_fname): + with open(input_fname, "r"): file_txt = f.read() - ptree = netlist.parse(file_txt) - eqns = eqnstr.gen_eqns_top(ptree) - print(eqns) + ptree = netlist.parse(file_txt) + eqns = eqnstr.gen_eqns_top(ptree) + # TODO Support multiple test types? + # TODO Wrap this logic in a context object + if n["ctrl"][0]["test_type"] == "tran": + strat = solve.TransientSolverStrategy(eqns, n["ctrl"][0]) + else: + assert n["ctrl"][0]["test_type"] == "op_pt" + strat = solve.OpPtSolverStrategy(eqns) + soln = strat.solve_eqns() + genout.gen_out_txt(output_fname, n["title"], n["ctrl"][0]["test_type"], soln, n["nodes"]) + +if __name__ == "__main__": + run(sys.argv[1], sys.argv[2]) diff --git a/OpenSPICE-revamp/genout.py b/OpenSPICE-revamp/genout.py new file mode 100644 index 00000000..63e9015d --- /dev/null +++ b/OpenSPICE-revamp/genout.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +from datetime import datetime + +def gen_out_txt(raw_fname, title, test_type, soln, sorted_nodes): + spice_raw_file_txt += "Title: {}\n".format(title) + spice_raw_file_txt += "Date: {}\n".format(datetime.today().strftime('%c')) + spice_raw_file_txt += "Plotname: {}\n".format("Transient Analysis" if test_type == "tran" else "Operating Point") + spice_raw_file_txt += "Flags: {}\n".format("real") + spice_raw_file_txt += "No. Variables: {}\n".format(len(soln[0])) + spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) + spice_raw_file_txt += "Variables:\n" + spice_raw_file_txt += "\t0\time\t\time\n" + spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(1+i,v) for i,v in enumerate(sorted_nodes)]) + spice_raw_file_txt += "Binary:\n" + with open(raw_fname, "w") as spice_raw_file: + spice_raw_file.write(spice_raw_file_txt) + with open(raw_fname, "ab") as spice_raw_file: + spice_raw_file.write(pack_arr(array.array('d', soln).tobytes())) diff --git a/OpenSPICE-revamp/netlist.py b/OpenSPICE-revamp/netlist.py index e9c69d54..209d5b39 100755 --- a/OpenSPICE-revamp/netlist.py +++ b/OpenSPICE-revamp/netlist.py @@ -7,10 +7,16 @@ ####################################################################################### +# Constants + +DEFAULT_TITLE = "My Circuit" + +####################################################################################### + # Top-Level Netlist Rules # def netlist(): - return ZeroOrMore(branch, OneOrMore(newline)), Optional([branch, ctrl]) + return Optional(RegExMatch(".title"), title), ZeroOrMore(branch, OneOrMore(newline)), Optional([branch, ctrl]) def branch(): # TODO: Enable behavisource and behavvsource @@ -256,6 +262,15 @@ def cccscomponent(): def behavsrccomponent(): return RegExMatch(r'B\d+') + +####################################################################################### + +# Misc. Rules + +def title(): + # https://stackoverflow.com/questions/336210/regular-expression-for-alphanumeric-and-underscores + return RegExMatch("^[a-zA-Z0-9_]*$") + ####################################################################################### # Parsing Functions # @@ -280,6 +295,10 @@ def nonterm_is_ctrl(nonterm): assert type(nonterm) == NonTerminal return "ctrl" in nonterm.name +def nonterm_is_title(nonterm): + assert type(nonterm) == NonTerminal + return "title" in nonterm.name + def gen_dict_from_ctrl(nonterm): assert nonterm_is_ctrl(nonterm) rule_names = [n.rule_name for n in nonterm] @@ -411,7 +430,11 @@ def gen_data_dicts(ptree): nodes.remove("0") [_.update({"value" : _["value"].gen_txt_str(nodes)}) for _ in branches] ctrl = [gen_dict_from_ctrl(_) for _ in ptree if nonterm_is_ctrl(_)] - return {"branches" : branches, "nodes" : nodes, "ctrl" : ctrl} + titles = [_.value for _ in ptree if nonterm_is_title(_)] + assert len(titles) == 1 or len(titles) == 0 + if len(titles) == 0: + titles.append(DEFAULT_TITLE) + return {"branches" : branches, "nodes" : nodes, "ctrl" : ctrl, "title" : titles[0]} def parse(txt): parser = ParserPython(netlist, ws='\t\r ') diff --git a/OpenSPICE-revamp/solve.py b/OpenSPICE-revamp/solve.py index 614d4244..5923a9b0 100755 --- a/OpenSPICE-revamp/solve.py +++ b/OpenSPICE-revamp/solve.py @@ -22,7 +22,8 @@ def solve_eqns(self): s = "y = lambda x : [" + ",".join(self.eqns) + "]" exec(s, globals(), ldict) y = ldict['y'] - return root(y, [1.00] * len(self.eqns)).x + # t = 0.00 + return [[0.00] + root(y, [1.00] * len(self.eqns)).x] class TransientSolverStrategy(SolverStrategy): def __init__(self, eqns, ctrl): @@ -43,7 +44,7 @@ def solve_eqns(self): tstop = float(self.ctrl["tstop"]) while t < tstop: _y = lambda x : partial(y, x_prev=seed, t=t, dt=dt)(x) - seed = root(_y, [1.00] * len(self.eqns)).x + seed = [t] + root(_y, [1.00] * len(self.eqns)).x soln.append(seed) t += dt return soln From a94c76f054f9d98df2d5ff240bc81e986bea2d13 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Mon, 4 Apr 2022 17:53:47 -0700 Subject: [PATCH 097/115] Basic OpenSPICE integration --- OpenSPICE-revamp/OpenSPICE.py | 24 - OpenSPICE-revamp/todos | 47 -- PySpice/Spice/OpenSPICE/OpenSPICE.py | 527 +----------------- PySpice/Spice/OpenSPICE/Server.py | 4 +- PySpice/Spice/OpenSPICE/__init__.py | 4 +- .../Spice/OpenSPICE}/common.py | 0 .../Spice/OpenSPICE}/components.py | 0 .../Spice/OpenSPICE}/eqnstr.py | 4 +- .../Spice/OpenSPICE}/genout.py | 9 +- .../Spice/OpenSPICE}/netlist.py | 150 +++-- .../Spice/OpenSPICE}/solve.py | 0 requirements.txt | 1 + 12 files changed, 146 insertions(+), 624 deletions(-) delete mode 100755 OpenSPICE-revamp/OpenSPICE.py delete mode 100644 OpenSPICE-revamp/todos rename {OpenSPICE-revamp => PySpice/Spice/OpenSPICE}/common.py (100%) rename {OpenSPICE-revamp => PySpice/Spice/OpenSPICE}/components.py (100%) rename {OpenSPICE-revamp => PySpice/Spice/OpenSPICE}/eqnstr.py (97%) rename {OpenSPICE-revamp => PySpice/Spice/OpenSPICE}/genout.py (69%) rename {OpenSPICE-revamp => PySpice/Spice/OpenSPICE}/netlist.py (70%) rename {OpenSPICE-revamp => PySpice/Spice/OpenSPICE}/solve.py (100%) diff --git a/OpenSPICE-revamp/OpenSPICE.py b/OpenSPICE-revamp/OpenSPICE.py deleted file mode 100755 index f1128f20..00000000 --- a/OpenSPICE-revamp/OpenSPICE.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 -import netlist -import eqnstr -import sys -import solve -import genout - -def run(input_fname, output_fname): - with open(input_fname, "r"): - file_txt = f.read() - ptree = netlist.parse(file_txt) - eqns = eqnstr.gen_eqns_top(ptree) - # TODO Support multiple test types? - # TODO Wrap this logic in a context object - if n["ctrl"][0]["test_type"] == "tran": - strat = solve.TransientSolverStrategy(eqns, n["ctrl"][0]) - else: - assert n["ctrl"][0]["test_type"] == "op_pt" - strat = solve.OpPtSolverStrategy(eqns) - soln = strat.solve_eqns() - genout.gen_out_txt(output_fname, n["title"], n["ctrl"][0]["test_type"], soln, n["nodes"]) - -if __name__ == "__main__": - run(sys.argv[1], sys.argv[2]) diff --git a/OpenSPICE-revamp/todos b/OpenSPICE-revamp/todos deleted file mode 100644 index a6907734..00000000 --- a/OpenSPICE-revamp/todos +++ /dev/null @@ -1,47 +0,0 @@ -1) Voltage sources (X) -2) Current sources (X) -3) External source modifications for voltage (X) -4) External source modifications for current (X) -5) Linear dependent sources (X) - (a) VCVS (X) - (b) CCVS (X) - (c) CCCS (X) - (d) VCCS (X) -6) Behavioral sources (X) -7) .control statements for... (X) - (a) DC op point (X) - (b) transient sim (X) ------ parser.py done ------ -0) Break off cap, ind, res, etc. classes into a separate file -imported by parser.py and eqnstr.py (X) -1) Strategy pattern skeleton (X) -2) Equation formatting for transient and op pt - (a) Op pt formatting (X) - (b) Transient formatting (X) - (c) Add KCL equations for op pt (X) - (d) Add KCL equations for transient (X) -3) Document interface at top of eqnstr.py -4) Document that parser.py's interface is simply ngspice netlist -5) Write OpenSPICE.py as top-level file to call both. (X) ------ eqnstr.py done ------ -1) ****** FIGURE OUT HOW TO DEAL WITH GET_VSRC, SEND_DATA, etc. ****** -2) Implement strategy pattern skeleton. -3) scipy.optimize.root one such strategy. Add comment about being able to -feed into other simulators as a separate strategy. May involve stealing code -from existing OpenSPICE. -4) Document interface at top of solver.py -5) Add to OpenSPICE.py ------ solver.py done ----- -1) Take binary generation function from existing OpenSPICE code -2) Document interface and output at top of genout.py -3) Add to OpenSPICE.py ------ genout.py done ----- -1) Organize test suite in directory with a loop in OpenSPICE main function -2) Plug in to PySpice -3) Run examples and debug - -Down the road: -- Add multiplier m for current sources -- Finish behavioral sources -- May need some control modifications. For instance, .endc ending and not .end. -- Consider recycling any PySpice ngspice netlist parser. Basic parser working for now. diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index 6e1c2cd4..92890948 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -1,509 +1,24 @@ #!/usr/bin/env python3 -from math import sin, pi, exp -from scipy.optimize import root -from sys import argv -from PySpice.Spice.Parser import SpiceParser -import struct -from functools import reduce -from operator import concat -import array - -get_vsrc = lambda dc_vals, timestep, node_id, ngspice_id : None -get_isrc = lambda dc_vals, timestep, node_id, ngspice_id : None -send_data = lambda actual_vector_values, number_of_vectors, ngspice_id : None - -# TODO x -> dictionary mapping timestep to vector of currents and voltages -# TODO initial conditions - -# Foundational functions - -def set_get_vsrc(_get_vsrc): - global get_vsrc - get_vsrc = _get_vsrc - -def set_get_isrc(_get_isrc): - global get_isrc - get_isrc = _get_isrc - -def set_send_data(_send_data): - global send_data - send_data = _send_data - -# Take limit of expression t -> inf -def inflim(expr, seed, dt, mid_trans, timestep, start_time): - if timestep == start_time: - expr = expr.replace('x[t+dt]', 'x').replace('x[t]', 'x') +from .netlist import parse +from .eqnstr import gen_eqns_top +import sys +from .solve import TransientSolverStrategy, OpPtSolverStrategy +from .genout import gen_out_txt + +def run(input_fname, output_fname): + with open(input_fname, "r") as f: + file_txt = f.read() + pdata = parse(file_txt) + eqns = gen_eqns_top(pdata) + # TODO Support multiple test types? + # TODO Wrap this logic in a context object + if pdata["ctrl"][0]["test_type"] == "tran": + strat = TransientSolverStrategy(eqns, pdata["ctrl"][0]) else: - for s in range(len(seed)): - expr = expr.replace('x[t][%d]' % s, str(seed[s])) - expr = expr.replace('x[t+dt]', 'x') - expr = expr.replace('dt', str(dt)).replace('t', str(timestep)) - return expr - -# process netlist expressions with function f -def process_netlist_expr(lines, f, dt, seed=[], mid_trans=False, timestep=0.0, start_time=0.0): - for i in range(len(lines)): - lines[i][3] = f(lines[i][3], seed, dt, mid_trans, timestep, start_time) - if len(lines[i]) == 5 and not mid_trans: - lines[i][4] = f(lines[i][4], seed, dt, mid_trans, timestep, start_time) - return lines - -def get_nodes(lines): - nodes = [] - for l in lines.split("\n"): - if l != "": - l = l.split(" ") - if l[1] not in nodes: - nodes.append(l[1]) - if l[2] not in nodes: - nodes.append(l[2]) - assert "0" in nodes - nodes.remove("0") - nodes = ["0"] + nodes - assert nodes[0] == "0" - return nodes - -def kcl_prepend(s, num_nodes, branch_idx, plus): - return "{}x[{}]".format("+" if plus else "-", num_nodes + branch_idx - 1) + s - -def get_kcl_eqns(lines): - nodes = get_nodes(lines) - num_nodes = len(nodes) - node_dict = dict(zip(nodes[1:], range(len(nodes[1:])))) - num_branches = len(lines) - kcl = [""] * (num_nodes - 1) - lines = [n.split(" ") for n in lines.split("\n") if n != ""] - for i in range(len(lines)): - if lines[i][1] != "0": - node_0 = node_dict[lines[i][1]] - kcl[node_0-1] = kcl_prepend(kcl[node_0-1], num_nodes, i, False) - if lines[i][2] != "0": - node_1 = node_dict[lines[i][2]] - kcl[node_1-1] = kcl_prepend(kcl[node_1-1], num_nodes, i, True) - return [kcl,num_nodes,num_branches,node_dict] - -def solve(fn, output_len): - return root(fn, [1.00] * (output_len)).x - -def fmt_soln(x, num_nodes, num_branches): - for n in range(num_nodes - 1): - print("V{} = {} [V]".format(n + 1, x[n])) - for b in range(num_branches): - print("I{} = {} [A]".format(b, x[num_nodes + b - 1])) - -def vsrc_sub(_eqn, timestep=0.00): - global get_vsrc - if get_vsrc: - DUMMY_NODE = 0 - DUMMY_SPICE_ID = 0 - dc_vals = [0.00] - get_vsrc(dc_vals, timestep, DUMMY_NODE, DUMMY_SPICE_ID) - _eqn = _eqn.replace("dcv", str(dc_vals[0])) - return _eqn - -def isrc_sub(_eqn, timestep=0.00): - global get_isrc - if get_isrc: - DUMMY_NODE = 0 - DUMMY_SPICE_ID = 0 - dc_vals = [0.00] - get_isrc(dc_vals, timestep, DUMMY_NODE, DUMMY_SPICE_ID) - _eqn = _eqn.replace("dci", str(dc_vals[0])) - return _eqn - -# Take array of expressions and initial condition expressions -# and solve op point. - -# Op point -# 1) Substitute constant dt and t -> inf. -# 2) Use Powell's to solve at a single timestep -def op_pt(netlist, mid_trans=False, seed=[], dt=1.0, timestep=0.0, start_time=0.0): - lines = [n.split(" ") for n in netlist.split("\n") if n != ""] - lines = process_netlist_expr(lines, inflim, dt, seed, mid_trans, timestep, start_time) - # Note: Replace len(l) - 1 with 3 for transient nextstep function - if mid_trans: - iv_relations = [l[3] for l in lines] - else: - iv_relations = [l[len(l)-1] for l in lines] - [kcl_relations,num_nodes,num_branches,node_dict] = get_kcl_eqns("\n".join([" ".join(l) for l in lines])) - final_eqns = [isrc_sub(vsrc_sub(_eqn, timestep)) for _eqn in iv_relations + kcl_relations] - l_fn_str = "lambda x : [" + ",".join(final_eqns) + "]" - l_fn = eval(l_fn_str) - soln = solve(l_fn, len(final_eqns)) - return [soln,num_nodes,num_branches,node_dict] - -# Transient sim -# 1) Create initial condition equations and calculate -# 2) Set x[0] to initial condition -# 3) Loop. Update t on each timestep. -def transient(netlist, dt, end_time, start_time, uic): - trans_soln = [] - voltage_list = [] - timesteps = [] - for i in range(round(end_time / dt)): - curr_timestep = (dt*i) + start_time - if i == 0: - [soln,num_nodes,num_branches,node_dict] = op_pt(netlist, mid_trans=(not uic), dt=dt, timestep=start_time, start_time=start_time) - else: - [soln,num_nodes,num_branches,node_dict] = op_pt(netlist, mid_trans=True, seed=trans_soln[len(trans_soln)-1], dt=dt, timestep=curr_timestep, start_time=start_time) - trans_soln.append(soln) - global send_data - DUMMY_SPICE_ID = 0 - voltage_list = ['V({})'.format(n) for n in get_nodes(netlist) if n != "0"] - actual_vector_values = dict(zip(voltage_list, [soln[node_dict[n]] for n in get_nodes(netlist) if n != "0"])) - actual_vector_values['time'] = curr_timestep - number_of_vectors = num_nodes - timesteps.append(curr_timestep) - send_data(actual_vector_values, number_of_vectors, DUMMY_SPICE_ID) - return [trans_soln,voltage_list,timesteps] - -def next_v_txt(node_no, nodes_arr): - node_dict = dict(zip(nodes_arr[1:], range(len(nodes_arr[1:])))) - if node_no == "0": - return "0.00" - else: - return "x[t+dt][{}]".format(node_dict[node_no]) - -def curr_v_txt(node_no, nodes_arr): - node_dict = dict(zip(nodes_arr[1:], range(len(nodes_arr[1:])))) - if node_no == "0": - return "0.00" - else: - return "x[t][{}]".format(node_dict[node_no]) - -def next_i_txt(branch_no, num_nodes): - return "x[t+dt][{}]".format(num_nodes - 1 + branch_no) - -def curr_i_txt(branch_no, num_nodes): - return "x[t][{}]".format(num_nodes - 1 + branch_no) - -def filter_voltages(input_str, nodes_arr): - for node in nodes_arr: - input_str = input_str.replace("v({})".format(node), next_v_txt(str(node), nodes_arr)) - return input_str - -def paranth_split(x): - in_par = False - _x = "" - for _c in range(len(x)): - if x[_c] == "(": - in_par = True - _x += x[_c] - elif x[_c] == ")": - in_par = False - _x += x[_c] - elif in_par and x[_c] == " ": - _x += "," - else: - _x += x[_c] - return _x - -def filter_sin(txt): - # txt is expected to be of the form SIN(X,X,X,X,X,X) - interior = txt[txt.find("(")+1:][:-1] - assert "SIN(" + interior + ")" == txt - param_list = interior.split(",") - param_names = ["(V0)", "(VA)", "(FREQ)", "(TD)", "(THETA)", "(PHASE)"] - assert len(param_list) <= len(param_names) - assert len(param_list) >= 2 - if len(param_list) < len(param_names): - sub_dict = {} - for i in range(len(param_list)): - sub_dict[param_names[i]] = param_list[i].replace("Hz","")\ - .replace("s","")\ - .replace("V","")\ - .replace("k","e3")\ - .replace("u","e-6")\ - .replace("m","e-3") - if len(param_list) <= 5: - sub_dict[param_names[5]] = str(0.0) - if len(param_list) <= 4: - sub_dict[param_names[4]] = str(0.0) - if len(param_list) <= 3: - sub_dict[param_names[3]] = str(0.0) - if len(param_list) <= 2: - sub_dict[param_names[2]] = str(1.0 / END_T) - else: - sub_dict = dict(zip(param_names, param_list)) - cond0 = "0<=t<(TD)" - cond1 = "t>=(TD)" - state0 = "((V0))" - state1 = "((V0))+((VA)*exp(-(t-((TD)))*((THETA)))*sin(2*pi*((FREQ))*(t-(TD))+((PHASE))))" - for l in param_names: - cond0 = cond0 .replace(l, sub_dict[l]) - cond1 = cond1 .replace(l, sub_dict[l]) - state0 = state0.replace(l, sub_dict[l]) - state1 = state1.replace(l, sub_dict[l]) - interior = "((({})*({}))+(({})*({})))".format(cond0,state0,cond1,state1) - return "sin(" + interior + ")" - -def filter_pulse(txt, end_time, dt): - # txt is expected to be of the form SIN(X,X,X,X,X,X) - interior = txt[txt.find("(")+1:][:-1] - assert "PULSE(" + interior + ")" == txt - param_list = interior.split(",") - param_names = ["(V1)", "(V2)", "(TD)", "(TR)", "(TF)", "(PW)", "(PER)", "(PHASE)"] - assert len(param_list) <= len(param_names) - assert len(param_list) >= 2 - if len(param_list) < len(param_names): - sub_dict = {} - for i in range(len(param_list)): - sub_dict[param_names[i]] = param_list[i].replace("Hz","")\ - .replace("s","")\ - .replace("V","")\ - .replace("k","e3")\ - .replace("u","e-6")\ - .replace("m","e-3") - if len(param_list) <= 8: - sub_dict[param_names[7]] = str(0.0) - if len(param_list) <= 7: - sub_dict[param_names[6]] = str(end_time) - if len(param_list) <= 6: - sub_dict[param_names[5]] = str(end_time) - if len(param_list) <= 5: - sub_dict[param_names[4]] = str(dt) - if len(param_list) <= 4: - sub_dict[param_names[3]] = str(dt) - if len(param_list) <= 3: - sub_dict[param_names[2]] = str(0.0) - else: - sub_dict = dict(zip(param_names, param_list)) - cond0 = "t<=((TD))" - cond1 = "((TD))= 3 - assert len(_l) <= 6 - dt = float(_l[1].replace("u", "e-6").replace("s", "")) - end_time = float(_l[2].replace("m", "e-3").replace("s", "")) - if len(_l) > 3 and _l[3] != "uic": - start_time = float(_l[3].replace("s", "")) - else: - start_time = 0.00 - # TODO: tmax is never used since variable time-stepping not - # currently supported. - if len(_l) > 4 and _l[4] != "uic": - tmax = float(_l[4].replace("s", "")) - else: - tmax = 0.00 - if _l[len(_l)-1] == "uic": - uic = True - else: - uic = False - return [dt, end_time, start_time, tmax, uic] - assert False - - -def pack_arr(a): - return array.array('d', a).tobytes() + assert pdata["ctrl"][0]["test_type"] == "op_pt" + strat = OpPtSolverStrategy(eqns) + soln = strat.solve_eqns() + gen_out_txt(output_fname, pdata["title"], pdata["ctrl"][0]["test_type"], soln, pdata["nodes"]) -def _spice_input(input_filename, output_filename): - with open(input_filename, "r") as netlist_file: - netlist_file_contents = netlist_file.read() - sim_type = get_sim_type(netlist_file_contents) - dt = 0.00 - end_time = 0.00 - start_time = 0.00 - tmax = 0.00 - uic = False - if sim_type == "transient": - [dt, end_time, start_time, tmax, uic] = get_tran_params(netlist_file_contents) - netlist_file_contents = filter_dot_statements(netlist_file_contents) - netlist_file_contents = "\n".join([paranth_split(n) for n in netlist_file_contents.split("\n") if n != '']) - nodes_arr = get_nodes(netlist_file_contents) - _netlist = netlist_translate(netlist_file_contents, nodes_arr, end_time, dt) - if sim_type == "transient": - assert start_time < end_time - [soln,voltage_list,timesteps] = transient(_netlist, dt, end_time, start_time, uic) - assert len(soln) == len(timesteps) - elif sim_type == "op_pt": - [soln,num_nodes,num_branches,node_dict] = op_pt(_netlist) - voltage_list = ['V({})'.format(n) for n in get_nodes(_netlist) if n != "0"] - else: - assert False - with open(output_filename, "w") as spice_raw_file: - spice_raw_file_txt = "Title: MyCircuit\n" - spice_raw_file_txt += "Date: Thu Jun 11 23:17:40 2020\n" - if sim_type == "transient": - spice_raw_file_txt += "Plotname: Transient Analysis\n" - elif sim_type == "op_pt": - spice_raw_file_txt += "Plotname: Operating Point\n" - spice_raw_file_txt += "Flags: real\n" - if sim_type == "transient": - spice_raw_file_txt += "No. Variables: {}\n".format(1 + len(voltage_list)) - spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) - elif sim_type == "op_pt": - spice_raw_file_txt += "No. Variables: {}\n".format(len(voltage_list)) - spice_raw_file_txt += "No. Points: {}\n".format(1) - spice_raw_file_txt += "Variables:\n" - if sim_type == "transient": - spice_raw_file_txt += "\t0\ttime\ttime\n" - spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(1+i,v) for i,v in enumerate(voltage_list)]) - elif sim_type == "op_pt": - spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(i,v) for i,v in enumerate(voltage_list)]) - spice_raw_file_txt += "Binary:\n" - spice_raw_file.write(spice_raw_file_txt) - with open(output_filename,"ab") as spice_raw_file: - if sim_type == "transient": - for j in range(len(soln)): - s = soln[j] - numbers = [timesteps[j]] + [v for i,v in enumerate(s) if i < len(voltage_list)] - raw_data_arr = pack_arr(numbers) - spice_raw_file.write(raw_data_arr) - elif sim_type == "op_pt": - packed_arr = pack_arr([v for i,v in enumerate(soln) if i < len(voltage_list)]) - spice_raw_file.write(packed_arr) - else: - assert False +if __name__ == "__main__": + run(sys.argv[1], sys.argv[2]) diff --git a/PySpice/Spice/OpenSPICE/Server.py b/PySpice/Spice/OpenSPICE/Server.py index 77cc51c0..79d6cf53 100644 --- a/PySpice/Spice/OpenSPICE/Server.py +++ b/PySpice/Spice/OpenSPICE/Server.py @@ -31,7 +31,7 @@ import subprocess import tempfile # TODO: Change -from .OpenSPICE import _spice_input +from .OpenSPICE import run from PySpice.Config import ConfigInstall from .RawFile import RawFile @@ -114,7 +114,7 @@ def __call__(self, spice_input): with open(input_filename, 'w') as f: f.write(str(spice_input)) - _spice_input(input_filename, output_filename) + run(input_filename, output_filename) with open(output_filename, 'rb') as f: output = f.read() diff --git a/PySpice/Spice/OpenSPICE/__init__.py b/PySpice/Spice/OpenSPICE/__init__.py index 214e6a85..1ace3762 100644 --- a/PySpice/Spice/OpenSPICE/__init__.py +++ b/PySpice/Spice/OpenSPICE/__init__.py @@ -1 +1,3 @@ -from .OpenSPICE import set_get_vsrc, set_get_isrc, set_send_data +# TODO +# from .OpenSPICE import set_get_vsrc, set_get_isrc, set_send_data +from .OpenSPICE import run diff --git a/OpenSPICE-revamp/common.py b/PySpice/Spice/OpenSPICE/common.py similarity index 100% rename from OpenSPICE-revamp/common.py rename to PySpice/Spice/OpenSPICE/common.py diff --git a/OpenSPICE-revamp/components.py b/PySpice/Spice/OpenSPICE/components.py similarity index 100% rename from OpenSPICE-revamp/components.py rename to PySpice/Spice/OpenSPICE/components.py diff --git a/OpenSPICE-revamp/eqnstr.py b/PySpice/Spice/OpenSPICE/eqnstr.py similarity index 97% rename from OpenSPICE-revamp/eqnstr.py rename to PySpice/Spice/OpenSPICE/eqnstr.py index 10f54bd2..47448d62 100755 --- a/OpenSPICE-revamp/eqnstr.py +++ b/PySpice/Spice/OpenSPICE/eqnstr.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 -from components import Resistor, Capacitor, Inductor, VSource, ISource +from .components import Resistor, Capacitor, Inductor, VSource, ISource from abc import ABC, abstractmethod -from common import v_format, i_format, dv_format, di_format +from .common import v_format, i_format, dv_format, di_format ################################################################# diff --git a/OpenSPICE-revamp/genout.py b/PySpice/Spice/OpenSPICE/genout.py similarity index 69% rename from OpenSPICE-revamp/genout.py rename to PySpice/Spice/OpenSPICE/genout.py index 63e9015d..84cbb3f8 100644 --- a/OpenSPICE-revamp/genout.py +++ b/PySpice/Spice/OpenSPICE/genout.py @@ -1,19 +1,22 @@ #!/usr/bin/env python3 from datetime import datetime +from array import array def gen_out_txt(raw_fname, title, test_type, soln, sorted_nodes): - spice_raw_file_txt += "Title: {}\n".format(title) + spice_raw_file_txt = "Title: {}\n".format(title) spice_raw_file_txt += "Date: {}\n".format(datetime.today().strftime('%c')) spice_raw_file_txt += "Plotname: {}\n".format("Transient Analysis" if test_type == "tran" else "Operating Point") spice_raw_file_txt += "Flags: {}\n".format("real") spice_raw_file_txt += "No. Variables: {}\n".format(len(soln[0])) spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) spice_raw_file_txt += "Variables:\n" - spice_raw_file_txt += "\t0\time\t\time\n" + spice_raw_file_txt += "\t0\ttime\ttime\n" spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(1+i,v) for i,v in enumerate(sorted_nodes)]) + spice_raw_file_txt += "".join(["\t{}\t{}\tcurrent\n".format(1+len(sorted_nodes)+i,i) for i in range(len(soln[0])-len(sorted_nodes))]) spice_raw_file_txt += "Binary:\n" with open(raw_fname, "w") as spice_raw_file: spice_raw_file.write(spice_raw_file_txt) with open(raw_fname, "ab") as spice_raw_file: - spice_raw_file.write(pack_arr(array.array('d', soln).tobytes())) + [spice_raw_file.write(array('d', s).tobytes()) for s in soln] + print(spice_raw_file_txt) diff --git a/OpenSPICE-revamp/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py similarity index 70% rename from OpenSPICE-revamp/netlist.py rename to PySpice/Spice/OpenSPICE/netlist.py index 209d5b39..5c4d8df5 100755 --- a/OpenSPICE-revamp/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 from arpeggio import ZeroOrMore, EOF, Optional, OneOrMore, RegExMatch, ParserPython, Terminal, NonTerminal -from components import Resistor, Capacitor, Inductor, VSource, ISource -from common import v_format, i_format +from .components import Resistor, Capacitor, Inductor, VSource, ISource +from .common import v_format, i_format from abc import ABC, abstractmethod +from re import search ####################################################################################### @@ -16,7 +17,8 @@ # Top-Level Netlist Rules # def netlist(): - return Optional(RegExMatch(".title"), title), ZeroOrMore(branch, OneOrMore(newline)), Optional([branch, ctrl]) + return Optional(RegExMatch(".title"), title), ZeroOrMore(ZeroOrMore(newline), + [options, branch, ctrl, op_pt, tran], ZeroOrMore(newline)), Optional(end) def branch(): # TODO: Enable behavisource and behavvsource @@ -24,7 +26,8 @@ def branch(): vccssource, vcvssource, ccvssource, cccssource, behavisource, behavvsource] def ctrl(): - return control, OneOrMore(newline), [op_pt, tran], OneOrMore(newline), end + return [(control, ZeroOrMore(newline), [op_pt, tran], ZeroOrMore(newline), end), + (ZeroOrMore(newline), [op_pt, tran], ZeroOrMore(newline))] ####################################################################################### @@ -57,8 +60,18 @@ def uic(): def end(): return RegExMatch(".end") +def options(): + # TODO - paste link from below + return RegExMatch(".options"), RegExMatch(r'[a-zA-Z0-9_]*'), RegExMatch("="), [_float(), _int()] + def _float(): - return RegExMatch(r'[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)') + # Need to account for units, which are parsed later + # https://stackoverflow.com/questions/336210/regular-expression-for-alphanumeric-and-underscores + return RegExMatch("[a-zA-Z0-9_.]*") + +def _int(): + # https://stackoverflow.com/questions/9043551/regex-that-matches-integers-in-between-whitespace-or-start-end-of-string-only + return RegExMatch(r'\d+') ####################################################################################### @@ -73,31 +86,65 @@ class ResistorTextFmt(TextFmt): def __init__(self, value): self.value = value def gen_txt_str(self, nodes): - return self.value + return unit_parse(self.value) class CapacitorTextFmt(TextFmt): def __init__(self, value): self.value = value def gen_txt_str(self, nodes): - return self.value + return unit_parse(self.value) class InductorTextFmt(TextFmt): def __init__(self, value): self.value = value def gen_txt_str(self, nodes): - return self.value + return unit_parse(self.value) class VSourceTextFmt(TextFmt): - def __init__(self, value): - self.value = value + def __init__(self, value, srctype="const"): + self.value = value + self.srctype = srctype def gen_txt_str(self, nodes): - return self.value + if self.srctype == "const": + return unit_parse(self.value) + elif self.srctype == "pulse": + # TODO: Include pulse sources with optional + # parameters. Need to source defaults from + # ctrl dict + valarr = self.value.split("|") + assert len(valarr) >= 9 + assert len(valarr) <= 10 + _v1 = unit_parse(valarr[1]) + _v2 = unit_parse(valarr[2]) + _td = unit_parse(valarr[3]) + _tr = unit_parse(valarr[4]) + _tf = unit_parse(valarr[5]) + _pw = unit_parse(valarr[6]) + _per = unit_parse(valarr[7]) + _phase = 0.0 if len(valarr) == 9 else unit_parse(valarr[8]) + cond0 = "t<=(({}))".format(_td) + cond1 = "(({}))=3.2 numpy>=1.18 ply>=3.11 scipy>=1.4 +Arpeggio==1.10.2 From 6bbf25da3f3ba54c5248a0b8d4359b1a5b9c05df Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 5 Apr 2022 09:43:41 -0700 Subject: [PATCH 098/115] Fixed some parser issues --- PySpice/Spice/OpenSPICE/genout.py | 1 - PySpice/Spice/OpenSPICE/netlist.py | 81 +++++++++++++++++------------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/genout.py b/PySpice/Spice/OpenSPICE/genout.py index 84cbb3f8..f85cb238 100644 --- a/PySpice/Spice/OpenSPICE/genout.py +++ b/PySpice/Spice/OpenSPICE/genout.py @@ -19,4 +19,3 @@ def gen_out_txt(raw_fname, title, test_type, soln, sorted_nodes): spice_raw_file.write(spice_raw_file_txt) with open(raw_fname, "ab") as spice_raw_file: [spice_raw_file.write(array('d', s).tobytes()) for s in soln] - print(spice_raw_file_txt) diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index 5c4d8df5..3f1d7570 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -16,9 +16,12 @@ # Top-Level Netlist Rules # +# TODO shouldn't have newline rule, use separator instead: https://textx.github.io/Arpeggio/2.0/configuration/ def netlist(): - return Optional(RegExMatch(".title"), title), ZeroOrMore(ZeroOrMore(newline), - [options, branch, ctrl, op_pt, tran], ZeroOrMore(newline)), Optional(end) + return Optional(RegExMatch(".title"), title), OneOrMore(newline), \ + OneOrMore([branch], sep='\n'), OneOrMore(newline), \ + OneOrMore(options, sep='\n'), OneOrMore(newline), \ + [ctrl, tran, op_pt], OneOrMore(newline), end def branch(): # TODO: Enable behavisource and behavvsource @@ -26,8 +29,7 @@ def branch(): vccssource, vcvssource, ccvssource, cccssource, behavisource, behavvsource] def ctrl(): - return [(control, ZeroOrMore(newline), [op_pt, tran], ZeroOrMore(newline), end), - (ZeroOrMore(newline), [op_pt, tran], ZeroOrMore(newline))] + return control, ZeroOrMore(newline), [op_pt, tran], ZeroOrMore(newline), end ####################################################################################### @@ -101,11 +103,11 @@ def gen_txt_str(self, nodes): return unit_parse(self.value) class VSourceTextFmt(TextFmt): - def __init__(self, value, srctype="const"): + def __init__(self, value, srctype="passiveValue"): self.value = value self.srctype = srctype def gen_txt_str(self, nodes): - if self.srctype == "const": + if self.srctype == "passiveValue": return unit_parse(self.value) elif self.srctype == "pulse": # TODO: Include pulse sources with optional @@ -245,7 +247,7 @@ def node(): return RegExMatch(r'[a-zA-Z0-9_]+') def passiveValue(): - return RegExMatch(r'[a-zA-Z0-9_]+') + return RegExMatch(r'[a-zA-Z0-9_\.]+') def stateVarValue(): return RegExMatch(r'\d+') @@ -322,7 +324,7 @@ def behavsrccomponent(): def title(): # https://stackoverflow.com/questions/336210/regular-expression-for-alphanumeric-and-underscores - return RegExMatch("[a-zA-Z0-9_]*") + return RegExMatch("[a-zA-Z0-9_' ]*") ####################################################################################### @@ -354,19 +356,40 @@ def gen_dict_from_branch(self, nonterm, branch_idx): def filter_terms(ptree): - return [_ for _ in ptree if type(_) != Terminal] + return [_ for _ in ptree if _.value != "\n"] + +# TODO: should we use explicit == as opposed to in? +def nonterm_is_tran(nonterm): + return (type(nonterm) == NonTerminal) and ("tran" in nonterm.name) def nonterm_is_branch(nonterm): - assert type(nonterm) == NonTerminal - return "branch" in nonterm.name + return (type(nonterm) == NonTerminal) and ("branch" in nonterm.name) def nonterm_is_ctrl(nonterm): - assert type(nonterm) == NonTerminal - return "ctrl" in nonterm.name + return (type(nonterm) == NonTerminal) and ("ctrl" in nonterm.name) def nonterm_is_title(nonterm): - assert type(nonterm) == NonTerminal - return "title" in nonterm.name + return (type(nonterm) == NonTerminal) and ("title" in nonterm.name) + +def gen_dict_from_tran_node(tran_node): + assert nonterm_is_tran(tran_node) + tran_node_rule_names = [n.rule_name for n in tran_node] + tran_d = {"test_type" : "tran", + "tstep" : unit_parse(tran_node[1].value), + "tstop" : unit_parse(tran_node[2].value)} + if "tstart" in tran_node_rule_names: + tran_d["tstart"] = unit_parse(tran_node[3].value) + if "tmax" in tran_node_rule_names: + tran_d["tmax"] = unit_parse(tran_node[4].value) + if "uic" in tran_node_rule_names: + tran_d["uic"] = tran_node[5].value + else: + if "uic" in tran_node_rule_names: + tran_d["uic"] = tran_node[4].value + else: + if "uic" in tran_node_rule_names: + tran_d["uic"] = tran_node[3].value + return tran_d def gen_dict_from_ctrl(nonterm): assert nonterm_is_ctrl(nonterm) @@ -374,24 +397,7 @@ def gen_dict_from_ctrl(nonterm): if "op_pt" in rule_names: return {"test_type" : "op_pt"} elif "tran" in rule_names: - tran_node = nonterm[rule_names.index("tran")] - tran_node_rule_names = [n.rule_name for n in tran_node] - tran_d = {"test_type" : "tran", - "tstep" : unit_parse(tran_node[1].value), - "tstop" : unit_parse(tran_node[2].value)} - if "tstart" in tran_node_rule_names: - tran_d["tstart"] = unit_parse(tran_node[3].value) - if "tmax" in tran_node_rule_names: - tran_d["tmax"] = unit_parse(tran_node[4].value) - if "uic" in tran_node_rule_names: - tran_d["uic"] = tran_node[5].value - else: - if "uic" in tran_node_rule_names: - tran_d["uic"] = tran_node[4].value - else: - if "uic" in tran_node_rule_names: - tran_d["uic"] = tran_node[3].value - return tran_d + return gen_dict_from_tran_node(nonterm[rule_names.index("tran")]) else: assert False @@ -501,6 +507,12 @@ def gen_data_dicts(ptree): nodes.remove("0") [_.update({"value" : _["value"].gen_txt_str(nodes)}) for _ in branches] ctrl = [gen_dict_from_ctrl(_) for _ in ptree if nonterm_is_ctrl(_)] + if len(ctrl) == 0: + # TODO: need a cleaner way of dealing with ctrl statements + ctrl = [{"test_type" : "op_pt"} for _ in ptree if _.value == ".op"] + ctrl += [gen_dict_from_tran_node(_) for _ in ptree if _.value == ".tran"] + # TODO support multiple test types? + assert len(ctrl) == 1 titles = [_.value for _ in ptree if nonterm_is_title(_)] assert len(titles) == 1 or len(titles) == 0 if len(titles) == 0: @@ -508,8 +520,7 @@ def gen_data_dicts(ptree): return {"branches" : branches, "nodes" : nodes, "ctrl" : ctrl, "title" : titles[0]} def parse(txt): - print(txt) - parser = ParserPython(netlist, ws='\t\r ', debug=True) + parser = ParserPython(netlist, ws='\t\r ') return gen_data_dicts(filter_terms(parser.parse(txt))) ####################################################################################### From b004858e9c006c7b6ad9d5550c24730ee53c8f1c Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 5 Apr 2022 11:46:37 -0700 Subject: [PATCH 099/115] Enable Thevenin test --- PySpice/Spice/OpenSPICE/netlist.py | 3 ++- examples/fundamental-laws/thevenin-norton-theorem.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index 3f1d7570..3176bc1d 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -324,6 +324,7 @@ def behavsrccomponent(): def title(): # https://stackoverflow.com/questions/336210/regular-expression-for-alphanumeric-and-underscores + # TODO include accented characters, like in Thevenin return RegExMatch("[a-zA-Z0-9_' ]*") ####################################################################################### @@ -510,7 +511,7 @@ def gen_data_dicts(ptree): if len(ctrl) == 0: # TODO: need a cleaner way of dealing with ctrl statements ctrl = [{"test_type" : "op_pt"} for _ in ptree if _.value == ".op"] - ctrl += [gen_dict_from_tran_node(_) for _ in ptree if _.value == ".tran"] + ctrl += [gen_dict_from_tran_node(_) for _ in ptree if ".tran" in _.value] # TODO support multiple test types? assert len(ctrl) == 1 titles = [_.value for _ in ptree if nonterm_is_title(_)] diff --git a/examples/fundamental-laws/thevenin-norton-theorem.py b/examples/fundamental-laws/thevenin-norton-theorem.py index a31c57af..43b2935c 100644 --- a/examples/fundamental-laws/thevenin-norton-theorem.py +++ b/examples/fundamental-laws/thevenin-norton-theorem.py @@ -62,7 +62,7 @@ #################################################################################################### -thevenin_circuit = Circuit('Thévenin Representation') +thevenin_circuit = Circuit('Thevenin Representation') thevenin_circuit.V('input', 1, thevenin_circuit.gnd, 10@u_V) thevenin_circuit.R('generator', 1, 'load', 10@u_Ω) From cd913a949021013cb33dce0d10a718875f1e0d30 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 5 Apr 2022 13:09:59 -0700 Subject: [PATCH 100/115] Enabled voltage divider test --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 2 -- PySpice/Spice/OpenSPICE/eqnstr.py | 1 + PySpice/Spice/OpenSPICE/netlist.py | 5 +++-- PySpice/Spice/OpenSPICE/solve.py | 2 -- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index 92890948..8ce36061 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -11,11 +11,9 @@ def run(input_fname, output_fname): pdata = parse(file_txt) eqns = gen_eqns_top(pdata) # TODO Support multiple test types? - # TODO Wrap this logic in a context object if pdata["ctrl"][0]["test_type"] == "tran": strat = TransientSolverStrategy(eqns, pdata["ctrl"][0]) else: - assert pdata["ctrl"][0]["test_type"] == "op_pt" strat = OpPtSolverStrategy(eqns) soln = strat.solve_eqns() gen_out_txt(output_fname, pdata["title"], pdata["ctrl"][0]["test_type"], soln, pdata["nodes"]) diff --git a/PySpice/Spice/OpenSPICE/eqnstr.py b/PySpice/Spice/OpenSPICE/eqnstr.py index 47448d62..1c705153 100755 --- a/PySpice/Spice/OpenSPICE/eqnstr.py +++ b/PySpice/Spice/OpenSPICE/eqnstr.py @@ -96,6 +96,7 @@ def gen_eqn_from_branch(self, _b, _n): def gen_eqns_top(parse_dict): # TODO need to support multiple test types? # TODO disable ic if uic arg is not provided to trans + # TODO wrap logic in a context type if parse_dict["ctrl"][0]["test_type"] == "op_pt": return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"], parse_dict["nodes"]) elif parse_dict["ctrl"][0]["test_type"] == "tran" : diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index 3176bc1d..f5c3e0b2 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -338,10 +338,11 @@ def oom(x): 'G' : 1e9, 'M' : 1e6, 'k' : 1e3, 'h' : 1e2, 'da': 1e1, 'd' : 1e-1, 'c' : 1e-2, 'm' : 1e-3, 'u' : 1e-6, 'n' : 1e-9, 'p' : 1e-12,'f' : 1e-15,'a' : 1e-18,'z' : 1e-21,'y' : 1e-24} + return prefixes[x] def unit_parse(x): - groups = search(r'(\d+\.*\d*)([a-zA-Z])?[a-zA-z]*', x).groups() - return float(groups[0]) * 1.00 if groups[1] else oom(groups[1]) + groups = search(r'(\d+\.*\d*)([a-zA-Z])?([a-zA-z])*', x).groups() + return float(groups[0]) * 1.00 if not groups[1] or not groups[2] else float(groups[0]) * oom(groups[1]) ####################################################################################### diff --git a/PySpice/Spice/OpenSPICE/solve.py b/PySpice/Spice/OpenSPICE/solve.py index 5923a9b0..7af6f2bf 100755 --- a/PySpice/Spice/OpenSPICE/solve.py +++ b/PySpice/Spice/OpenSPICE/solve.py @@ -32,13 +32,11 @@ def __init__(self, eqns, ctrl): def solve_eqns(self): # https://bugs.python.org/issue4831 ldict = locals() - print(self.eqns) s = "y = lambda x , x_prev , t , dt : [" + ",".join(self.eqns) + "]" exec(s, globals(), ldict) y = ldict['y'] soln = [] seed = [0.00] * len(self.eqns) - print(self.eqns) t = float(self.ctrl["tstart"]) dt = float(self.ctrl["tstep"]) tstop = float(self.ctrl["tstop"]) From fc98b65486abcfdffac8fc4557bf42faa3ba2b40 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Tue, 5 Apr 2022 13:26:49 -0700 Subject: [PATCH 101/115] Fix SI unit regex --- PySpice/Spice/OpenSPICE/netlist.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index f5c3e0b2..06244809 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -10,7 +10,12 @@ # Constants -DEFAULT_TITLE = "My Circuit" +DEFAULT_TITLE = "My Circuit" +SI_PREFIXES = {'Y' : 1e24, 'Z' : 1e21, 'E' : 1e18, 'P' : 1e15, 'T' : 1e12, + 'G' : 1e9, 'M' : 1e6, 'k' : 1e3, 'h' : 1e2, 'da': 1e1, + 'd' : 1e-1, 'c' : 1e-2, 'm' : 1e-3, 'u' : 1e-6, 'n' : 1e-9, + 'p' : 1e-12,'f' : 1e-15,'a' : 1e-18,'z' : 1e-21,'y' : 1e-24} +SI_PREFIX_REGEX = "[" + "|".join(SI_PREFIXES.keys()) + "]" ####################################################################################### @@ -334,14 +339,11 @@ def title(): def oom(x): assert len(x) == 1 # https://en.wikipedia.org/wiki/Metric_prefix - prefixes = {'Y' : 1e24, 'Z' : 1e21, 'E' : 1e18, 'P' : 1e15, 'T' : 1e12, - 'G' : 1e9, 'M' : 1e6, 'k' : 1e3, 'h' : 1e2, 'da': 1e1, - 'd' : 1e-1, 'c' : 1e-2, 'm' : 1e-3, 'u' : 1e-6, 'n' : 1e-9, - 'p' : 1e-12,'f' : 1e-15,'a' : 1e-18,'z' : 1e-21,'y' : 1e-24} - return prefixes[x] + return SI_PREFIXES[x] def unit_parse(x): - groups = search(r'(\d+\.*\d*)([a-zA-Z])?([a-zA-z])*', x).groups() + # TODO can this be formally verified? + groups = search(r'(\d+\.*\d*)({})?([a-zA-z])*'.format(SI_PREFIX_REGEX), x).groups() return float(groups[0]) * 1.00 if not groups[1] or not groups[2] else float(groups[0]) * oom(groups[1]) ####################################################################################### From c72f3ab57a4d90cb0930606d013db93ca4dea9c0 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Thu, 7 Apr 2022 20:48:47 -0700 Subject: [PATCH 102/115] Fixed bug in transient sim --- PySpice/Spice/OpenSPICE/OpenSPICE.py | 4 +- PySpice/Spice/OpenSPICE/__init__.py | 1 + PySpice/Spice/OpenSPICE/eqnstr.py | 24 ++++++--- PySpice/Spice/OpenSPICE/genout.py | 7 ++- PySpice/Spice/OpenSPICE/netlist.py | 56 +++++++++++++++++---- PySpice/Spice/OpenSPICE/solve.py | 75 +++++++++++++++++++++++----- 6 files changed, 131 insertions(+), 36 deletions(-) mode change 100644 => 100755 PySpice/Spice/OpenSPICE/__init__.py diff --git a/PySpice/Spice/OpenSPICE/OpenSPICE.py b/PySpice/Spice/OpenSPICE/OpenSPICE.py index 8ce36061..dda44a26 100755 --- a/PySpice/Spice/OpenSPICE/OpenSPICE.py +++ b/PySpice/Spice/OpenSPICE/OpenSPICE.py @@ -12,9 +12,9 @@ def run(input_fname, output_fname): eqns = gen_eqns_top(pdata) # TODO Support multiple test types? if pdata["ctrl"][0]["test_type"] == "tran": - strat = TransientSolverStrategy(eqns, pdata["ctrl"][0]) + strat = TransientSolverStrategy(eqns, pdata["ctrl"][0], pdata["nodes"]) else: - strat = OpPtSolverStrategy(eqns) + strat = OpPtSolverStrategy(eqns, pdata["nodes"]) soln = strat.solve_eqns() gen_out_txt(output_fname, pdata["title"], pdata["ctrl"][0]["test_type"], soln, pdata["nodes"]) diff --git a/PySpice/Spice/OpenSPICE/__init__.py b/PySpice/Spice/OpenSPICE/__init__.py old mode 100644 new mode 100755 index 1ace3762..57755709 --- a/PySpice/Spice/OpenSPICE/__init__.py +++ b/PySpice/Spice/OpenSPICE/__init__.py @@ -1,3 +1,4 @@ # TODO # from .OpenSPICE import set_get_vsrc, set_get_isrc, set_send_data from .OpenSPICE import run +from .solve import set_get_vsrc, set_get_isrc, set_send_data diff --git a/PySpice/Spice/OpenSPICE/eqnstr.py b/PySpice/Spice/OpenSPICE/eqnstr.py index 1c705153..feb48a79 100755 --- a/PySpice/Spice/OpenSPICE/eqnstr.py +++ b/PySpice/Spice/OpenSPICE/eqnstr.py @@ -20,9 +20,17 @@ def gen_kcl_eqns(self, branch_dicts, nodes): if b["node_plus"] != "0": # TODO: Why does this syntax not work? # kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"], nodes))) - kcl_dict[b["node_plus"]] = kcl_dict[b["node_plus"]] + ["-({})".format(i_format(b["branch_idx"], nodes))] + l_plus = len(kcl_dict[b["node_plus"]]) + other_l = [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_plus"]] + kcl_dict[b["node_plus"]] = kcl_dict[b["node_plus"]] + ["-({})".format(i_format(b["branch_idx"], nodes))] + assert len(kcl_dict[b["node_plus"]]) == l_plus + 1 + assert [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_plus"]] == other_l if b["node_minus"] != "0": - kcl_dict[b["node_minus"]].append("+({})".format(i_format(b["branch_idx"], nodes))) + l_minus = len(kcl_dict[b["node_minus"]]) + other_l = [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_minus"]] + kcl_dict[b["node_minus"]] = kcl_dict[b["node_minus"]] + ["+({})".format(i_format(b["branch_idx"], nodes))] + assert len(kcl_dict[b["node_minus"]]) == l_minus + 1 + assert [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_minus"]] == other_l return ["".join(v) for v in kcl_dict.values()] ################################################################# @@ -64,9 +72,10 @@ def gen_eqn_from_branch(self, _b, _n): _b["value"]) elif _b["component"] == Capacitor: if "ic" in _b.keys(): - prefix = "((({})-({}))-({})) if t == 0 else ".format(v_format(_b["node_plus"], _n, trans=True), - v_format(_b["node_minus"], _n, trans=True), - _b["ic"]) + # TODO: modify to support nonzero start times + prefix = "((({})-({}))-({})) if t == 0.00 else ".format(v_format(_b["node_plus"], _n, trans=True), + v_format(_b["node_minus"], _n, trans=True), + _b["ic"]) else: prefix = "" return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"], _n, trans=True), @@ -75,8 +84,9 @@ def gen_eqn_from_branch(self, _b, _n): dv_format(_b["node_minus"], _n)) elif _b["component"] == Inductor: if "ic" in _b.keys(): - prefix = "(({})-({})) if t == 0 else ".format(i_format(_b["branch_idx"], _n, trans=True), - _b["ic"]) + # TODO: modify to support nonzero start times + prefix = "(({})-({})) if t == 0.00 else ".format(i_format(_b["branch_idx"], _n, trans=True), + _b["ic"]) else: prefix = "" return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"], _n, trans=True), diff --git a/PySpice/Spice/OpenSPICE/genout.py b/PySpice/Spice/OpenSPICE/genout.py index f85cb238..275cb1d5 100644 --- a/PySpice/Spice/OpenSPICE/genout.py +++ b/PySpice/Spice/OpenSPICE/genout.py @@ -8,12 +8,11 @@ def gen_out_txt(raw_fname, title, test_type, soln, sorted_nodes): spice_raw_file_txt += "Date: {}\n".format(datetime.today().strftime('%c')) spice_raw_file_txt += "Plotname: {}\n".format("Transient Analysis" if test_type == "tran" else "Operating Point") spice_raw_file_txt += "Flags: {}\n".format("real") - spice_raw_file_txt += "No. Variables: {}\n".format(len(soln[0])) + spice_raw_file_txt += "No. Variables: {}\n".format((test_type == "tran") + len(sorted_nodes)) spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) spice_raw_file_txt += "Variables:\n" - spice_raw_file_txt += "\t0\ttime\ttime\n" - spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(1+i,v) for i,v in enumerate(sorted_nodes)]) - spice_raw_file_txt += "".join(["\t{}\t{}\tcurrent\n".format(1+len(sorted_nodes)+i,i) for i in range(len(soln[0])-len(sorted_nodes))]) + spice_raw_file_txt += "\t0\ttime\ttime\n" if test_type == "tran" else "" + spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format((test_type == "tran")+i,"V({})".format(v)) for i,v in enumerate(sorted_nodes)]) spice_raw_file_txt += "Binary:\n" with open(raw_fname, "w") as spice_raw_file: spice_raw_file.write(spice_raw_file_txt) diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index 06244809..869bfaa5 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -69,12 +69,12 @@ def end(): def options(): # TODO - paste link from below - return RegExMatch(".options"), RegExMatch(r'[a-zA-Z0-9_]*'), RegExMatch("="), [_float(), _int()] + return RegExMatch(".options"), RegExMatch('.*$') def _float(): # Need to account for units, which are parsed later # https://stackoverflow.com/questions/336210/regular-expression-for-alphanumeric-and-underscores - return RegExMatch("[a-zA-Z0-9_.]*") + return RegExMatch("[0-9][a-zA-Z0-9_\.]*") def _int(): # https://stackoverflow.com/questions/9043551/regex-that-matches-integers-in-between-whitespace-or-start-end-of-string-only @@ -157,13 +157,13 @@ class ExtVSourceTextFmt(TextFmt): def __init__(self): pass def gen_txt_str(self, nodes): - return "(get_vsrc())" + return "(get_vsrc(t))" class ExtISourceTextFmt(TextFmt): - def __init__(self, value): + def __init__(self): pass def gen_txt_str(self, nodes): - return "(get_isrc())" + return "(get_isrc(t))" class VCCSSourceTextFmt(TextFmt): def __init__(self, value, node_plus, node_minus): @@ -201,6 +201,26 @@ def gen_txt_str(self, nodes): return "(({})*(({})-({})))".format(self.value, i_format(self.branch_plus, nodes), i_format(self.branch_minus, nodes)) +class BehavISourceTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + val = self.value + for n in nodes: + val = val.replace('v({})'.format(n), v_format(n, nodes)) + # TODO does ngspice support i(*) notation? I don't think so. + return "({})".format(val) + +class BehavVSourceTextFmt(TextFmt): + def __init__(self, value): + self.value = value + def gen_txt_str(self, nodes): + val = self.value + for n in nodes: + val = val.replace('v({})'.format(n), v_format(n, nodes)) + # TODO does ngspice support i(*) notation? I don't think so. + return "({})".format(val) + ####################################################################################### # Component Rules # @@ -252,10 +272,12 @@ def node(): return RegExMatch(r'[a-zA-Z0-9_]+') def passiveValue(): - return RegExMatch(r'[a-zA-Z0-9_\.]+') + return RegExMatch(r'[0-9\.][a-zA-Z0-9_\.]*') def stateVarValue(): - return RegExMatch(r'\d+') + # Need to account for units, which are parsed later + # https://stackoverflow.com/questions/336210/regular-expression-for-alphanumeric-and-underscores + return RegExMatch("[a-zA-Z0-9_\.]*") def newline(): return RegExMatch(r'\n') @@ -277,7 +299,7 @@ def vequalsbehav(): def behavexpr(): # TODO - return RegExMatch('') + return RegExMatch('.*$') ####################################################################################### @@ -422,7 +444,7 @@ def gen_dict_from_branch(nonterm, branch_idx): "value" : CapacitorTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} if len(nonterm[0]) == 5: - _cap["ic"] = nonterm[0][4][1].value + _cap["ic"] = unit_parse(nonterm[0][4][1].value) return _cap elif nonterm[0].rule_name == "inductor": assert len(nonterm[0]) == 4 or len(nonterm[0]) == 5 @@ -432,7 +454,7 @@ def gen_dict_from_branch(nonterm, branch_idx): "value" : InductorTextFmt(nonterm[0][3].value), "branch_idx" : branch_idx} if len(nonterm[0]) == 5: - _ind["ic"] = nonterm[0][4][1].value + _ind["ic"] = unit_parse(nonterm[0][4][1].value) return _ind elif nonterm[0].rule_name == "vsource": assert len(nonterm[0]) == 4 or len(nonterm[0]) == 6 @@ -500,6 +522,20 @@ def gen_dict_from_branch(nonterm, branch_idx): nonterm[0][3].value, nonterm[0][4].value), "branch_idx" : branch_idx} + elif nonterm[0].rule_name == "behavisource": + assert len(nonterm[0]) == 4 + return {"component" : ISource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : BehavISourceTextFmt(nonterm[0][3][1].value), + "branch_idx" : branch_idx} + elif nonterm[0].rule_name == "behavvsource": + assert len(nonterm[0]) == 4 + return {"component" : VSource, + "node_plus" : nonterm[0][1].value, + "node_minus" : nonterm[0][2].value, + "value" : BehavVSourceTextFmt(nonterm[0][3][1].value), + "branch_idx" : branch_idx} else: assert False diff --git a/PySpice/Spice/OpenSPICE/solve.py b/PySpice/Spice/OpenSPICE/solve.py index 7af6f2bf..00abdc33 100755 --- a/PySpice/Spice/OpenSPICE/solve.py +++ b/PySpice/Spice/OpenSPICE/solve.py @@ -4,6 +4,38 @@ from scipy.optimize import root from functools import partial +# TODO remove globals. Need a cleaner way of implementing these functions. + +get_vsrc_data = None +get_isrc_data = None +send_data = None + +def set_get_vsrc(x): + global get_vsrc_data + get_vsrc_data = x + +def set_get_isrc(x): + global get_isrc_data + get_isrc_data = x + +def set_send_data(x): + global send_data + send_data = x + +def get_vsrc(t): + # TODO - support all get_vsrc_data args + global get_vsrc_data + voltage = [0.0] + get_vsrc_data(voltage, t, 0, 0) + return voltage[0] + +def get_isrc(t): + # TODO - support all get_vsrc_data args + global get_isrc_data + current = [0.0] + get_isrc_data(current, t, 0, 0) + return current[0] + ################################################################# # Top-Level Classes for Strategy Pattern # @@ -14,8 +46,9 @@ def solve_eqns(self): pass class OpPtSolverStrategy(SolverStrategy): - def __init__(self, eqns): - self.eqns = eqns + def __init__(self, eqns, nodes): + self.eqns = eqns + self.nodes = nodes def solve_eqns(self): # https://bugs.python.org/issue4831 ldict = locals() @@ -23,12 +56,19 @@ def solve_eqns(self): exec(s, globals(), ldict) y = ldict['y'] # t = 0.00 - return [[0.00] + root(y, [1.00] * len(self.eqns)).x] + # TODO Why does this not work? + soln = [root(y, [1.00] * len(self.eqns)).x.tolist()] + # TODO need more proper send_data call + if send_data: + send_data(dict(zip(['V({})'.format(n) for n in self.nodes] + \ + ['i({})'.format(l) for l in range(len(self.eqns) - len(self.nodes))], soln[0])), len(soln[0]), 0) + return soln class TransientSolverStrategy(SolverStrategy): - def __init__(self, eqns, ctrl): - self.eqns = eqns - self.ctrl = ctrl + def __init__(self, eqns, ctrl, nodes): + self.eqns = eqns + self.ctrl = ctrl + self.nodes = nodes def solve_eqns(self): # https://bugs.python.org/issue4831 ldict = locals() @@ -36,13 +76,24 @@ def solve_eqns(self): exec(s, globals(), ldict) y = ldict['y'] soln = [] - seed = [0.00] * len(self.eqns) - t = float(self.ctrl["tstart"]) - dt = float(self.ctrl["tstep"]) + seed = [] + x_soln = [0.00] * len(self.eqns) + t = float(self.ctrl["tstart"]) + dt = float(self.ctrl["tstep"]) tstop = float(self.ctrl["tstop"]) while t < tstop: - _y = lambda x : partial(y, x_prev=seed, t=t, dt=dt)(x) - seed = [t] + root(_y, [1.00] * len(self.eqns)).x + _y = lambda x : partial(y, x_prev=x_soln, t=t, dt=dt)(x) + tmp_soln = root(_y, [1.00] * len(self.eqns)) + x_soln = tmp_soln.x.tolist() + # TODO: Replace tolerance check with value found in options + # assert all([abs(z) < 1e-3 for z in _y(x_soln)]) + seed = [t] + x_soln + data_dict_keys = ['time'] + ['V({})'.format(n) for n in self.nodes] + \ + ['i({})'.format(l) for l in range(len(self.eqns) - len(self.nodes))] + assert len(data_dict_keys) == len(seed) + data_dict = dict(zip(data_dict_keys, seed)) + if send_data: + send_data(data_dict, len(seed), 0) soln.append(seed) t += dt return soln @@ -55,11 +106,9 @@ def solve_eqns(self): n = netlist.parse(txt) eqn = eqnstr.gen_eqns_top(n) strat = OpPtSolverStrategy(eqn) - print(strat.solve_eqns()) with open("tran.cir", "r") as f: txt = f.read() n = netlist.parse(txt) eqn = eqnstr.gen_eqns_top(n) # TODO need to support multiple test types? strat = TransientSolverStrategy(eqn, n["ctrl"][0]) - print(strat.solve_eqns()) From 014a0434e38ebf7ce9b2e7ca520608020e6e5e16 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 12 Nov 2022 12:20:59 -0800 Subject: [PATCH 103/115] Refactor components.py --- PySpice/Spice/OpenSPICE/components.py | 82 +++++++++++++++++++++++++-- PySpice/Spice/OpenSPICE/eqnstr.py | 60 +------------------- 2 files changed, 79 insertions(+), 63 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/components.py b/PySpice/Spice/OpenSPICE/components.py index aa06e29f..eb706fd1 100644 --- a/PySpice/Spice/OpenSPICE/components.py +++ b/PySpice/Spice/OpenSPICE/components.py @@ -1,16 +1,86 @@ #!/usr/bin/env python3 -class Resistor: - pass +from abc import ABC, abstractmethod +from .common import v_format, i_format, dv_format, di_format + +class Component(ABC): + @staticmethod + @abstractmethod + def op_pt_eqn(branch, node): + pass + @staticmethod + @abstractmethod + def trans_eqn(branch, node): + pass + +class Resistor(Component): + @staticmethod + def op_pt_eqn(branch, node): + return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), + i_format(branch["branch_idx"], node), + branch["value"]) + @staticmethod + def trans_eqn(branch, node): + return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], node, trans=True), + v_format(branch["node_minus"], node, trans=True), + i_format(branch["branch_idx"], node, trans=True), + branch["value"]) class Capacitor: - pass + @staticmethod + def op_pt_eqn(branch, node): + return "(({})-({}))".format(i_format(_b["branch_idx"], _n), 0.00) + @staticmethod + def trans_eqn(branch, node): + if "ic" in branch.keys(): + # TODO: modify to support nonzero start times + prefix = "((({})-({}))-({})) if t == 0.00 else ".format(v_format(branch["node_plus"], node, trans=True), + v_format(branch["node_minus"], node, trans=True), + branch["ic"]) + else: + prefix = "" + return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(branch["branch_idx"], node, trans=True), + branch["value"], + dv_format(branch["node_plus"], node), + dv_format(branch["node_minus"], node)) class Inductor: - pass + @staticmethod + def op_pt_eqn(branch, node): + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), 0.00) + @staticmethod + def trans_eqn(branch, node): + if "ic" in _b.keys(): + # TODO: modify to support nonzero start times + prefix = "(({})-({})) if t == 0.00 else ".format(i_format(branch["branch_idx"], node, trans=True), + branch["ic"]) + else: + prefix = "" + return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(branch["node_plus"], node, trans=True), + v_format(branch["node_minus"], node, trans=True), + branch["value"], + di_format(branch["branch_idx"], node)) class VSource: - pass + @staticmethod + def op_pt_eqn(branch, node): + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), + branch["value"]) + @staticmethod + def trans_eqn(branch, node): + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node, trans=True), + v_format(branch["node_minus"], node, trans=True), + branch["value"]) class ISource: - pass + @staticmethod + def op_pt_eqn(branch, node): + return "(({})-({}))".format(i_format(branch["branch_idx"], node), + branch["value"]) + @staticmethod + def trans_eqn(branch, node): + return "(({})-({}))".format(i_format(branch["branch_idx"], node, trans=True), + branch["value"]) diff --git a/PySpice/Spice/OpenSPICE/eqnstr.py b/PySpice/Spice/OpenSPICE/eqnstr.py index feb48a79..e42fa442 100755 --- a/PySpice/Spice/OpenSPICE/eqnstr.py +++ b/PySpice/Spice/OpenSPICE/eqnstr.py @@ -2,7 +2,7 @@ from .components import Resistor, Capacitor, Inductor, VSource, ISource from abc import ABC, abstractmethod -from .common import v_format, i_format, dv_format, di_format +from .common import i_format ################################################################# @@ -41,67 +41,13 @@ class EqnStrOpPtStrategy(EqnStrStrategy): def __init__(self): pass def gen_eqn_from_branch(self, _b, _n): - if _b["component"] == Resistor: - return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"], _n), - v_format(_b["node_minus"], _n), - i_format(_b["branch_idx"], _n), - _b["value"]) - elif _b["component"] == Capacitor: - return "(({})-({}))".format(i_format(_b["branch_idx"], _n), 0.00) - elif _b["component"] == Inductor: - return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n), - v_format(_b["node_minus"], _n), 0.00) - elif _b["component"] == VSource: - return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n), - v_format(_b["node_minus"], _n), - _b["value"]) - elif _b["component"] == ISource: - return "(({})-({}))".format(i_format(_b["branch_idx"], _n), - _b["value"]) - else: - assert False + return _b["component"].op_pt_eqn(_b, _n) class EqnStrTransientStrategy(EqnStrStrategy): def __init__(self): pass def gen_eqn_from_branch(self, _b, _n): - if _b["component"] == Resistor: - return "(({})-({}))-(({})*({}))".format(v_format(_b["node_plus"], _n, trans=True), - v_format(_b["node_minus"], _n, trans=True), - i_format(_b["branch_idx"], _n, trans=True), - _b["value"]) - elif _b["component"] == Capacitor: - if "ic" in _b.keys(): - # TODO: modify to support nonzero start times - prefix = "((({})-({}))-({})) if t == 0.00 else ".format(v_format(_b["node_plus"], _n, trans=True), - v_format(_b["node_minus"], _n, trans=True), - _b["ic"]) - else: - prefix = "" - return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(_b["branch_idx"], _n, trans=True), - _b["value"], - dv_format(_b["node_plus"], _n), - dv_format(_b["node_minus"], _n)) - elif _b["component"] == Inductor: - if "ic" in _b.keys(): - # TODO: modify to support nonzero start times - prefix = "(({})-({})) if t == 0.00 else ".format(i_format(_b["branch_idx"], _n, trans=True), - _b["ic"]) - else: - prefix = "" - return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(_b["node_plus"], _n, trans=True), - v_format(_b["node_minus"], _n, trans=True), - _b["value"], - di_format(_b["branch_idx"], _n)) - elif _b["component"] == VSource: - return "((({})-({}))-({}))".format(v_format(_b["node_plus"], _n, trans=True), - v_format(_b["node_minus"], _n, trans=True), - _b["value"]) - elif _b["component"] == ISource: - return "(({})-({}))".format(i_format(_b["branch_idx"], _n, trans=True), - _b["value"]) - else: - assert False + return _b["component"].trans_eqn(_b, _n) def gen_eqns_top(parse_dict): # TODO need to support multiple test types? From 422108d23227a053eaed9611c2a7750365f96120 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 12 Nov 2022 13:06:23 -0800 Subject: [PATCH 104/115] Clean up common.py --- PySpice/Spice/OpenSPICE/__init__.py | 4 +- PySpice/Spice/OpenSPICE/common.py | 69 +++++++++++++++++++++++---- PySpice/Spice/OpenSPICE/components.py | 24 +++++----- 3 files changed, 75 insertions(+), 22 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/__init__.py b/PySpice/Spice/OpenSPICE/__init__.py index 57755709..2b6ba6a8 100755 --- a/PySpice/Spice/OpenSPICE/__init__.py +++ b/PySpice/Spice/OpenSPICE/__init__.py @@ -1,4 +1,4 @@ -# TODO -# from .OpenSPICE import set_get_vsrc, set_get_isrc, set_send_data +#!/usr/bin/env python3 + from .OpenSPICE import run from .solve import set_get_vsrc, set_get_isrc, set_send_data diff --git a/PySpice/Spice/OpenSPICE/common.py b/PySpice/Spice/OpenSPICE/common.py index b9359258..e07be711 100644 --- a/PySpice/Spice/OpenSPICE/common.py +++ b/PySpice/Spice/OpenSPICE/common.py @@ -1,17 +1,70 @@ #!/usr/bin/env python3 -def dv_format(s, n): - return "(({})-({}))".format(v_format(s, n, trans=True, prev=False), - v_format(s, n, trans=True, prev=True )) +def v_format(s, n, prev=False): + """ + Return a string of the form "(x[i])", where i is the index of x + corresponding to the node number s. (ex: n = ['3', '1', '7']. + If s is '7', then the return value will be "(x[2])"). "x[i]" corresponds + to the voltage at node s (whose index in list n is i). -def v_format(s, n, trans=False, prev=False): + @param s: Node number as a string + @param n: List of node numbers. + @param prev: Optional argument defaulted to False. If set to True, + then string will be of the form "(x_prev[i])" instead of + "(x[i])". This refers to the voltage in the previous timestep + as opposed to the current. + @return: Formatted string "(x[i])", where i is s's positional index in n. + This will represent the voltage at node s in the final formatted + equations. + """ outer = "x" if not prev else "x_prev" return "({}[{}])".format(outer, n.index(s)) if s != "0" else "(0.00)" -def di_format(s, n): - return "(({})-({}))".format(i_format(s, n, trans=True, prev=False), - i_format(s, n, trans=True, prev=True )) +def i_format(s, n, prev=False): + """ + Return a string of the form "(x[i])", where i is the index of x + corresponding to the branch number s. (ex: n = ['3', '1', '7']. + If s is '1', then the return value will be "(x[4])"). + + The first len(n) entries of x are the node voltages. The subsequent + entries are the branch currents. s is considered to be an index of + the second portion of the list x, which contains the branch currents. -def i_format(s, n, trans=False, prev=False): + @param s: Branch index as a string + @param n: List of node numbers. + @param prev: Optional argument defaulted to False. If set to True, + then string will be of the form "(x_prev[i])" instead of + "(x[i])". This refers to the current in the previous timestep + as opposed to the current. + @return: Formatted string "(x[i])". + This will represent the current at branch s in the final formatted + equations. + """ outer = "x" if not prev else "x_prev" return "({}[{}])".format(outer, len(n) + int(s)) + +def dv_format(s, n): + """ + Return a string of the form "((x[i])-(x_prev[i]))". This represents an + incremental change in voltage at node s from one timestep to the next. + + @param s: Node number as a string + @param n: List of node numbers. + @return: Formatted string "((x[i])-(x_prev[i]))", where i is s's positional + index in n. + """ + return "(({})-({}))".format(v_format(s, n, prev=False), + v_format(s, n, prev=True )) + + +def di_format(s, n): + """ + Return a string of the form "((x[i])-(x_prev[i]))". This represents an + incremental change in current at branch s from one timestep to the next. + + @param s: Node number as a string + @param n: List of node numbers. + @return: Formatted string "((x[i])-(x_prev[i]))". + """ + return "(({})-({}))".format(i_format(s, n, prev=False), + i_format(s, n, prev=True )) diff --git a/PySpice/Spice/OpenSPICE/components.py b/PySpice/Spice/OpenSPICE/components.py index eb706fd1..ef3c7d87 100644 --- a/PySpice/Spice/OpenSPICE/components.py +++ b/PySpice/Spice/OpenSPICE/components.py @@ -22,9 +22,9 @@ def op_pt_eqn(branch, node): branch["value"]) @staticmethod def trans_eqn(branch, node): - return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], node, trans=True), - v_format(branch["node_minus"], node, trans=True), - i_format(branch["branch_idx"], node, trans=True), + return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), + i_format(branch["branch_idx"], node), branch["value"]) class Capacitor: @@ -35,12 +35,12 @@ def op_pt_eqn(branch, node): def trans_eqn(branch, node): if "ic" in branch.keys(): # TODO: modify to support nonzero start times - prefix = "((({})-({}))-({})) if t == 0.00 else ".format(v_format(branch["node_plus"], node, trans=True), - v_format(branch["node_minus"], node, trans=True), + prefix = "((({})-({}))-({})) if t == 0.00 else ".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), branch["ic"]) else: prefix = "" - return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(branch["branch_idx"], node, trans=True), + return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(branch["branch_idx"], node), branch["value"], dv_format(branch["node_plus"], node), dv_format(branch["node_minus"], node)) @@ -54,12 +54,12 @@ def op_pt_eqn(branch, node): def trans_eqn(branch, node): if "ic" in _b.keys(): # TODO: modify to support nonzero start times - prefix = "(({})-({})) if t == 0.00 else ".format(i_format(branch["branch_idx"], node, trans=True), + prefix = "(({})-({})) if t == 0.00 else ".format(i_format(branch["branch_idx"], node), branch["ic"]) else: prefix = "" - return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(branch["node_plus"], node, trans=True), - v_format(branch["node_minus"], node, trans=True), + return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), branch["value"], di_format(branch["branch_idx"], node)) @@ -71,8 +71,8 @@ def op_pt_eqn(branch, node): branch["value"]) @staticmethod def trans_eqn(branch, node): - return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node, trans=True), - v_format(branch["node_minus"], node, trans=True), + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node), + v_format(branch["node_minus"], node), branch["value"]) class ISource: @@ -82,5 +82,5 @@ def op_pt_eqn(branch, node): branch["value"]) @staticmethod def trans_eqn(branch, node): - return "(({})-({}))".format(i_format(branch["branch_idx"], node, trans=True), + return "(({})-({}))".format(i_format(branch["branch_idx"], node), branch["value"]) From ff9a6f0a12c05a02047020efdfbbd262aff9c6b5 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 12 Nov 2022 13:44:17 -0800 Subject: [PATCH 105/115] Document components library --- PySpice/Spice/OpenSPICE/components.py | 282 +++++++++++++++++++++++--- 1 file changed, 256 insertions(+), 26 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/components.py b/PySpice/Spice/OpenSPICE/components.py index ef3c7d87..e6dacc87 100644 --- a/PySpice/Spice/OpenSPICE/components.py +++ b/PySpice/Spice/OpenSPICE/components.py @@ -4,83 +4,313 @@ from .common import v_format, i_format, dv_format, di_format class Component(ABC): + """ + Abstract class that represents an electrical component. Class contains + methods for formatting equation strings for use in the final system + of equations solved at each simulation timestep. + """ + @staticmethod @abstractmethod def op_pt_eqn(branch, node): + """ + Return an equation string for the component. The equation string is + the left hand side of f(x) = 0, where x is an array. The initial + elements of the array are the node voltages. The latter portion of the + array is a list of the branch currents in the circuit. A system of + these equation strings is solved at each timestep so we can acquire the + voltages and currents. + + f(x) usually represents the IV characteristic of a component. + For instance, if g(I) = V for the component of interest, + f(x) = g(I) - V = 0 is a valid equation string. It would usually be + represented in the form g(I) - V. Similarly, h(V) = I --> + f(x) = h(V) - I = 0 would also work. It is usually just some condition + that must hold by definition for this component. + + As of now, only components with two terminals are considered. + + op_pt_eqn in particular focuses only on operating point simulations. + So, users are advised to avoid using any x_prev expressions. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ pass @staticmethod @abstractmethod def trans_eqn(branch, node): + """ + Same as op_pt_eqn except for transient simulations. Feel free + to use x_prev in these. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ pass class Resistor(Component): + """ + Class that represents a resistor. Class contains + methods for formatting equation strings for use in the final system + of equations solved at each simulation timestep. + """ + @staticmethod def op_pt_eqn(branch, node): - return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), - i_format(branch["branch_idx"], node), + """ + Generate op point equation for resistor. + + Equation format: ((x[node_plus voltage index] - + (x[node_minus voltage index])) - + ((x[branch current])*(resistance))) + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ + return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], \ + node), + v_format(branch["node_minus"],\ + node), + i_format(branch["branch_idx"],\ + node), branch["value"]) @staticmethod def trans_eqn(branch, node): - return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), - i_format(branch["branch_idx"], node), + """ + Generate transient equation for resistor. + + Equation format: ((x[node_plus voltage index] - + (x[node_minus voltage index])) - + ((x[branch current])*(resistance))) + + Note: Equation is the same as op point case. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ + return "(({})-({}))-(({})*({}))".format(v_format(branch["node_plus"], \ + node), + v_format(branch["node_minus"],\ + node), + i_format(branch["branch_idx"],\ + node), branch["value"]) class Capacitor: + """ + Class that represents a capacitor. Class contains + methods for formatting equation strings for use in the final system + of equations solved at each simulation timestep. + """ + @staticmethod def op_pt_eqn(branch, node): - return "(({})-({}))".format(i_format(_b["branch_idx"], _n), 0.00) + """ + Generate op point equation for capacitor. + + Equation format: ((x[branch current]) - (0.00)) + + Note: At steady state, capacitors act as open circuits. Therefore, + the current must be 0.00. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ + return "(({})-({}))".format(i_format(branch["branch_idx"],\ + node), 0.00) @staticmethod def trans_eqn(branch, node): + """ + Generate transient equation for the capacitor. + + There are two cases. The first case is t = 0.00, the simulation start + point. Here, the equation string is as follows: + + "(((x[node_plus index])-(x[node_minus index]))-(initial voltage))" + + This is the initial condition. The second case is t != 0.00, or the + "else" case: + + "(((x[branch current])*dt)-((capacitance value)* + ((dv[node_plus index])-(dv[node_minus index]))))" + + This is a rearrangement of the differential equation I = CdV/dt --> + Idt - CdV = 0. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ if "ic" in branch.keys(): # TODO: modify to support nonzero start times - prefix = "((({})-({}))-({})) if t == 0.00 else ".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), - branch["ic"]) + prefix = "((({})-({}))-({})) if t == 0.00 else ".format(\ + v_format(branch["node_plus"], node),\ + v_format(branch["node_minus"], node),\ + branch["ic"]) else: prefix = "" - return prefix + "((({})*dt)-(({})*(({})-({}))))".format(i_format(branch["branch_idx"], node), - branch["value"], - dv_format(branch["node_plus"], node), - dv_format(branch["node_minus"], node)) + return prefix + "((({})*dt)-(({})*(({})-({}))))".format(\ + i_format(branch["branch_idx"], node),\ + branch["value"],\ + dv_format(branch["node_plus"], node),\ + dv_format(branch["node_minus"], node)) class Inductor: + """ + Class that represents an inductor. Class contains + methods for formatting equation strings for use in the final system + of equations solved at each simulation timestep. + """ + @staticmethod def op_pt_eqn(branch, node): - return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), 0.00) + """ + Generate op point equation for inductor. + + Equation format: (((x[node_plus index]) - (x[node_minus index])) - + (0.00)) + + Note: At steady state, inductors act as short circuits. Therefore, + the branch voltage drop must be 0.00. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], \ + node), + v_format(branch["node_minus"], \ + node), 0.00) @staticmethod def trans_eqn(branch, node): + """ + Generate transient equation for the inductor. + + There are two cases. The first case is t = 0.00, the simulation start + point. Here, the equation string is as follows: + + "((x[branch current])-(initial current value))" + + This is the initial condition. The second case is t != 0.00, or the + "else" case: + + "((((x[node_plus index])-(x[node_minus index]))*dt)- + ((inductance value)*((di))))" + + This is a rearrangement of the differential equation V = Ldi/dt --> + Vdt - Ldi = 0. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ if "ic" in _b.keys(): # TODO: modify to support nonzero start times - prefix = "(({})-({})) if t == 0.00 else ".format(i_format(branch["branch_idx"], node), - branch["ic"]) + prefix = "(({})-({})) if t == 0.00 else ".format(\ + i_format(branch["branch_idx"], node), \ + branch["ic"]) else: prefix = "" - return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), - branch["value"], - di_format(branch["branch_idx"], node)) + return prefix + "(((({})-({}))*dt)-(({})*(({}))))".format(\ + v_format(branch["node_plus"], node), \ + v_format(branch["node_minus"], node), \ + branch["value"], \ + di_format(branch["branch_idx"], node)) class VSource: + """ + Class that represents a voltage source. Class contains + methods for formatting equation strings for use in the final system + of equations solved at each simulation timestep. + """ + @staticmethod def op_pt_eqn(branch, node): - return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), + """ + Generate op point equation for voltage source. + + Equation format: (((x[node_plus index]) - (x[node_minus index])) - + (voltage value)) + + In other words, the branch voltage drop must be the source's voltage + value. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], \ + node), + v_format(branch["node_minus"],\ + node), branch["value"]) @staticmethod def trans_eqn(branch, node): - return "((({})-({}))-({}))".format(v_format(branch["node_plus"], node), - v_format(branch["node_minus"], node), + """ + Generate op point equation for voltage source. + + Equation format: (((x[node_plus index]) - (x[node_minus index])) - + (voltage value)) + + In other words, the branch voltage drop must be the source's voltage + value. + + Note: Equation is the same as op point case. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ + return "((({})-({}))-({}))".format(v_format(branch["node_plus"], \ + node), + v_format(branch["node_minus"],\ + node), branch["value"]) class ISource: + """ + Class that represents a current source. Class contains + methods for formatting equation strings for use in the final system + of equations solved at each simulation timestep. + """ + @staticmethod def op_pt_eqn(branch, node): + """ + Generate op point equation for current source. + + Equation format: ((x[branch current]) - (current value)) + + In other words, the branch current must be the source's current + value. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ return "(({})-({}))".format(i_format(branch["branch_idx"], node), branch["value"]) @staticmethod def trans_eqn(branch, node): + """ + Generate op point equation for current source. + + Equation format: ((x[branch current]) - (current value)) + + In other words, the branch current must be the source's current + value. + + Note: Equation is the same as op point case. + + @param branch: Branch dictionary for the component's branch. + @param node: List of node numbers. + @return: Formatted equation string. + """ return "(({})-({}))".format(i_format(branch["branch_idx"], node), branch["value"]) From 7a12d2ca8a4b919d2eba9bf76e50f1bb68212e5c Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sat, 12 Nov 2022 15:16:30 -0800 Subject: [PATCH 106/115] Document eqnstr.py --- PySpice/Spice/OpenSPICE/eqnstr.py | 101 ++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 13 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/eqnstr.py b/PySpice/Spice/OpenSPICE/eqnstr.py index e42fa442..960aca35 100755 --- a/PySpice/Spice/OpenSPICE/eqnstr.py +++ b/PySpice/Spice/OpenSPICE/eqnstr.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 -from .components import Resistor, Capacitor, Inductor, VSource, ISource from abc import ABC, abstractmethod from .common import i_format @@ -9,28 +8,66 @@ # Top-Level Classes for Strategy Pattern # class EqnStrStrategy(ABC): + """ + Abstract class that represents a simulations strategy (e.g. operating + point, transient, etc.). Class contains methods for generating + equations for the given strategy. + """ + @abstractmethod - def gen_eqn_from_branch(self, _b): + def gen_eqn_from_branch(self, _b, _n): + """ + Generate formatted equation string for the given circuit branch. + + @param _b: Branch dictionary + @param _n: List of node numbers. + @return: Formatted equation string. + """ pass + def gen_eqns(self, branch_dicts, nodes): - return [self.gen_eqn_from_branch(_b, nodes) for _b in branch_dicts] + self.gen_kcl_eqns(branch_dicts, nodes) + """ + Generate list of formatted equation strings. First portion of list is + branch equations given by underlying Component classes. The second + portion of list is KCL equations. KCL equations each represent all of + the currents flowing into/out of a given node. So, there should be + one KCL equation for each node and one branch equation for each branch. + + @param branch_dicts: List of branch dictionaries + @param nodes: List of node numbers. + @return: List of formatted equation strings. + """ + return [self.gen_eqn_from_branch(_b, nodes) for _b in branch_dicts] + \ + self.gen_kcl_eqns(branch_dicts, nodes) + def gen_kcl_eqns(self, branch_dicts, nodes): + """ + Generate list of formatted equation strings for KCL equations. + + @param branch_dicts: List of branch dictionaries + @param nodes: List of node numbers. + @return: List of formatted equation strings. + """ kcl_dict = dict(zip(nodes, [[]] * len(nodes))) for b in branch_dicts: if b["node_plus"] != "0": - # TODO: Why does this syntax not work? - # kcl_dict[b["node_plus"]].append("-({})".format(i_format(b["branch_idx"], nodes))) l_plus = len(kcl_dict[b["node_plus"]]) - other_l = [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_plus"]] - kcl_dict[b["node_plus"]] = kcl_dict[b["node_plus"]] + ["-({})".format(i_format(b["branch_idx"], nodes))] + other_l = [len(kcl_dict[n]) for n in kcl_dict.keys() \ + if n != b["node_plus"]] + kcl_dict[b["node_plus"]] = kcl_dict[b["node_plus"]] + \ + ["-({})".format(i_format(b["branch_idx"], nodes))] assert len(kcl_dict[b["node_plus"]]) == l_plus + 1 - assert [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_plus"]] == other_l + assert [len(kcl_dict[n]) for n in kcl_dict.keys() \ + if n != b["node_plus"]] == other_l if b["node_minus"] != "0": l_minus = len(kcl_dict[b["node_minus"]]) - other_l = [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_minus"]] - kcl_dict[b["node_minus"]] = kcl_dict[b["node_minus"]] + ["+({})".format(i_format(b["branch_idx"], nodes))] + other_l = [len(kcl_dict[n]) for n in kcl_dict.keys() \ + if n != b["node_minus"]] + kcl_dict[b["node_minus"]] = kcl_dict[b["node_minus"]] + \ + ["+({})".format(i_format(b["branch_idx"], nodes))] assert len(kcl_dict[b["node_minus"]]) == l_minus + 1 - assert [len(kcl_dict[n]) for n in kcl_dict.keys() if n != b["node_minus"]] == other_l + assert [len(kcl_dict[n]) for n in kcl_dict.keys() \ + if n != b["node_minus"]] == other_l return ["".join(v) for v in kcl_dict.values()] ################################################################# @@ -38,25 +75,63 @@ def gen_kcl_eqns(self, branch_dicts, nodes): # Strategies # class EqnStrOpPtStrategy(EqnStrStrategy): + """ + Strategy class for operating point simulations. + """ + def __init__(self): + """ + Empty initializer method. + """ pass + def gen_eqn_from_branch(self, _b, _n): + """ + Generate formatted equation string for the given circuit branch. + + @param _b: Branch dictionary + @param _n: List of node numbers. + @return: Formatted equation string. + """ return _b["component"].op_pt_eqn(_b, _n) class EqnStrTransientStrategy(EqnStrStrategy): + """ + Strategy class for transient simulations. + """ + def __init__(self): + """ + Empty initializer method. + """ pass + def gen_eqn_from_branch(self, _b, _n): + """ + Generate formatted equation string for the given circuit branch. + + @param _b: Branch dictionary + @param _n: List of node numbers. + @return: Formatted equation string. + """ return _b["component"].trans_eqn(_b, _n) def gen_eqns_top(parse_dict): + """ + Generate formatted equation string for the given circuit. + + @param parse_dict: Dictionary from parser + @return: List of formatted equation strings. + """ # TODO need to support multiple test types? # TODO disable ic if uic arg is not provided to trans # TODO wrap logic in a context type if parse_dict["ctrl"][0]["test_type"] == "op_pt": - return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"], parse_dict["nodes"]) + return EqnStrOpPtStrategy().gen_eqns(parse_dict["branches"], \ + parse_dict["nodes"]) elif parse_dict["ctrl"][0]["test_type"] == "tran" : - return EqnStrTransientStrategy().gen_eqns(parse_dict["branches"], parse_dict["nodes"]) + return EqnStrTransientStrategy().gen_eqns(parse_dict["branches"], \ + parse_dict["nodes"]) else: assert False From e2547ea15bad30b0c5e94074ae11f2c20a6ab30f Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sun, 13 Nov 2022 17:49:17 -0800 Subject: [PATCH 107/115] Add documentation to genout.py --- PySpice/Spice/OpenSPICE/genout.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/genout.py b/PySpice/Spice/OpenSPICE/genout.py index 275cb1d5..cbd76ce1 100644 --- a/PySpice/Spice/OpenSPICE/genout.py +++ b/PySpice/Spice/OpenSPICE/genout.py @@ -4,15 +4,36 @@ from array import array def gen_out_txt(raw_fname, title, test_type, soln, sorted_nodes): + """ + Dump an output file with the simulation results. The output file only + contains node voltage solutions and not currents, though soln contains + currents as well. + + @param raw_fname: name of file that contains simulation results + @param title: simulation title + @param test_type: the type of simulation run (e.g. "tran" or "op_pt") + @param soln: simulation results; should contain one entry for each timestep + for transient simulations and one entry for operating point + simulations. Each entry contains a list whose initial entry + is the simulation time, the next entries are the node voltages + in order, and the final entries are the branch currents in + order. + @param sorted_nodes: List of nodes from smallest to greatest (e.g. + ["1", "2", "4"]) + """ spice_raw_file_txt = "Title: {}\n".format(title) spice_raw_file_txt += "Date: {}\n".format(datetime.today().strftime('%c')) - spice_raw_file_txt += "Plotname: {}\n".format("Transient Analysis" if test_type == "tran" else "Operating Point") + spice_raw_file_txt += "Plotname: {}\n".format("Transient Analysis" \ + if test_type == "tran" else "Operating Point") spice_raw_file_txt += "Flags: {}\n".format("real") - spice_raw_file_txt += "No. Variables: {}\n".format((test_type == "tran") + len(sorted_nodes)) + spice_raw_file_txt += "No. Variables: {}\n".format((test_type == "tran") +\ + len(sorted_nodes)) spice_raw_file_txt += "No. Points: {}\n".format(len(soln)) spice_raw_file_txt += "Variables:\n" spice_raw_file_txt += "\t0\ttime\ttime\n" if test_type == "tran" else "" - spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format((test_type == "tran")+i,"V({})".format(v)) for i,v in enumerate(sorted_nodes)]) + spice_raw_file_txt += "".join(["\t{}\t{}\tvoltage\n".format(\ + (test_type == "tran")+i,"V({})".format(v)) \ + for i,v in enumerate(sorted_nodes)]) spice_raw_file_txt += "Binary:\n" with open(raw_fname, "w") as spice_raw_file: spice_raw_file.write(spice_raw_file_txt) From d029b5dce73f13e2c8de089040e74eee5f281556 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Sun, 13 Nov 2022 17:53:02 -0800 Subject: [PATCH 108/115] Add assertions to genout --- PySpice/Spice/OpenSPICE/genout.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PySpice/Spice/OpenSPICE/genout.py b/PySpice/Spice/OpenSPICE/genout.py index cbd76ce1..32c9a0e1 100644 --- a/PySpice/Spice/OpenSPICE/genout.py +++ b/PySpice/Spice/OpenSPICE/genout.py @@ -15,12 +15,16 @@ def gen_out_txt(raw_fname, title, test_type, soln, sorted_nodes): @param soln: simulation results; should contain one entry for each timestep for transient simulations and one entry for operating point simulations. Each entry contains a list whose initial entry - is the simulation time, the next entries are the node voltages + is the simulation time (for transient sims only). + The next entries are the node voltages in order, and the final entries are the branch currents in order. @param sorted_nodes: List of nodes from smallest to greatest (e.g. ["1", "2", "4"]) """ + assert len(soln) > 0 + assert all([len(_) == len(soln[i-1]) for i,_ in enumerate(soln) if i != 0]) + assert len(soln[0]) > len(sorted_nodes) spice_raw_file_txt = "Title: {}\n".format(title) spice_raw_file_txt += "Date: {}\n".format(datetime.today().strftime('%c')) spice_raw_file_txt += "Plotname: {}\n".format("Transient Analysis" \ From 08dfa4cd212145a50b4f2630b6b58212645aa9d5 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Wed, 16 Nov 2022 18:55:41 -0800 Subject: [PATCH 109/115] Add documentation to netlist.py --- PySpice/Spice/OpenSPICE/netlist.py | 195 ++++++++++++++++++++++++++--- 1 file changed, 179 insertions(+), 16 deletions(-) diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index 869bfaa5..2d1f20af 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -29,7 +29,6 @@ def netlist(): [ctrl, tran, op_pt], OneOrMore(newline), end def branch(): - # TODO: Enable behavisource and behavvsource return [resistor, capacitor, inductor, vsource, isource, extvsource, extisource, vccssource, vcvssource, ccvssource, cccssource, behavisource, behavvsource] @@ -85,29 +84,49 @@ def _int(): # Text Formatting Classes # class TextFmt(ABC): + """ + Abstract class used to generate values for components. + """ @abstractmethod def gen_txt_str(self, nodes): + """ + @param node: List of node numbers. + @return: string (or float) representing component value; + may be an equation + """ pass class ResistorTextFmt(TextFmt): + """ + Resistor class inheriting TextFmt + """ def __init__(self, value): self.value = value def gen_txt_str(self, nodes): return unit_parse(self.value) class CapacitorTextFmt(TextFmt): + """ + Capacitor class inheriting TextFmt + """ def __init__(self, value): self.value = value def gen_txt_str(self, nodes): return unit_parse(self.value) class InductorTextFmt(TextFmt): + """ + Inductor class inheriting TextFmt + """ def __init__(self, value): self.value = value def gen_txt_str(self, nodes): return unit_parse(self.value) class VSourceTextFmt(TextFmt): + """ + VSource class inheriting TextFmt + """ def __init__(self, value, srctype="passiveValue"): self.value = value self.srctype = srctype @@ -148,24 +167,44 @@ def gen_txt_str(self, nodes): assert False class ISourceTextFmt(TextFmt): + """ + ISource class inheriting TextFmt + """ def __init__(self, value): self.value = value def gen_txt_str(self, nodes): return unit_parse(self.value) class ExtVSourceTextFmt(TextFmt): + """ + ExtVSource class inheriting TextFmt + """ def __init__(self): pass def gen_txt_str(self, nodes): + """ + @return: Returns the string "(get_vsrc(t))". Function defined in + solve.py. Used to get value from external voltage source. + """ return "(get_vsrc(t))" class ExtISourceTextFmt(TextFmt): + """ + ExtISource class inheriting TextFmt + """ def __init__(self): pass def gen_txt_str(self, nodes): + """ + @return: Returns the string "(get_isrc(t))". Function defined in + solve.py. Used to get value from external current source. + """ return "(get_isrc(t))" class VCCSSourceTextFmt(TextFmt): + """ + VCCSSource class inheriting TextFmt + """ def __init__(self, value, node_plus, node_minus): self.value = value self.node_plus = node_plus @@ -175,6 +214,9 @@ def gen_txt_str(self, nodes): v_format(self.node_minus, nodes)) class VCVSSourceTextFmt(TextFmt): + """ + VCVSSource class inheriting TextFmt + """ def __init__(self, value, node_plus, node_minus): self.value = value self.node_plus = node_plus @@ -184,6 +226,9 @@ def gen_txt_str(self, nodes): v_format(self.node_minus, nodes)) class CCVSSourceTextFmt(TextFmt): + """ + CCVSSource class inheriting TextFmt + """ def __init__(self, value, branch_plus, branch_minus): self.value = value self.branch_plus = branch_plus @@ -193,6 +238,9 @@ def gen_txt_str(self, nodes): i_format(self.branch_minus, nodes)) class CCCSSourceTextFmt(TextFmt): + """ + CCCSSource class inheriting TextFmt + """ def __init__(self, value, branch_plus, branch_minus): self.value = value self.branch_plus = branch_plus @@ -202,6 +250,9 @@ def gen_txt_str(self, nodes): i_format(self.branch_minus, nodes)) class BehavISourceTextFmt(TextFmt): + """ + BehavISource class inheriting TextFmt + """ def __init__(self, value): self.value = value def gen_txt_str(self, nodes): @@ -212,6 +263,9 @@ def gen_txt_str(self, nodes): return "({})".format(val) class BehavVSourceTextFmt(TextFmt): + """ + BehavVSource class inheriting TextFmt + """ def __init__(self, value): self.value = value def gen_txt_str(self, nodes): @@ -359,12 +413,19 @@ def title(): # Unit Parsing def oom(x): + """ + @param x: string of SI unit suffix + @return: float representing SI order of magnitude (hence, "oom") + """ assert len(x) == 1 # https://en.wikipedia.org/wiki/Metric_prefix return SI_PREFIXES[x] def unit_parse(x): - # TODO can this be formally verified? + """ + @param x: string with SI unit suffix + @return: value float + """ groups = search(r'(\d+\.*\d*)({})?([a-zA-z])*'.format(SI_PREFIX_REGEX), x).groups() return float(groups[0]) * 1.00 if not groups[1] or not groups[2] else float(groups[0]) * oom(groups[1]) @@ -372,32 +433,72 @@ def unit_parse(x): # Parsing Functions # -class Netlist: - def __init__(self): - self.nodes = [] - self.branches = [] - - def gen_dict_from_branch(self, nonterm, branch_idx): - assert nonterm_is_branch(nonterm) - - def filter_terms(ptree): + """ + Remove all newline terminals from Arpeggio parse tree. + + @param ptree: Arpeggio parse tree + @return: list of parse tree nodes + """ return [_ for _ in ptree if _.value != "\n"] # TODO: should we use explicit == as opposed to in? def nonterm_is_tran(nonterm): + """ + Check if nonterminal node in Arpeggio parse tree is a tran. + + @param nonterm: nonterminal node from Arpeggio parse tree + @return: True/False boolean + """ return (type(nonterm) == NonTerminal) and ("tran" in nonterm.name) def nonterm_is_branch(nonterm): + """ + Check if nonterminal node in Arpeggio parse tree is a branch. + + @param nonterm: nonterminal node from Arpeggio parse tree + @return: True/False boolean + """ return (type(nonterm) == NonTerminal) and ("branch" in nonterm.name) def nonterm_is_ctrl(nonterm): + """ + Check if nonterminal node in Arpeggio parse tree is a ctrl. + + @param nonterm: nonterminal node from Arpeggio parse tree + @return: True/False boolean + """ return (type(nonterm) == NonTerminal) and ("ctrl" in nonterm.name) def nonterm_is_title(nonterm): + """ + Check if nonterminal node in Arpeggio parse tree is a title. + + @param nonterm: nonterminal node from Arpeggio parse tree + @return: True/False boolean + """ return (type(nonterm) == NonTerminal) and ("title" in nonterm.name) def gen_dict_from_tran_node(tran_node): + """ + Generate a control dictionary for transient simulations. The entries are + the following: + + "test_type" key: maps to the string literal "tran" + "tstep" key: maps to a float literal for the timestep size + "tstop" key: maps to a float literal for the simulation end time + "tstart" key: maps to a float literal for the simulation start time + "tmax" key: maps to a float literal for the max timestep size; used + for variable timestepping, which OpenSPICE currently does + not support + "uic" key: maps to the string literal "uic" if defined, excluded otherwise; + tells the user whether + initial conditions are to be used; currently unused and + assumed to be "uic" + + @param tran_node: nonterminal node from Arpeggio parse tree + @return: control dictionary for nonterm + """ assert nonterm_is_tran(tran_node) tran_node_rule_names = [n.rule_name for n in tran_node] tran_d = {"test_type" : "tran", @@ -418,6 +519,17 @@ def gen_dict_from_tran_node(tran_node): return tran_d def gen_dict_from_ctrl(nonterm): + """ + Generate a control dictionary. The entries vary depending on the + type of test. For operating point simulations, there is only + one key, "test_type", which maps to the string literal "op_pt". + + Please see gen_dict_from_tran_node for details on the control + dictionary for transient simulations. + + @param nonterm: nonterminal node from Arpeggio parse tree + @return: control dictionary for nonterm + """ assert nonterm_is_ctrl(nonterm) rule_names = [n.rule_name for n in nonterm] if "op_pt" in rule_names: @@ -428,6 +540,27 @@ def gen_dict_from_ctrl(nonterm): assert False def gen_dict_from_branch(nonterm, branch_idx): + """ + Generate a branch dictionary. The entries are: + + "component" key: maps to class of component on branch (ex: Resistor) + "node_plus" key: maps to positive side node (ex: '1') + "node_minus" key: maps to negative side node (ex: '11') + "value" key: maps to component value (ex: 0.0); value can also be + an expression involving the x vector; the Python "exec" + function is used in solve.py to evaluate the equations, + so you could use arbitrary Python code here if you wanted to + do so. However, do so at your own risk. + + These values are implemented using TextFmt + classes. Call their gen_txt_str method to get the string or + float value. + "branch_idx" key: maps to component value (ex: 2) + + @param nonterm: nonterminal node from Arpeggio parse tree + @param branch_idx: index for branch in circuit + @return: branch dictionary for nonterm + """ assert nonterm_is_branch(nonterm) if nonterm[0].rule_name == "resistor": assert len(nonterm[0]) == 4 @@ -540,9 +673,30 @@ def gen_dict_from_branch(nonterm, branch_idx): assert False def gen_data_dicts(ptree): + """ + Consume parse tree and generate a data dictionary. The data dictionary + takes on the following form: + + "branches" key: maps to a list of branch dictionaries, documented + in the gen_dict_from_branch function + + "nodes" key: maps to a list of all the nodes in the circuit + (ex: ['1', '2']) + + "ctrl" key: maps to a control dictionary, documented in the + gen_dict_from_ctrl function + + "title" key: maps to the netlist title string + + @param ptree: array of nodes from Arpeggio parse tree for input + netlist + @return: data dictionary for netlist + """ branches = [_ for _ in ptree if nonterm_is_branch(_)] - branches = [gen_dict_from_branch(_, branch_idx) for branch_idx,_ in enumerate(branches)] - nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d in branches])) + branches = [gen_dict_from_branch(_, branch_idx) for branch_idx,_ in \ + enumerate(branches)] + nodes = sorted(set().union(*[{d["node_plus"], d["node_minus"]} for d \ + in branches])) assert "0" in nodes nodes.remove("0") [_.update({"value" : _["value"].gen_txt_str(nodes)}) for _ in branches] @@ -550,18 +704,27 @@ def gen_data_dicts(ptree): if len(ctrl) == 0: # TODO: need a cleaner way of dealing with ctrl statements ctrl = [{"test_type" : "op_pt"} for _ in ptree if _.value == ".op"] - ctrl += [gen_dict_from_tran_node(_) for _ in ptree if ".tran" in _.value] + ctrl += [gen_dict_from_tran_node(_) for _ in ptree if ".tran" \ + in _.value] # TODO support multiple test types? assert len(ctrl) == 1 titles = [_.value for _ in ptree if nonterm_is_title(_)] assert len(titles) == 1 or len(titles) == 0 if len(titles) == 0: titles.append(DEFAULT_TITLE) - return {"branches" : branches, "nodes" : nodes, "ctrl" : ctrl, "title" : titles[0]} + return {"branches" : branches, "nodes" : nodes, "ctrl" : ctrl, \ + "title" : titles[0]} def parse(txt): + """ + Parse a SPICE netlist string and return a data dictionary. + + @param txt: string containing file contents of SPICE netlist + @return: data dictionary for netlist + """ parser = ParserPython(netlist, ws='\t\r ') - return gen_data_dicts(filter_terms(parser.parse(txt))) + ptree = parser.parse(txt) + return gen_data_dicts(filter_terms(ptree)) ####################################################################################### From 721eb1681b4f776c9fec289684804fd310da0eb4 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 18 Nov 2022 15:22:12 -0800 Subject: [PATCH 110/115] Remove useless comment from netlist.py --- PySpice/Spice/OpenSPICE/netlist.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PySpice/Spice/OpenSPICE/netlist.py b/PySpice/Spice/OpenSPICE/netlist.py index 2d1f20af..bccbca8c 100755 --- a/PySpice/Spice/OpenSPICE/netlist.py +++ b/PySpice/Spice/OpenSPICE/netlist.py @@ -67,7 +67,6 @@ def end(): return RegExMatch(".end") def options(): - # TODO - paste link from below return RegExMatch(".options"), RegExMatch('.*$') def _float(): From 05df35ff92fed8eb9b16fd854e8afbfda4263ca4 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 18 Nov 2022 15:22:28 -0800 Subject: [PATCH 111/115] Add documentation to solve.py --- PySpice/Spice/OpenSPICE/solve.py | 88 ++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/PySpice/Spice/OpenSPICE/solve.py b/PySpice/Spice/OpenSPICE/solve.py index 00abdc33..047612eb 100755 --- a/PySpice/Spice/OpenSPICE/solve.py +++ b/PySpice/Spice/OpenSPICE/solve.py @@ -11,18 +11,60 @@ send_data = None def set_get_vsrc(x): + """ + Set the get_vsrc_data function, which is ultimately called by + get_vsrc for use in external voltage sources. + + @param x: A function that takes 4 arguments. The first argument is + a list with a single float entry. This entry will be overwritten + by the function x. After x returns, it will be an array of one element, + the external voltage value. The second argument is a float representing + the simulation time. The final two arguments are hardcoded to zeros + for now. + """ global get_vsrc_data get_vsrc_data = x def set_get_isrc(x): + """ + Set the get_isrc_data function, which is ultimately called by + get_isrc for use in external voltage sources. + + @param x: A function that takes 4 arguments. The first argument is + a list with a single float entry. This entry will be overwritten + by the function x. After x returns, it will be an array of one element, + the external current value. The second argument is a float representing + the simulation time. The final two arguments are hardcoded to zeros + for now. + """ global get_isrc_data get_isrc_data = x def set_send_data(x): + """ + Set the send_data function. This function is used to relay data back + to PySpice. + + @param x: A function that takes 3 arguments. The first argument is + a dictionary. This format of the dictionary varies depending on the + simulation. For operating point sims, dictionary maps 'V(*)', where * + is a node name, and 'i(*)', where * is a branch index, to the simulation + solution. Transient sims are the same except the first entry in dictionary + is "t" mapping to the given timestep. send_data function would be called + once per timestep. + The second argument is the length of that dictionary. The last argument + is hardcoded to zero for now. + """ global send_data send_data = x def get_vsrc(t): + """ + Get voltage from external voltage source. + + @param t: simulation timestep + @return: External voltage source value at timestep t as a float + """ # TODO - support all get_vsrc_data args global get_vsrc_data voltage = [0.0] @@ -30,6 +72,12 @@ def get_vsrc(t): return voltage[0] def get_isrc(t): + """ + Get current from external current source. + + @param t: simulation timestep + @return: External current source value at timestep t as a float + """ # TODO - support all get_vsrc_data args global get_isrc_data current = [0.0] @@ -41,15 +89,40 @@ def get_isrc(t): # Top-Level Classes for Strategy Pattern # class SolverStrategy(ABC): + """ + Abstract class used to implement a "strategy" for solving system of + equations for given simulation type. + """ @abstractmethod def solve_eqns(self): + """ + Implement this function in subclasses to solve equations. Should + call send_data if defined to relay data back to PySpice. + + @return: solution for equations + """ pass class OpPtSolverStrategy(SolverStrategy): + """ + Operating point solver strategy subclass + """ def __init__(self, eqns, nodes): + """ + Initializer function. + + @param eqns: list of equation strings containing x[*] list entries + @param nodes: list of nodes + """ self.eqns = eqns self.nodes = nodes def solve_eqns(self): + """ + Solve equations. + + @return: solution array; first entries are node voltages; the latter + entries are branch currents + """ # https://bugs.python.org/issue4831 ldict = locals() s = "y = lambda x : [" + ",".join(self.eqns) + "]" @@ -65,11 +138,26 @@ def solve_eqns(self): return soln class TransientSolverStrategy(SolverStrategy): + """ + Transient solver strategy subclass + """ def __init__(self, eqns, ctrl, nodes): + """ + Initializer function. + + @param eqns: list of equation strings containing x[*] list entries + @param nodes: list of nodes + """ self.eqns = eqns self.ctrl = ctrl self.nodes = nodes def solve_eqns(self): + """ + Solve equations. + + @return: solution array; first entries are node voltages; the latter + entries are branch currents + """ # https://bugs.python.org/issue4831 ldict = locals() s = "y = lambda x , x_prev , t , dt : [" + ",".join(self.eqns) + "]" From 230fbb427157211f824b3fa66c96cbb03272c202 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 18 Nov 2022 15:22:45 -0800 Subject: [PATCH 112/115] Add documentation --- PySpice/Spice/OpenSPICE/Doxyfile | 2725 +++++++++++++++++ PySpice/Spice/OpenSPICE/html/annotated.html | 132 + PySpice/Spice/OpenSPICE/html/bc_s.png | Bin 0 -> 676 bytes PySpice/Spice/OpenSPICE/html/bc_sd.png | Bin 0 -> 635 bytes PySpice/Spice/OpenSPICE/html/bdwn.png | Bin 0 -> 147 bytes ...enSPICE_1_1RawFile_1_1RawFile-members.html | 97 + ...ce_1_1OpenSPICE_1_1RawFile_1_1RawFile.html | 169 + ...ice_1_1OpenSPICE_1_1RawFile_1_1RawFile.png | Bin 0 -> 762 bytes ...nSPICE_1_1RawFile_1_1Variable-members.html | 93 + ...e_1_1OpenSPICE_1_1RawFile_1_1Variable.html | 118 + ...ce_1_1OpenSPICE_1_1RawFile_1_1Variable.png | Bin 0 -> 813 bytes ..._1_1Server_1_1OpenSPICEServer-members.html | 92 + ...penSPICE_1_1Server_1_1OpenSPICEServer.html | 146 + ...CE_1_1Shared_1_1OpenSPICECircuitError.html | 95 + ...ICE_1_1Shared_1_1OpenSPICECircuitError.png | Bin 0 -> 958 bytes ...CE_1_1Shared_1_1OpenSPICECommandError.html | 95 + ...ICE_1_1Shared_1_1OpenSPICECommandError.png | Bin 0 -> 992 bytes ..._1_1Shared_1_1OpenSPICEShared-members.html | 144 + ...penSPICE_1_1Shared_1_1OpenSPICEShared.html | 1315 ++++++++ ..._1OpenSPICE_1_1Shared_1_1Plot-members.html | 96 + ...1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.html | 132 + ..._1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.png | Bin 0 -> 684 bytes ...OpenSPICE_1_1Shared_1_1Vector-members.html | 96 + ...pice_1_1OpenSPICE_1_1Shared_1_1Vector.html | 164 + ..._1_1OpenSPICECircuitSimulator-members.html | 92 + ...mulation_1_1OpenSPICECircuitSimulator.html | 115 + ...imulation_1_1OpenSPICECircuitSimulator.png | Bin 0 -> 1038 bytes ...CE_1_1components_1_1Capacitor-members.html | 91 + ...1OpenSPICE_1_1components_1_1Capacitor.html | 206 ++ ...CE_1_1components_1_1Component-members.html | 91 + ...1OpenSPICE_1_1components_1_1Component.html | 218 ++ ..._1OpenSPICE_1_1components_1_1Component.png | Bin 0 -> 1435 bytes ...PICE_1_1components_1_1ISource-members.html | 91 + ...1_1OpenSPICE_1_1components_1_1ISource.html | 199 ++ ...ICE_1_1components_1_1Inductor-members.html | 91 + ..._1OpenSPICE_1_1components_1_1Inductor.html | 207 ++ ...ICE_1_1components_1_1Resistor-members.html | 91 + ..._1OpenSPICE_1_1components_1_1Resistor.html | 214 ++ ...1_1OpenSPICE_1_1components_1_1Resistor.png | Bin 0 -> 1432 bytes ...PICE_1_1components_1_1VSource-members.html | 91 + ...1_1OpenSPICE_1_1components_1_1VSource.html | 201 ++ ...1eqnstr_1_1EqnStrOpPtStrategy-members.html | 91 + ...SPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html | 180 ++ ...nSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.png | Bin 0 -> 1564 bytes ...E_1_1eqnstr_1_1EqnStrStrategy-members.html | 92 + ...OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html | 240 ++ ...1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.png | Bin 0 -> 2246 bytes ...tr_1_1EqnStrTransientStrategy-members.html | 91 + ..._1_1eqnstr_1_1EqnStrTransientStrategy.html | 180 ++ ...E_1_1eqnstr_1_1EqnStrTransientStrategy.png | Bin 0 -> 1610 bytes ...etlist_1_1BehavISourceTextFmt-members.html | 92 + ...ICE_1_1netlist_1_1BehavISourceTextFmt.html | 155 + ...PICE_1_1netlist_1_1BehavISourceTextFmt.png | Bin 0 -> 1508 bytes ...etlist_1_1BehavVSourceTextFmt-members.html | 92 + ...ICE_1_1netlist_1_1BehavVSourceTextFmt.html | 155 + ...PICE_1_1netlist_1_1BehavVSourceTextFmt.png | Bin 0 -> 1519 bytes ...1netlist_1_1CCCSSourceTextFmt-members.html | 94 + ...SPICE_1_1netlist_1_1CCCSSourceTextFmt.html | 161 + ...nSPICE_1_1netlist_1_1CCCSSourceTextFmt.png | Bin 0 -> 1479 bytes ...1netlist_1_1CCVSSourceTextFmt-members.html | 94 + ...SPICE_1_1netlist_1_1CCVSSourceTextFmt.html | 161 + ...nSPICE_1_1netlist_1_1CCVSSourceTextFmt.png | Bin 0 -> 1487 bytes ..._1netlist_1_1CapacitorTextFmt-members.html | 92 + ...nSPICE_1_1netlist_1_1CapacitorTextFmt.html | 155 + ...enSPICE_1_1netlist_1_1CapacitorTextFmt.png | Bin 0 -> 1466 bytes ...1netlist_1_1ExtISourceTextFmt-members.html | 91 + ...SPICE_1_1netlist_1_1ExtISourceTextFmt.html | 147 + ...nSPICE_1_1netlist_1_1ExtISourceTextFmt.png | Bin 0 -> 1471 bytes ...1netlist_1_1ExtVSourceTextFmt-members.html | 91 + ...SPICE_1_1netlist_1_1ExtVSourceTextFmt.html | 147 + ...nSPICE_1_1netlist_1_1ExtVSourceTextFmt.png | Bin 0 -> 1490 bytes ..._1_1netlist_1_1ISourceTextFmt-members.html | 92 + ...penSPICE_1_1netlist_1_1ISourceTextFmt.html | 155 + ...OpenSPICE_1_1netlist_1_1ISourceTextFmt.png | Bin 0 -> 1425 bytes ...1_1netlist_1_1InductorTextFmt-members.html | 92 + ...enSPICE_1_1netlist_1_1InductorTextFmt.html | 155 + ...penSPICE_1_1netlist_1_1InductorTextFmt.png | Bin 0 -> 1418 bytes ...1_1netlist_1_1ResistorTextFmt-members.html | 92 + ...enSPICE_1_1netlist_1_1ResistorTextFmt.html | 155 + ...penSPICE_1_1netlist_1_1ResistorTextFmt.png | Bin 0 -> 1428 bytes ...enSPICE_1_1netlist_1_1TextFmt-members.html | 90 + ...ce_1_1OpenSPICE_1_1netlist_1_1TextFmt.html | 155 + ...ice_1_1OpenSPICE_1_1netlist_1_1TextFmt.png | Bin 0 -> 11397 bytes ...1netlist_1_1VCCSSourceTextFmt-members.html | 94 + ...SPICE_1_1netlist_1_1VCCSSourceTextFmt.html | 161 + ...nSPICE_1_1netlist_1_1VCCSSourceTextFmt.png | Bin 0 -> 1492 bytes ...1netlist_1_1VCVSSourceTextFmt-members.html | 94 + ...SPICE_1_1netlist_1_1VCVSSourceTextFmt.html | 161 + ...nSPICE_1_1netlist_1_1VCVSSourceTextFmt.png | Bin 0 -> 1488 bytes ..._1_1netlist_1_1VSourceTextFmt-members.html | 93 + ...penSPICE_1_1netlist_1_1VSourceTextFmt.html | 158 + ...OpenSPICE_1_1netlist_1_1VSourceTextFmt.png | Bin 0 -> 1451 bytes ..._1solve_1_1OpPtSolverStrategy-members.html | 93 + ...nSPICE_1_1solve_1_1OpPtSolverStrategy.html | 187 ++ ...enSPICE_1_1solve_1_1OpPtSolverStrategy.png | Bin 0 -> 1514 bytes ...CE_1_1solve_1_1SolverStrategy-members.html | 90 + ...1OpenSPICE_1_1solve_1_1SolverStrategy.html | 136 + ..._1OpenSPICE_1_1solve_1_1SolverStrategy.png | Bin 0 -> 2175 bytes ...ve_1_1TransientSolverStrategy-members.html | 94 + ...E_1_1solve_1_1TransientSolverStrategy.html | 196 ++ ...CE_1_1solve_1_1TransientSolverStrategy.png | Bin 0 -> 1561 bytes PySpice/Spice/OpenSPICE/html/classes.html | 115 + PySpice/Spice/OpenSPICE/html/closed.png | Bin 0 -> 132 bytes PySpice/Spice/OpenSPICE/html/doc.png | Bin 0 -> 746 bytes PySpice/Spice/OpenSPICE/html/docd.png | Bin 0 -> 756 bytes PySpice/Spice/OpenSPICE/html/doxygen.css | 1973 ++++++++++++ PySpice/Spice/OpenSPICE/html/doxygen.svg | 26 + PySpice/Spice/OpenSPICE/html/dynsections.js | 123 + PySpice/Spice/OpenSPICE/html/folderclosed.png | Bin 0 -> 616 bytes PySpice/Spice/OpenSPICE/html/folderopen.png | Bin 0 -> 597 bytes PySpice/Spice/OpenSPICE/html/functions.html | 189 ++ .../Spice/OpenSPICE/html/functions_func.html | 189 ++ PySpice/Spice/OpenSPICE/html/hierarchy.html | 127 + PySpice/Spice/OpenSPICE/html/index.html | 82 + PySpice/Spice/OpenSPICE/html/jquery.js | 34 + PySpice/Spice/OpenSPICE/html/menu.js | 136 + PySpice/Spice/OpenSPICE/html/menudata.js | 65 + PySpice/Spice/OpenSPICE/html/nav_f.png | Bin 0 -> 153 bytes PySpice/Spice/OpenSPICE/html/nav_fd.png | Bin 0 -> 169 bytes PySpice/Spice/OpenSPICE/html/nav_g.png | Bin 0 -> 95 bytes PySpice/Spice/OpenSPICE/html/nav_h.png | Bin 0 -> 98 bytes PySpice/Spice/OpenSPICE/html/nav_hd.png | Bin 0 -> 114 bytes PySpice/Spice/OpenSPICE/html/open.png | Bin 0 -> 123 bytes PySpice/Spice/OpenSPICE/html/search/all_0.js | 5 + PySpice/Spice/OpenSPICE/html/search/all_1.js | 5 + PySpice/Spice/OpenSPICE/html/search/all_10.js | 8 + PySpice/Spice/OpenSPICE/html/search/all_11.js | 4 + PySpice/Spice/OpenSPICE/html/search/all_12.js | 9 + PySpice/Spice/OpenSPICE/html/search/all_13.js | 4 + PySpice/Spice/OpenSPICE/html/search/all_2.js | 5 + PySpice/Spice/OpenSPICE/html/search/all_3.js | 8 + PySpice/Spice/OpenSPICE/html/search/all_4.js | 6 + PySpice/Spice/OpenSPICE/html/search/all_5.js | 9 + PySpice/Spice/OpenSPICE/html/search/all_6.js | 4 + PySpice/Spice/OpenSPICE/html/search/all_7.js | 9 + PySpice/Spice/OpenSPICE/html/search/all_8.js | 6 + PySpice/Spice/OpenSPICE/html/search/all_9.js | 7 + PySpice/Spice/OpenSPICE/html/search/all_a.js | 5 + PySpice/Spice/OpenSPICE/html/search/all_b.js | 4 + PySpice/Spice/OpenSPICE/html/search/all_c.js | 11 + PySpice/Spice/OpenSPICE/html/search/all_d.js | 6 + PySpice/Spice/OpenSPICE/html/search/all_e.js | 11 + PySpice/Spice/OpenSPICE/html/search/all_f.js | 15 + .../Spice/OpenSPICE/html/search/classes_0.js | 5 + .../Spice/OpenSPICE/html/search/classes_1.js | 8 + .../Spice/OpenSPICE/html/search/classes_2.js | 8 + .../Spice/OpenSPICE/html/search/classes_3.js | 7 + .../Spice/OpenSPICE/html/search/classes_4.js | 9 + .../Spice/OpenSPICE/html/search/classes_5.js | 4 + .../Spice/OpenSPICE/html/search/classes_6.js | 6 + .../Spice/OpenSPICE/html/search/classes_7.js | 4 + .../Spice/OpenSPICE/html/search/classes_8.js | 5 + .../Spice/OpenSPICE/html/search/classes_9.js | 9 + PySpice/Spice/OpenSPICE/html/search/close.svg | 31 + .../OpenSPICE/html/search/functions_0.js | 5 + .../OpenSPICE/html/search/functions_1.js | 5 + .../OpenSPICE/html/search/functions_2.js | 6 + .../OpenSPICE/html/search/functions_3.js | 4 + .../OpenSPICE/html/search/functions_4.js | 4 + .../OpenSPICE/html/search/functions_5.js | 9 + .../OpenSPICE/html/search/functions_6.js | 6 + .../OpenSPICE/html/search/functions_7.js | 5 + .../OpenSPICE/html/search/functions_8.js | 4 + .../OpenSPICE/html/search/functions_9.js | 5 + .../OpenSPICE/html/search/functions_a.js | 5 + .../OpenSPICE/html/search/functions_b.js | 8 + .../OpenSPICE/html/search/functions_c.js | 14 + .../OpenSPICE/html/search/functions_d.js | 6 + .../OpenSPICE/html/search/functions_e.js | 4 + .../OpenSPICE/html/search/functions_f.js | 4 + PySpice/Spice/OpenSPICE/html/search/mag.svg | 37 + PySpice/Spice/OpenSPICE/html/search/mag_d.svg | 37 + .../Spice/OpenSPICE/html/search/mag_sel.svg | 74 + .../Spice/OpenSPICE/html/search/mag_seld.svg | 74 + .../Spice/OpenSPICE/html/search/search.css | 291 ++ PySpice/Spice/OpenSPICE/html/search/search.js | 816 +++++ .../Spice/OpenSPICE/html/search/searchdata.js | 21 + PySpice/Spice/OpenSPICE/html/splitbar.png | Bin 0 -> 314 bytes PySpice/Spice/OpenSPICE/html/splitbard.png | Bin 0 -> 282 bytes PySpice/Spice/OpenSPICE/html/sync_off.png | Bin 0 -> 853 bytes PySpice/Spice/OpenSPICE/html/sync_on.png | Bin 0 -> 845 bytes PySpice/Spice/OpenSPICE/html/tab_a.png | Bin 0 -> 142 bytes PySpice/Spice/OpenSPICE/html/tab_ad.png | Bin 0 -> 135 bytes PySpice/Spice/OpenSPICE/html/tab_b.png | Bin 0 -> 169 bytes PySpice/Spice/OpenSPICE/html/tab_bd.png | Bin 0 -> 173 bytes PySpice/Spice/OpenSPICE/html/tab_h.png | Bin 0 -> 177 bytes PySpice/Spice/OpenSPICE/html/tab_hd.png | Bin 0 -> 180 bytes PySpice/Spice/OpenSPICE/html/tab_s.png | Bin 0 -> 184 bytes PySpice/Spice/OpenSPICE/html/tab_sd.png | Bin 0 -> 188 bytes PySpice/Spice/OpenSPICE/html/tabs.css | 1 + PySpice/Spice/OpenSPICE/latex/Makefile | 27 + PySpice/Spice/OpenSPICE/latex/annotated.tex | 38 + ...ice_1_1OpenSPICE_1_1RawFile_1_1RawFile.eps | 197 ++ ...ice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf | Bin 0 -> 5729 bytes ...ice_1_1OpenSPICE_1_1RawFile_1_1RawFile.tex | 76 + ...ce_1_1OpenSPICE_1_1RawFile_1_1Variable.eps | 197 ++ ...ce_1_1OpenSPICE_1_1RawFile_1_1Variable.pdf | Bin 0 -> 5927 bytes ...ce_1_1OpenSPICE_1_1RawFile_1_1Variable.tex | 31 + ...OpenSPICE_1_1Server_1_1OpenSPICEServer.tex | 43 + ...ICE_1_1Shared_1_1OpenSPICECircuitError.eps | 197 ++ ...ICE_1_1Shared_1_1OpenSPICECircuitError.pdf | Bin 0 -> 6028 bytes ...ICE_1_1Shared_1_1OpenSPICECircuitError.tex | 13 + ...ICE_1_1Shared_1_1OpenSPICECommandError.eps | 197 ++ ...ICE_1_1Shared_1_1OpenSPICECommandError.pdf | Bin 0 -> 5843 bytes ...ICE_1_1Shared_1_1OpenSPICECommandError.tex | 13 + ...OpenSPICE_1_1Shared_1_1OpenSPICEShared.tex | 440 +++ ..._1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.eps | 197 ++ ..._1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf | Bin 0 -> 5714 bytes ..._1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.tex | 48 + ...Spice_1_1OpenSPICE_1_1Shared_1_1Vector.tex | 50 + ...imulation_1_1OpenSPICECircuitSimulator.eps | 197 ++ ...imulation_1_1OpenSPICECircuitSimulator.pdf | Bin 0 -> 5758 bytes ...imulation_1_1OpenSPICECircuitSimulator.tex | 28 + ..._1OpenSPICE_1_1components_1_1Capacitor.tex | 67 + ..._1OpenSPICE_1_1components_1_1Component.eps | 203 ++ ..._1OpenSPICE_1_1components_1_1Component.pdf | Bin 0 -> 6012 bytes ..._1OpenSPICE_1_1components_1_1Component.tex | 80 + ..._1_1OpenSPICE_1_1components_1_1ISource.tex | 60 + ...1_1OpenSPICE_1_1components_1_1Inductor.tex | 68 + ...1_1OpenSPICE_1_1components_1_1Resistor.eps | 203 ++ ...1_1OpenSPICE_1_1components_1_1Resistor.pdf | Bin 0 -> 6014 bytes ...1_1OpenSPICE_1_1components_1_1Resistor.tex | 72 + ..._1_1OpenSPICE_1_1components_1_1VSource.tex | 62 + ...nSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.eps | 203 ++ ...nSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf | Bin 0 -> 6120 bytes ...nSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.tex | 55 + ...1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.eps | 209 ++ ...1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.pdf | Bin 0 -> 6268 bytes ...1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.tex | 76 + ...E_1_1eqnstr_1_1EqnStrTransientStrategy.eps | 203 ++ ...E_1_1eqnstr_1_1EqnStrTransientStrategy.pdf | Bin 0 -> 6196 bytes ...E_1_1eqnstr_1_1EqnStrTransientStrategy.tex | 55 + ...PICE_1_1netlist_1_1BehavISourceTextFmt.eps | 203 ++ ...PICE_1_1netlist_1_1BehavISourceTextFmt.pdf | Bin 0 -> 6700 bytes ...PICE_1_1netlist_1_1BehavISourceTextFmt.tex | 49 + ...PICE_1_1netlist_1_1BehavVSourceTextFmt.eps | 203 ++ ...PICE_1_1netlist_1_1BehavVSourceTextFmt.pdf | Bin 0 -> 6806 bytes ...PICE_1_1netlist_1_1BehavVSourceTextFmt.tex | 49 + ...nSPICE_1_1netlist_1_1CCCSSourceTextFmt.eps | 203 ++ ...nSPICE_1_1netlist_1_1CCCSSourceTextFmt.pdf | Bin 0 -> 6323 bytes ...nSPICE_1_1netlist_1_1CCCSSourceTextFmt.tex | 55 + ...nSPICE_1_1netlist_1_1CCVSSourceTextFmt.eps | 203 ++ ...nSPICE_1_1netlist_1_1CCVSSourceTextFmt.pdf | Bin 0 -> 6414 bytes ...nSPICE_1_1netlist_1_1CCVSSourceTextFmt.tex | 55 + ...enSPICE_1_1netlist_1_1CapacitorTextFmt.eps | 203 ++ ...enSPICE_1_1netlist_1_1CapacitorTextFmt.pdf | Bin 0 -> 6382 bytes ...enSPICE_1_1netlist_1_1CapacitorTextFmt.tex | 49 + ...nSPICE_1_1netlist_1_1ExtISourceTextFmt.eps | 203 ++ ...nSPICE_1_1netlist_1_1ExtISourceTextFmt.pdf | Bin 0 -> 6320 bytes ...nSPICE_1_1netlist_1_1ExtISourceTextFmt.tex | 42 + ...nSPICE_1_1netlist_1_1ExtVSourceTextFmt.eps | 203 ++ ...nSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf | Bin 0 -> 6415 bytes ...nSPICE_1_1netlist_1_1ExtVSourceTextFmt.tex | 42 + ...OpenSPICE_1_1netlist_1_1ISourceTextFmt.eps | 203 ++ ...OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf | Bin 0 -> 6319 bytes ...OpenSPICE_1_1netlist_1_1ISourceTextFmt.tex | 49 + ...penSPICE_1_1netlist_1_1InductorTextFmt.eps | 203 ++ ...penSPICE_1_1netlist_1_1InductorTextFmt.pdf | Bin 0 -> 6446 bytes ...penSPICE_1_1netlist_1_1InductorTextFmt.tex | 49 + ...penSPICE_1_1netlist_1_1ResistorTextFmt.eps | 203 ++ ...penSPICE_1_1netlist_1_1ResistorTextFmt.pdf | Bin 0 -> 6330 bytes ...penSPICE_1_1netlist_1_1ResistorTextFmt.tex | 49 + ...ice_1_1OpenSPICE_1_1netlist_1_1TextFmt.eps | 253 ++ ...ice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf | Bin 0 -> 7686 bytes ...ice_1_1OpenSPICE_1_1netlist_1_1TextFmt.tex | 40 + ...nSPICE_1_1netlist_1_1VCCSSourceTextFmt.eps | 203 ++ ...nSPICE_1_1netlist_1_1VCCSSourceTextFmt.pdf | Bin 0 -> 6414 bytes ...nSPICE_1_1netlist_1_1VCCSSourceTextFmt.tex | 55 + ...nSPICE_1_1netlist_1_1VCVSSourceTextFmt.eps | 203 ++ ...nSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf | Bin 0 -> 6414 bytes ...nSPICE_1_1netlist_1_1VCVSSourceTextFmt.tex | 55 + ...OpenSPICE_1_1netlist_1_1VSourceTextFmt.eps | 203 ++ ...OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf | Bin 0 -> 6410 bytes ...OpenSPICE_1_1netlist_1_1VSourceTextFmt.tex | 52 + ...enSPICE_1_1solve_1_1OpPtSolverStrategy.eps | 203 ++ ...enSPICE_1_1solve_1_1OpPtSolverStrategy.pdf | Bin 0 -> 6252 bytes ...enSPICE_1_1solve_1_1OpPtSolverStrategy.tex | 66 + ..._1OpenSPICE_1_1solve_1_1SolverStrategy.eps | 209 ++ ..._1OpenSPICE_1_1solve_1_1SolverStrategy.pdf | Bin 0 -> 6420 bytes ..._1OpenSPICE_1_1solve_1_1SolverStrategy.tex | 42 + ...CE_1_1solve_1_1TransientSolverStrategy.eps | 203 ++ ...CE_1_1solve_1_1TransientSolverStrategy.pdf | Bin 0 -> 6330 bytes ...CE_1_1solve_1_1TransientSolverStrategy.tex | 69 + PySpice/Spice/OpenSPICE/latex/doxygen.sty | 596 ++++ PySpice/Spice/OpenSPICE/latex/hierarchy.tex | 58 + .../OpenSPICE/latex/longtable_doxygen.sty | 448 +++ PySpice/Spice/OpenSPICE/latex/refman.aux | 407 +++ PySpice/Spice/OpenSPICE/latex/refman.idx | 189 ++ PySpice/Spice/OpenSPICE/latex/refman.log | 1611 ++++++++++ PySpice/Spice/OpenSPICE/latex/refman.out | 182 ++ PySpice/Spice/OpenSPICE/latex/refman.tex | 227 ++ PySpice/Spice/OpenSPICE/latex/refman.toc | 183 ++ .../Spice/OpenSPICE/latex/tabu_doxygen.sty | 2557 ++++++++++++++++ PySpice/Spice/OpenSPICE/main.md | 9 + 294 files changed, 32038 insertions(+) create mode 100644 PySpice/Spice/OpenSPICE/Doxyfile create mode 100644 PySpice/Spice/OpenSPICE/html/annotated.html create mode 100644 PySpice/Spice/OpenSPICE/html/bc_s.png create mode 100644 PySpice/Spice/OpenSPICE/html/bc_sd.png create mode 100644 PySpice/Spice/OpenSPICE/html/bdwn.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.png create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy-members.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.html create mode 100644 PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.png create mode 100644 PySpice/Spice/OpenSPICE/html/classes.html create mode 100644 PySpice/Spice/OpenSPICE/html/closed.png create mode 100644 PySpice/Spice/OpenSPICE/html/doc.png create mode 100644 PySpice/Spice/OpenSPICE/html/docd.png create mode 100644 PySpice/Spice/OpenSPICE/html/doxygen.css create mode 100644 PySpice/Spice/OpenSPICE/html/doxygen.svg create mode 100644 PySpice/Spice/OpenSPICE/html/dynsections.js create mode 100644 PySpice/Spice/OpenSPICE/html/folderclosed.png create mode 100644 PySpice/Spice/OpenSPICE/html/folderopen.png create mode 100644 PySpice/Spice/OpenSPICE/html/functions.html create mode 100644 PySpice/Spice/OpenSPICE/html/functions_func.html create mode 100644 PySpice/Spice/OpenSPICE/html/hierarchy.html create mode 100644 PySpice/Spice/OpenSPICE/html/index.html create mode 100644 PySpice/Spice/OpenSPICE/html/jquery.js create mode 100644 PySpice/Spice/OpenSPICE/html/menu.js create mode 100644 PySpice/Spice/OpenSPICE/html/menudata.js create mode 100644 PySpice/Spice/OpenSPICE/html/nav_f.png create mode 100644 PySpice/Spice/OpenSPICE/html/nav_fd.png create mode 100644 PySpice/Spice/OpenSPICE/html/nav_g.png create mode 100644 PySpice/Spice/OpenSPICE/html/nav_h.png create mode 100644 PySpice/Spice/OpenSPICE/html/nav_hd.png create mode 100644 PySpice/Spice/OpenSPICE/html/open.png create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_0.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_1.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_10.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_11.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_12.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_13.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_2.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_3.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_4.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_5.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_6.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_7.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_8.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_9.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_a.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_b.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_c.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_d.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_e.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/all_f.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_0.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_1.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_2.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_3.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_4.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_5.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_6.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_7.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_8.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/classes_9.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/close.svg create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_0.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_1.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_2.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_3.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_4.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_5.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_6.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_7.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_8.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_9.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_a.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_b.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_c.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_d.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_e.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/functions_f.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/mag.svg create mode 100644 PySpice/Spice/OpenSPICE/html/search/mag_d.svg create mode 100644 PySpice/Spice/OpenSPICE/html/search/mag_sel.svg create mode 100644 PySpice/Spice/OpenSPICE/html/search/mag_seld.svg create mode 100644 PySpice/Spice/OpenSPICE/html/search/search.css create mode 100644 PySpice/Spice/OpenSPICE/html/search/search.js create mode 100644 PySpice/Spice/OpenSPICE/html/search/searchdata.js create mode 100644 PySpice/Spice/OpenSPICE/html/splitbar.png create mode 100644 PySpice/Spice/OpenSPICE/html/splitbard.png create mode 100644 PySpice/Spice/OpenSPICE/html/sync_off.png create mode 100644 PySpice/Spice/OpenSPICE/html/sync_on.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_a.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_ad.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_b.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_bd.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_h.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_hd.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_s.png create mode 100644 PySpice/Spice/OpenSPICE/html/tab_sd.png create mode 100644 PySpice/Spice/OpenSPICE/html/tabs.css create mode 100644 PySpice/Spice/OpenSPICE/latex/Makefile create mode 100644 PySpice/Spice/OpenSPICE/latex/annotated.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.eps create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.pdf create mode 100644 PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/doxygen.sty create mode 100644 PySpice/Spice/OpenSPICE/latex/hierarchy.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/longtable_doxygen.sty create mode 100644 PySpice/Spice/OpenSPICE/latex/refman.aux create mode 100644 PySpice/Spice/OpenSPICE/latex/refman.idx create mode 100644 PySpice/Spice/OpenSPICE/latex/refman.log create mode 100644 PySpice/Spice/OpenSPICE/latex/refman.out create mode 100644 PySpice/Spice/OpenSPICE/latex/refman.tex create mode 100644 PySpice/Spice/OpenSPICE/latex/refman.toc create mode 100644 PySpice/Spice/OpenSPICE/latex/tabu_doxygen.sty create mode 100644 PySpice/Spice/OpenSPICE/main.md diff --git a/PySpice/Spice/OpenSPICE/Doxyfile b/PySpice/Spice/OpenSPICE/Doxyfile new file mode 100644 index 00000000..26a12d3d --- /dev/null +++ b/PySpice/Spice/OpenSPICE/Doxyfile @@ -0,0 +1,2725 @@ +# Doxyfile 1.9.5 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "OpenSPICE" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Lightweight, Python-native electronic circuit simulator" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# numer of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = SYSTEM + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.l \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = main.md + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. Default setting AUTO_LIGHT +# enables light output unless the user preference is dark output. Other options +# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to +# default to dark mode unless the user prefers light mode, and TOGGLE to let the +# user toggle between dark and light mode via a button. +# Possible values are: LIGHT Always generate light output., DARK Always generate +# dark output., AUTO_LIGHT Automatically set the mode according to the user +# preference, use light mode if no preference is set (the default)., AUTO_DARK +# Automatically set the mode according to the user preference, use dark mode if +# no preference is set. and TOGGLE Allow to user to switch between light and +# dark mode via a button.. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /

+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12345]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NPySpice
 NSpice
 NOpenSPICE
 Ncomponents
 CCapacitor
 CComponent
 CInductor
 CISource
 CResistor
 CVSource
 Neqnstr
 CEqnStrOpPtStrategy
 CEqnStrStrategy
 CEqnStrTransientStrategy
 Nnetlist
 CBehavISourceTextFmt
 CBehavVSourceTextFmt
 CCapacitorTextFmt
 CCCCSSourceTextFmt
 CCCVSSourceTextFmt
 CExtISourceTextFmt
 CExtVSourceTextFmt
 CInductorTextFmt
 CISourceTextFmt
 CResistorTextFmt
 CTextFmt
 CVCCSSourceTextFmt
 CVCVSSourceTextFmt
 CVSourceTextFmt
 NRawFile
 CRawFile
 CVariable
 NServer
 COpenSPICEServer
 NShared
 COpenSPICECircuitError
 COpenSPICECommandError
 COpenSPICEShared
 CPlot
 CVector
 NSimulation
 COpenSPICECircuitSimulator
 Nsolve
 COpPtSolverStrategy
 CSolverStrategy
 CTransientSolverStrategy
+
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/bc_s.png b/PySpice/Spice/OpenSPICE/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/bc_sd.png b/PySpice/Spice/OpenSPICE/html/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/bdwn.png b/PySpice/Spice/OpenSPICE/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.RawFile.RawFile Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.html new file mode 100644 index 00000000..7c7402d9 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.html @@ -0,0 +1,169 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.RawFile.RawFile Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.RawFile.RawFile Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.RawFile.RawFile:
+
+
+ +
+ + + + + + +

+Public Member Functions

+def __init__ (self, output)
 
def fix_case (self)
 
+ + + + + + + + + + + + + +

+Public Attributes

title
 
date
 
plot_name
 
flags
 
number_of_variables
 
number_of_points
 
+

Detailed Description

+
 This class parse the stdout of ngspice and the raw data output.
+
+Public Attributes:
+
+  :attr:`data`
+
+  :attr:`date`
+
+  :attr:`flags`
+    'real' or 'complex'
+
+  :attr:`number_of_points`
+
+  :attr:`number_of_variables`
+
+  :attr:`plot_name`
+    AC Analysis, Operating Point, Sensitivity Analysis, DC transfer characteristic
+
+  :attr:`title`
+
+  :attr:`variables`

Member Function Documentation

+ +

◆ fix_case()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.RawFile.RawFile.fix_case ( self)
+
+
 Ngspice return lower case names. This method fixes the case of the variable names. 
+
+
+
The documentation for this class was generated from the following file:
    +
  • RawFile.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.png new file mode 100644 index 0000000000000000000000000000000000000000..253afc08a8812890f448ec8927dc0cdc5fe8a583 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0y~yVB`R@12~w0&+oV@L(#+qoBu-YD=m zKb?N+|No=g&$cOW$ZEr!OomylW=iar|?I`NSvxzpPbw z^~qhKDdq9DnJV!wZfCnp2+jV@;qT!qDTHz@Pgq%TPq3xt^LpcrbGrXt zyrBK~ucOJms~udAc(YsXNy$#QyH?Tq(c3)UNq^p&aWpGv8X<@dE+wTyd<;Jd>lqqy z1*F^gCmVE3Yxb02Y0yeG;9vl`oh;&quY!`&8xEJWWw`=u6K4X=={O^jt1#`yB?V#g=TaPNIQ|JSx~c9dQ_?LT)x z-R5FLrbWCr(~3AY4fU+mkagP zO{^EqKb0}DHn3K1Gy6u-)fXq6FKZFGl*WB3>UQCJ)h`Mu%Dv*2x7Yh8u^n}v@7I(O z_vwf9n=kq5GL05i|Je + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.RawFile.Variable Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.html new file mode 100644 index 00000000..9292d3d2 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.html @@ -0,0 +1,118 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.RawFile.Variable Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.RawFile.Variable Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.RawFile.Variable:
+
+
+ +
+ + + + + + + + +

+Public Member Functions

+def is_voltage_node (self)
 
+def is_branch_current (self)
 
+def simplified_name (self)
 
+ + + +

+Static Public Member Functions

+def to_voltage_name (node)
 
+
The documentation for this class was generated from the following file:
    +
  • RawFile.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.png new file mode 100644 index 0000000000000000000000000000000000000000..eb04c8bdb74bb3bf7710083d77dc90701efdea4b GIT binary patch literal 813 zcmeAS@N?(olHy`uVBq!ia0y~yVB`j}12~w0q~+EH4}g?(fKQ0)|NsAi%olIImi8Z7 zZegHVATj;SivtG^0L6nRU0wl{<17jC3uXZF!N8np_7w&OrX8Lxjv*C{Z|C0K)U3eM zVs3tS&wpY0)f$Qq{Pl0m+xU9NWu@+xeu=!qG_|whJt|9I3UO~#IH|KyfP2!JUmV@3 zT_%CK)9QWy7jSs)3%s9vF|hORwk>%llHx9Jve3?s5!-FD{Qv5OU&6(X#>-89^7~7q zSn0{n`I*dG{kvwetLTmv*1CvwpmJ?u$ns(vKG%?+f(Ux^v&P zyRTy-dCsV779TB6imHB`|M|@m-QCfKDHmt@M@-2Go9_FE31j z8=qAL{!ZF_Oyc?O2c4CM$EE_qZ)33jnZ5VU?hx!gqv{T{EbVs1g%!u-s(-!Qo@74j zlZL)iY;Kw9ht7>_Jtu$LF>{~n<&7Mg7IDwx9?4a(wQ6kB+msO(WcUA{G^cac#7uRW z)|$?vk-8QikF47MdF2vQ*?G#(-bFsH66~ME*!{R_;{A=`1>1MkoZUQYSFy@orFA=P zPP?YeRWN*ce&RESv&zq&eYD(E9PobL1^udZyYAfGzjU7K?SGkK$9>Dc`+YwP49xpe pB05@kR|8`TNM1W~=!{QQTs_Ymw`UjYJV6 + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Server.OpenSPICEServer Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.html new file mode 100644 index 00000000..53730c2f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.html @@ -0,0 +1,146 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Server.OpenSPICEServer Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.Server.OpenSPICEServer Class Reference
+
+
+ + + + + + +

+Public Member Functions

+def __init__ (self, **kwargs)
 
def __call__ (self, spice_input)
 
+ + + +

+Static Public Attributes

+string OpenSPICE_COMMAND = 'python3 -m OpenSPICE'
 
+

Detailed Description

+
This class wraps the execution of OpenSPICE and convert the output to a Python data structure.
+
+Example of usage::
+
+  spice_server = OpenSPICEServer()
+  raw_file = spice_server(spice_input)
+
+It returns a :obj:`PySpice.Spice.RawFile` instance.

Member Function Documentation

+ +

◆ __call__()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Server.OpenSPICEServer.__call__ ( self,
 spice_input 
)
+
+
Run SPICE in server mode as a subprocess for the given input and return a
+:obj:`PySpice.RawFile.RawFile` instance.
+
+
+
The documentation for this class was generated from the following file:
    +
  • Server.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.html new file mode 100644 index 00000000..c91510a1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.html @@ -0,0 +1,95 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError:
+
+
+ +
+
The documentation for this class was generated from the following file:
    +
  • Shared.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.png new file mode 100644 index 0000000000000000000000000000000000000000..42591e55e201fa7cb34563f13de664386ce2e181 GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0y~yV2lN_12~w0Wbgj4_drTIz$e7@|Ns9$=8HF9OZyKk zw=mEwkeGhv#eo9{fa1ZEF0TN}ah3%61v3EoU|`NP`w9aCv!|zvV@L(#+qtKU9$WFS z&YnHz^Z)po+(>>q5pQ8`W3Skdm5(R1@NDvIj`q@2)m%D-L1WSsk4sON#Cmoqz4Zzb z$qb*g$Yb{;k)wa#?0fe4@0z&j8&&Skm%cSu?aQ%sDu0FERg}#)o;Ab8|LydTJ7d}R z{nN27+P(G8^>?2>zKGz}Uv%C1-=EEI+f?p$Mqj&oHgV#sbh{N-730p{+mv?abJ*wlh^nrM5}yL$b*bId^Z z{By@}o$IZsOEfO6Q*oVGrmET1emBU=(@XPd6+@k1JOif#L#DVw$NKeGxCNYVv2r|8 zH2=!fGNFv|k;it1z$LK_8kh7OM1V@Vwr~r$-eT=gdduW8v5XPuZAzv8nC)IVWzv)& zF9wm@emTF3F0IRTpIDY_-L)nAHqhqVeMwubV++4JT)uO^$=EP4j ztY6yocXP65zu47!dl_H1WzWog8|7Btd%0;l_Z|PO&t~>tSiRcoTjsfCi%)I3RcW?* zL3q6Ndh@d9nZEM3d0x%66Axayg*Wow-2IOZyql3#TYY+G&P!Iy=-r1;{o1~3MXp-y z-MeSD%np6Mit9w6Pi@~f^9Ac0eLt=_6=l9VSM`0_m*tkbH{Vu&`|4ek+pZVy-t-+! zH@SYl?tSvHsd<<0d;WZTQ?@R$)bQ254^4BPzu|NJb>Ur%@iC)2$NxH>@pD`st^VfS z9j^N_PqT~u>F#zn{i?9+)E@Con=gI*XSeP4wY%CyeAfdeKYdO-lNiAx;?TYxBQ1;eej>0-H(0F+|;eq*p?j`ha3{hqtG$-3U!`WBdypz#DxN&lGR Xy4ET;JW|O9<}?ORS3j3^P6 + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError:
+
+
+ +
+
The documentation for this class was generated from the following file:
    +
  • Shared.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.png new file mode 100644 index 0000000000000000000000000000000000000000..604eb33e4dec20129a3930b9c111557838dbc17d GIT binary patch literal 992 zcmeAS@N?(olHy`uVBq!ia0y~yV9W=y12~w0CO&c=ry-R$i=~z?T(OOpo_~A2ag~{PtGa%o~IVqcn8Tn zjh^&L5Tuebl+{ryXQeO@j9Sj+pYP`cv( z#x)n8*Ig0+5m$FNZ_PRJudnS7z3E*Nd?e(AA z+Ew0NS9-_f(x6Wo8YomgDM`~;`~=vxM$Q4Kby%qf+Qe{HR_ zsH4N9al_j~+k`dlZ=37>bK6^>qjR4J?#s3AzxutTVjKUihaVTs>6C2BDZl=wzpaj{p{XkR^NnV$b_XZm~X+DFy%(td5ddgWbPvEkY6-xW{K|16?k^FDZOe!k^& z*L@1<<&Xcp$|?Dqd}hO$eN%6TY`<#u?fuzM>pRb0?S653M%j8<{gXGmcdOkoIlOS! zTkm;mKkk2a=jXP?`}>T)q#rs^SO0$YjeAck*4g#n4Bu9J!SPi4@9OXOuW#Fsc!;}b z-iNzqcSdi&yzjZ+=KSZ$cjAx8Ou5qM_ruO2RxamzcG13XwLjJuH@*+w`_t8D^3TAz zhqu3fH}}Kc@9(vX + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, ngspice_id=0, send_data=False, verbose=False)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
alter_device(self, device, **kwargs)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
alter_model(self, model, **kwargs)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
clear_output(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
delete(self, debug_number)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
destroy(self, plot_name='all')PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
device_help(self, device)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
exec_command(self, command, join_lines=True)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
get_isrc_data(self, current, time, node, ngspice_id)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
get_vsrc_data(self, voltage, time, node, ngspice_id)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
halt(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
has_cider(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
has_xspice(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
is_running(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
last_plot(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
library_path(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
LIBRARY_PATH (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICESharedstatic
listing(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
load_circuit(self, circuit)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
MAX_COMMAND_LENGTH (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICESharedstatic
new_instance(cls, ngspice_id=0, send_data=False, verbose=False)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
NGSPICE_PATH (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICESharedstatic
ngspice_version(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
NUMBER_OF_EXEC_CALLS_TO_RELEASE_MEMORY (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICESharedstatic
option(self, **kwargs)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
plot(self, simulation, plot_name)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
plot_names(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
quit(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
remove_circuit(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
reset(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
ressource_usage(self, *ressources)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
resume(self, background=True)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
run(self, background=False)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
save(self, vector) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
send_char(self, message, ngspice_id)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
send_data(self, actual_vector_values, number_of_vectors, ngspice_id)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
send_init_data(self, data, ngspice_id)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
send_stat(self, message, ngspice_id)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
set(self, *args, **kwargs)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
set_circuit(self, name)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
setup_platform(cls) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
show(self, device) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
showmod(self, device) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
simulation_type(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
source(self, file_path)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
spinit_not_found(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
status(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
stderr(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
stdout(self) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
step(self, number_of_steps=None)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
stop(self, *args, **kwargs)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
trace(self, *args)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
type_to_unit(self, vector_type) (defined in PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
unset(self, *args)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
where(self)PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html new file mode 100644 index 00000000..011c7100 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html @@ -0,0 +1,1315 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+def setup_platform (cls)
 
def new_instance (cls, ngspice_id=0, send_data=False, verbose=False)
 
def __init__ (self, ngspice_id=0, send_data=False, verbose=False)
 
+def spinit_not_found (self)
 
+def library_path (self)
 
def send_char (self, message, ngspice_id)
 
def send_stat (self, message, ngspice_id)
 
def send_data (self, actual_vector_values, number_of_vectors, ngspice_id)
 
def send_init_data (self, data, ngspice_id)
 
def get_vsrc_data (self, voltage, time, node, ngspice_id)
 
def get_isrc_data (self, current, time, node, ngspice_id)
 
+def is_running (self)
 
+def clear_output (self)
 
+def stdout (self)
 
+def stderr (self)
 
def exec_command (self, command, join_lines=True)
 
+def ngspice_version (self)
 
def has_xspice (self)
 
def has_cider (self)
 
+def simulation_type (self)
 
+def type_to_unit (self, vector_type)
 
def alter_device (self, device, **kwargs)
 
def alter_model (self, model, **kwargs)
 
def delete (self, debug_number)
 
def destroy (self, plot_name='all')
 
def device_help (self, device)
 
+def save (self, vector)
 
+def show (self, device)
 
+def showmod (self, device)
 
def source (self, file_path)
 
def option (self, **kwargs)
 
+def quit (self)
 
def remove_circuit (self)
 
def reset (self)
 
def ressource_usage (self, *ressources)
 
def set (self, *args, **kwargs)
 
def set_circuit (self, name)
 
def status (self)
 
def step (self, number_of_steps=None)
 
def stop (self, *args, **kwargs)
 
def trace (self, *args)
 
def unset (self, *args)
 
def where (self)
 
def load_circuit (self, circuit)
 
+def listing (self)
 
def run (self, background=False)
 
def halt (self)
 
def resume (self, background=True)
 
def plot_names (self)
 
def last_plot (self)
 
def plot (self, simulation, plot_name)
 
+ + + + + + + + + +

+Static Public Attributes

NGSPICE_PATH = None
 
LIBRARY_PATH = None
 
+int MAX_COMMAND_LENGTH = 1023
 
+int NUMBER_OF_EXEC_CALLS_TO_RELEASE_MEMORY = 10_000
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.__init__ ( self,
 ngspice_id = 0,
 send_data = False,
 verbose = False 
)
+
+
 Set the *send_data* flag if you want to enable the output callback.
+
+Set the *ngspice_id* to an integer value if you want to run OpenSPICE in parallel.
+
+
+
+

Member Function Documentation

+ +

◆ alter_device()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.alter_device ( self,
 device,
** kwargs 
)
+
+
Alter device parameters
+
+
+ +

◆ alter_model()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.alter_model ( self,
 model,
** kwargs 
)
+
+
Alter model parameters
+
+
+ +

◆ delete()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.delete ( self,
 debug_number 
)
+
+
Remove a trace or breakpoint
+
+
+ +

◆ destroy()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.destroy ( self,
 plot_name = 'all' 
)
+
+
Release the memory holding the output data (the given plot or all plots) for the specified runs.
+
+
+ +

◆ device_help()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.device_help ( self,
 device 
)
+
+
Shows the user information about the devices available in the simulator. 
+
+
+ +

◆ exec_command()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.exec_command ( self,
 command,
 join_lines = True 
)
+
+
 Execute a command and return the output. 
+
+
+ +

◆ get_isrc_data()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.get_isrc_data ( self,
 current,
 time,
 node,
 ngspice_id 
)
+
+
 Reimplement this callback in a subclass to provide external current source. 
+
+
+ +

◆ get_vsrc_data()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.get_vsrc_data ( self,
 voltage,
 time,
 node,
 ngspice_id 
)
+
+
 Reimplement this callback in a subclass to provide external voltage source. 
+
+
+ +

◆ halt()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.halt ( self)
+
+
 Halt the simulation in the background thread. 
+
+
+ +

◆ has_cider()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.has_cider ( self)
+
+
Return True if libngspice was compiled with CIDER support.
+
+
+ +

◆ has_xspice()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.has_xspice ( self)
+
+
Return True if libngspice was compiled with XSpice support.
+
+
+ +

◆ last_plot()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.last_plot ( self)
+
+
 Return the last plot name. 
+
+
+ +

◆ load_circuit()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.load_circuit ( self,
 circuit 
)
+
+
Load the given circuit string.
+
+
+ +

◆ new_instance()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.new_instance ( cls,
 ngspice_id = 0,
 send_data = False,
 verbose = False 
)
+
+
Create an OpenSPICEShared instance
+
+
+ +

◆ option()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.option ( self,
** kwargs 
)
+
+
Set any of the simulator variables.
+
+
+ +

◆ plot()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.plot ( self,
 simulation,
 plot_name 
)
+
+
 Return the corresponding plot. 
+
+
+ +

◆ plot_names()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.plot_names ( self)
+
+
 Return the list of plot names. 
+
+
+ +

◆ remove_circuit()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.remove_circuit ( self)
+
+
Removes the current circuit from the list of circuits sourced into ngspice.
+
+
+ +

◆ reset()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.reset ( self)
+
+
Throw out any intermediate data in the circuit (e.g, after a breakpoint or after one or more
+analyses have been done already), and re-parse the input file. The circuit can then be
+re-run from it’s initial state, overriding the affect of any set or alter commands.
+
+
+ +

◆ ressource_usage()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.ressource_usage ( self,
ressources 
)
+
+
Print resource usage statistics. If any resources are given, just print the usage of that resource.
+
+Most resources require that a circuit be loaded. Currently valid resources are:
+
+* decklineno    Number of lines in deck
+* netloadtime   Nelist loading time
+* netparsetime  Netlist parsing time
+* elapsed       The amount of time elapsed since the last rusage elapsed call.
+* faults        Number of page faults and context switches (BSD only).
+* space         Data space used.
+* time          CPU time used so far.
+* temp          Operating temperature.
+* tnom          Temperature at which device parameters were measured.
+* equations     Circuit Equations
+* time Total    Analysis Time
+* totiter       Total iterations
+* accept        Accepted time-points
+* rejected      Rejected time-points
+* loadtime      Time spent loading the circuit matrix and RHS.
+* reordertime   Matrix reordering time
+* lutime        L-U decomposition time
+* solvetime     Matrix solve time
+* trantime      Transient analysis time
+* tranpoints    Transient time-points
+* traniter      Transient iterations
+* trancuriters  Transient iterations for the last time point*
+* tranlutime    Transient L-U decomposition time
+* transolvetime Transient matrix solve time
+* everything    All of the above.
+
+
+
+ +

◆ resume()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.resume ( self,
 background = True 
)
+
+
 Halt the simulation in the background thread. 
+
+
+ +

◆ run()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.run ( self,
 background = False 
)
+
+
 Run the simulation. 
+
+
+ +

◆ send_char()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.send_char ( self,
 message,
 ngspice_id 
)
+
+
 Reimplement this callback in a subclass to process logging messages from the simulator. 
+
+
+ +

◆ send_data()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.send_data ( self,
 actual_vector_values,
 number_of_vectors,
 ngspice_id 
)
+
+
 Reimplement this callback in a subclass to process the vector actual values. 
+
+
+ +

◆ send_init_data()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.send_init_data ( self,
 data,
 ngspice_id 
)
+
+
 Reimplement this callback in a subclass to process the initial data. 
+
+
+ +

◆ send_stat()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.send_stat ( self,
 message,
 ngspice_id 
)
+
+
 Reimplement this callback in a subclass to process statistic messages from the simulator. 
+
+
+ +

◆ set()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.set ( self,
args,
** kwargs 
)
+
+
Set the value of variables
+
+
+ +

◆ set_circuit()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.set_circuit ( self,
 name 
)
+
+
Change the current circuit
+
+
+ +

◆ source()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.source ( self,
 file_path 
)
+
+
Read a ngspice input file
+
+
+ +

◆ status()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.status ( self)
+
+
Display breakpoint information
+
+
+ +

◆ step()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.step ( self,
 number_of_steps = None 
)
+
+
Run a fixed number of time-points
+
+
+ +

◆ stop()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.stop ( self,
args,
** kwargs 
)
+
+
Set a breakpoint.
+
+Examples::
+
+    ngspice.stop('v(out) > 1', 'v(1) > 10', after=10)
+
+A when condition can use theses symbols: = <> > < >= <=.
+
+
+ +

◆ trace()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.trace ( self,
args 
)
+
+
Trace nodes
+
+
+ +

◆ unset()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.unset ( self,
args 
)
+
+
Unset variables
+
+
+ +

◆ where()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.where ( self)
+
+
Identify troublesome node or device
+
+
+
The documentation for this class was generated from the following file:
    +
  • Shared.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot-members.html new file mode 100644 index 00000000..b3bfd0db --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot-members.html @@ -0,0 +1,96 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Shared.Plot Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.Shared.Plot, including all inherited members.

+ + + + + + + + +
__init__(self, simulation, plot_name) (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
branches(self, to_float=False, abscissa=None) (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
elements(self, abscissa=None) (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
internal_parameters(self, to_float=False, abscissa=None) (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
nodes(self, to_float=False, abscissa=None) (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
plot_name (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
to_analysis(self) (defined in PySpice.Spice.OpenSPICE.Shared.Plot)PySpice.Spice.OpenSPICE.Shared.Plot
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.html new file mode 100644 index 00000000..ea6d29cf --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.html @@ -0,0 +1,132 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Shared.Plot Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.Shared.Plot Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.Shared.Plot:
+
+
+ +
+ + + + + + + + + + + + + + +

+Public Member Functions

+def __init__ (self, simulation, plot_name)
 
+def nodes (self, to_float=False, abscissa=None)
 
+def branches (self, to_float=False, abscissa=None)
 
+def internal_parameters (self, to_float=False, abscissa=None)
 
+def elements (self, abscissa=None)
 
+def to_analysis (self)
 
+ + + +

+Public Attributes

plot_name
 
+

Detailed Description

+
 This class implements a plot in a simulation output.
+
+Public Attributes:
+
+  :attr:`plot_name`

The documentation for this class was generated from the following file:
    +
  • Shared.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca8b48d2c56833d96222ef1025adb22fda179ad GIT binary patch literal 684 zcmV;d0#p5oP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0006v zNklO*@Fj?ypyM8Q`+C`^0T-7A<0L0Sa$WxH@UgcBzZH>%WjI> zwjoQBcM!59c@I<7tnJ3DI!Qjl3%|1@`3@mVk{$_JlJrQ(lB7pwlT9h5NdSNs_yE8x z%q08yOk_Kg?BY6)?NqYSjRC+XAqxN=30VN}NXPzLKXn-C8d;R0ZEePAY>)UBOxnE9?7z6x2gx4$8kok#F!vS z&1W0kcV8px@Aj$nxFiiRDkXRy$g=Hu&7&lBT!}de+DGgE&3B_XNg85Q&Skglaz>Xt zZKGS7t88D7Sy!ybsySx&e8f(+Ow0SM6ZWr0vg_b}oFmz7(e+56cl;C8W*Y{_Sx+g`*r zvhOjy?C+Sl!w0)dsy@vttt-bYXcqe-`&$Qt61H*w5Hs4hZ%p502OZ_$MgK|mtR7Ed zN;ft&dnkL_jR&%Wn!P5QOUZW4w$nD3=}S!howeP#yN`B8u339;w?%TUnr>_}w=LDm z_HBM#IFe+z5_2_5l5V4yZJ&M1et(ptj{o@0N|IATR+2mtvXbPHMK-0BCgBG#Y9k%w Spe^M90000 + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Shared.Vector Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.Shared.Vector, including all inherited members.

+ + + + + + + + +
__init__(self, ngspice_shared, name, type_, data) (defined in PySpice.Spice.OpenSPICE.Shared.Vector)PySpice.Spice.OpenSPICE.Shared.Vector
__repr__(self) (defined in PySpice.Spice.OpenSPICE.Shared.Vector)PySpice.Spice.OpenSPICE.Shared.Vector
is_branch_current(self) (defined in PySpice.Spice.OpenSPICE.Shared.Vector)PySpice.Spice.OpenSPICE.Shared.Vector
is_interval_parameter(self) (defined in PySpice.Spice.OpenSPICE.Shared.Vector)PySpice.Spice.OpenSPICE.Shared.Vector
is_voltage_node(self) (defined in PySpice.Spice.OpenSPICE.Shared.Vector)PySpice.Spice.OpenSPICE.Shared.Vector
simplified_name(self) (defined in PySpice.Spice.OpenSPICE.Shared.Vector)PySpice.Spice.OpenSPICE.Shared.Vector
to_waveform(self, abscissa=None, to_real=False, to_float=False)PySpice.Spice.OpenSPICE.Shared.Vector
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.html new file mode 100644 index 00000000..3bd433ff --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.html @@ -0,0 +1,164 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Shared.Vector Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.Shared.Vector Class Reference
+
+
+ + + + + + + + + + + + + + + + +

+Public Member Functions

+def __init__ (self, ngspice_shared, name, type_, data)
 
+def __repr__ (self)
 
+def is_interval_parameter (self)
 
+def is_voltage_node (self)
 
+def is_branch_current (self)
 
+def simplified_name (self)
 
def to_waveform (self, abscissa=None, to_real=False, to_float=False)
 
+

Detailed Description

+
 This class implements a vector in a simulation output.
+
+Public Attributes:
+
+  :attr:`data`
+
+  :attr:`name`

Member Function Documentation

+ +

◆ to_waveform()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.Shared.Vector.to_waveform ( self,
 abscissa = None,
 to_real = False,
 to_float = False 
)
+
+
 Return a :obj:`PySpice.Probe.WaveForm` instance. 
+
+
+
The documentation for this class was generated from the following file:
    +
  • Shared.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator-members.html new file mode 100644 index 00000000..ee9126f1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator-members.html @@ -0,0 +1,92 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.html new file mode 100644 index 00000000..8c3ae3b6 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.html @@ -0,0 +1,115 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator:
+
+
+ +
+ + + + + + +

+Public Member Functions

+def __init__ (self, circuit, **kwargs)
 
+def str_options (self)
 
+ + + +

+Static Public Attributes

+string SIMULATOR = 'OpenSPICE'
 
+
The documentation for this class was generated from the following file:
    +
  • Simulation.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.png new file mode 100644 index 0000000000000000000000000000000000000000..cff3eaa7596c7f266731d72a98782b884972336a GIT binary patch literal 1038 zcmeAS@N?(olHy`uVBq!ia0y~yU~C4m12~w0HDK{3ysIodD%yUK5W?}9PmHtu;(YgKa)x~h;Cut&67Rh zYiL$AyGo^f-EL;1w$-*9-!`b&A68|5JyRy7R`$IsQ0CpM1#BXvCDHVr|MVTnZ6^faN?8N9qWPavEP8~ehd%E@hK_!xVVTheAxXH z7)T76Hy9a~eEOKk$uOZ)mcc=bpLH4oLnlx$C7GFFLN`!IuZ)3VCs5!?5<86qPTN0F zP&(w|vZQf>in6EYjYgHHN$iuRbjx}K>6IyX?#$s^#=L7?hTM18*v^+tDyG+ic5kzD zy_WiVb?M$Eue4nIYAE3aB5-}2t_$2FNcObr0DaK3#c( z&gY-MRoj;>jz7PUFKgG1X9m4rwyMm2xKftq_VI(ubUbCllh(O;UOHdcE~BzCwd8`` z?M9WqI?c`3`zM(suuu9@S@uoI(`eF{=^L0mPaWk`(G<6yuq5Vkv0&KM#Zvb;HgQu&X%Q~loCIG4p-n;++ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor-members.html new file mode 100644 index 00000000..cfffc813 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.components.Capacitor Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.components.Capacitor, including all inherited members.

+ + + +
op_pt_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Capacitorstatic
trans_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Capacitorstatic
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.html new file mode 100644 index 00000000..69fb258b --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.html @@ -0,0 +1,206 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.components.Capacitor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.components.Capacitor Class Reference
+
+
+ + + + + + +

+Static Public Member Functions

def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
+

Detailed Description

+
Class that represents a capacitor. Class contains
+methods for formatting equation strings for use in the final system
+of equations solved at each simulation timestep.
+

Member Function Documentation

+ +

◆ op_pt_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Capacitor.op_pt_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for capacitor.
+
+Equation format: ((x[branch current]) - (0.00))
+
+Note: At steady state, capacitors act as open circuits. Therefore,
+the current must be 0.00.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+ +

◆ trans_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Capacitor.trans_eqn ( branch,
 node 
)
+
+static
+
+
Generate transient equation for the capacitor.
+
+There are two cases. The first case is t = 0.00, the simulation start
+point. Here, the equation string is as follows:
+
+"(((x[node_plus index])-(x[node_minus index]))-(initial voltage))"
+
+This is the initial condition. The second case is t != 0.00, or the
+"else" case:
+
+"(((x[branch current])*dt)-((capacitance value)*
+    ((dv[node_plus index])-(dv[node_minus index]))))"
+
+This is a rearrangement of the differential equation I = CdV/dt -->
+Idt - CdV = 0.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • components.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component-members.html new file mode 100644 index 00000000..8f2cac42 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.components.Component Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.components.Component, including all inherited members.

+ + + +
op_pt_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Componentstatic
trans_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Componentstatic
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.html new file mode 100644 index 00000000..2be4da8b --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.html @@ -0,0 +1,218 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.components.Component Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.components.Component Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.components.Component:
+
+
+ + +PySpice.Spice.OpenSPICE.components.Resistor + +
+ + + + + + +

+Static Public Member Functions

def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
+

Detailed Description

+
Abstract class that represents an electrical component. Class contains
+methods for formatting equation strings for use in the final system
+of equations solved at each simulation timestep.
+

Member Function Documentation

+ +

◆ op_pt_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Component.op_pt_eqn ( branch,
 node 
)
+
+static
+
+
Return an equation string for the component. The equation string is
+the left hand side of f(x) = 0, where x is an array. The initial
+elements of the array are the node voltages. The latter portion of the
+array is a list of the branch currents in the circuit. A system of
+these equation strings is solved at each timestep so we can acquire the
+voltages and currents.
+
+f(x) usually represents the IV characteristic of a component.
+For instance, if g(I) = V for the component of interest,
+f(x) = g(I) - V = 0 is a valid equation string. It would usually be
+represented in the form g(I) - V. Similarly, h(V) = I -->
+f(x) = h(V) - I = 0 would also work. It is usually just some condition
+that must hold by definition for this component.
+
+As of now, only components with two terminals are considered.
+
+op_pt_eqn in particular focuses only on operating point simulations.
+So, users are advised to avoid using any x_prev expressions.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented in PySpice.Spice.OpenSPICE.components.Resistor.

+ +
+
+ +

◆ trans_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Component.trans_eqn ( branch,
 node 
)
+
+static
+
+
Same as op_pt_eqn except for transient simulations. Feel free
+to use x_prev in these.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented in PySpice.Spice.OpenSPICE.components.Resistor.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • components.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.png new file mode 100644 index 0000000000000000000000000000000000000000..643b32c7ce54979ff3844ad35f05521557657851 GIT binary patch literal 1435 zcmeAS@N?(olHy`uVBq!ia0y~yU^D=-J2;quWcX?KTp%SK;1lBd|Nnm=^TnI5rTvGN zTNr2-NK8NT;=q9eK=I&7msbGgI7@>3f*F8(FfeDDeT9L6Rn61IF{Fa=?c9fbtF3t0 z)ZJG7{pVk^J9dF5hw8n%+KO}EcUXFN6&_M4{1@bl2O?=CP;e0uxFzx%tNzN=%-(|c3*^-j8GAOw_T;$)^kvLHHf=@ca|%~U=wmzIu> z8IFgPl!QDYTwItqyE}m93JP+TC9W4%P9c_FH??zqi*f-&Flk zdFt$Cy)|d=nJO#sojDT2lI#C^|Ji&&!TpQQ8ks)n=ul2SbWJhe^K`M_wdJqx>{+fM z`1w?X{px!!tM1z`|G7@>!;cc03 zq2e0fKQ%93Tb-=T*gM&5=jYBg(>H%NmTrE#dEScd8C9*lbH4!v0z-MTh3ETRxH*5_ zg+DeI3tPWB%bk3|-+tcEJ@NkeU4JVs{a)DMQ=5L-d27$*LwucXhxUE{x?suI!p<2N zU1Yoe&gZoLR-J@9%JlQEd!AdiF5mHNM%|PZVr3Ekn%!KEG|ZfF zb45o-E}5W5z2tzF%C?Jc(>Yz_E_Zs9j(N+` zGd?qBo>fRpO9Q6nGdhheGiRz!FfiWC;-2{Qb^P^pQE6%HX-T^jjI-e>p5I!>?75rn zbDXCu`R=dm#N%>q(VJdxxIHQDTFmD|>t0=U^@&YCZ?{g=%tqDy_M3>U=eDQpYMU8Z z3{2e9r~Na@_CJuD8hQ3g*}KbLh*2~7a&qMLXC literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource-members.html new file mode 100644 index 00000000..c79a4442 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.components.ISource Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.components.ISource, including all inherited members.

+ + + +
op_pt_eqn(branch, node)PySpice.Spice.OpenSPICE.components.ISourcestatic
trans_eqn(branch, node)PySpice.Spice.OpenSPICE.components.ISourcestatic
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.html new file mode 100644 index 00000000..e6c57030 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.html @@ -0,0 +1,199 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.components.ISource Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.components.ISource Class Reference
+
+
+ + + + + + +

+Static Public Member Functions

def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
+

Detailed Description

+
Class that represents a current source. Class contains
+methods for formatting equation strings for use in the final system
+of equations solved at each simulation timestep.
+

Member Function Documentation

+ +

◆ op_pt_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.ISource.op_pt_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for current source.
+
+Equation format: ((x[branch current]) - (current value))
+
+In other words, the branch current must be the source's current
+value.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+ +

◆ trans_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.ISource.trans_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for current source.
+
+Equation format: ((x[branch current]) - (current value))
+
+In other words, the branch current must be the source's current
+value.
+
+Note: Equation is the same as op point case.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • components.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor-members.html new file mode 100644 index 00000000..8146399a --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.components.Inductor Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.components.Inductor, including all inherited members.

+ + + +
op_pt_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Inductorstatic
trans_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Inductorstatic
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.html new file mode 100644 index 00000000..34cc60e8 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.html @@ -0,0 +1,207 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.components.Inductor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.components.Inductor Class Reference
+
+
+ + + + + + +

+Static Public Member Functions

def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
+

Detailed Description

+
Class that represents an inductor. Class contains
+methods for formatting equation strings for use in the final system
+of equations solved at each simulation timestep.
+

Member Function Documentation

+ +

◆ op_pt_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Inductor.op_pt_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for inductor.
+
+Equation format: (((x[node_plus index]) - (x[node_minus index])) -
+                   (0.00))
+
+Note: At steady state, inductors act as short circuits. Therefore,
+the branch voltage drop must be 0.00.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+ +

◆ trans_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Inductor.trans_eqn ( branch,
 node 
)
+
+static
+
+
Generate transient equation for the inductor.
+
+There are two cases. The first case is t = 0.00, the simulation start
+point. Here, the equation string is as follows:
+
+"((x[branch current])-(initial current value))"
+
+This is the initial condition. The second case is t != 0.00, or the
+"else" case:
+
+"((((x[node_plus index])-(x[node_minus index]))*dt)-
+   ((inductance value)*((di))))"
+
+This is a rearrangement of the differential equation V = Ldi/dt -->
+Vdt - Ldi = 0.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • components.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor-members.html new file mode 100644 index 00000000..858b6c8f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.components.Resistor Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.components.Resistor, including all inherited members.

+ + + +
op_pt_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Resistorstatic
trans_eqn(branch, node)PySpice.Spice.OpenSPICE.components.Resistorstatic
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.html new file mode 100644 index 00000000..ae5777d0 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.html @@ -0,0 +1,214 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.components.Resistor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.components.Resistor Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.components.Resistor:
+
+
+ + +PySpice.Spice.OpenSPICE.components.Component + +
+ + + + + + + + + + +

+Static Public Member Functions

def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
+

Detailed Description

+
Class that represents a resistor. Class contains
+methods for formatting equation strings for use in the final system
+of equations solved at each simulation timestep.
+

Member Function Documentation

+ +

◆ op_pt_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Resistor.op_pt_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for resistor.
+
+Equation format: ((x[node_plus voltage index] -
+                  (x[node_minus voltage index])) -
+                  ((x[branch current])*(resistance)))
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented from PySpice.Spice.OpenSPICE.components.Component.

+ +
+
+ +

◆ trans_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.Resistor.trans_eqn ( branch,
 node 
)
+
+static
+
+
Generate transient equation for resistor.
+
+Equation format: ((x[node_plus voltage index] -
+                  (x[node_minus voltage index])) -
+                  ((x[branch current])*(resistance)))
+
+Note: Equation is the same as op point case.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented from PySpice.Spice.OpenSPICE.components.Component.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • components.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.png new file mode 100644 index 0000000000000000000000000000000000000000..a5577d9dda3c65c6288eb247972e65b3aa7a30ab GIT binary patch literal 1432 zcmeAS@N?(olHy`uVBq!ia0y~yU^D=-J2;quWcX?KTp%SK;1lBd|Nnm=^TnI5rTvGN zTNr2-NK8NT;=q9eK=I&7msbGgI7@>3f*F8(FfeDDeT9L6RoT62~*n&(X49qxn5YxaGjvw^M_>1eZ=RVn2E}cE|4X3W@LDajKlT zYunhebGP~ggYxez{lecQ&;7Q$b^p%Y`G+pIOzq$JcmLui@BT5!>Ak6Ze)MolZnxK= zJ9pJ@w61lZ4%Ah@P;jZ}vv>cdeodMJ)Gz6GsKk5M?)YMk=V2`NT8QyFoVq`d0_Cgw=kah{8>4f;j)Ls0UP~z zBQ}HX7RDtL^cq-%*d{m}Vi59>aA4wO_E1P<;8fvJXl!9rnP5PPWWVS(ozqIwQX`)w z7#a(wr5St7m>J2$X>9DRkeHSR45l+W2ldwc`57L%<>)Ro@yo0;BR{X%8vXwLiC^3G zeb1hG_fqJO-P2od1g@pM?@CKkPfN;c+IH(#{^!{cm)_}=Y}d_`tUzyHoWvfuZM>y2wCt+$!){9Z2~ z%$e=H?YimF-VJ6SS6`g}TvuIj``&p@dyV`j54U>Dntn^}-&ab1e_ZtapZD{9n_n)BI+mHZ+(kKYeyy#= zrC*_QJ0yKVVt-vfbj~&=?_|lM>csNrmwnF^>X)(~Ub^9-uH~(?=ZBwFdGqOsYlqnu zTNi8O*hl@ky=E`t_Q}un(zvZ+ZDYHBHD9|wD|u`79$RtC*~PWoS#Fj+}9uIrHr2^F`;>t+=yqd(D`6^}J`q^^ikn*3_{@UpnJ6V`lFJ1LMssLTPE! z91fj1BLs?xrs*3}BgHoAoHk-Tp!}0jfT0+aFzoGt38NR3Rz9gFGi(N?39gq+)Jqen zN$o>K;?gNfUYe7&|uR@$8EO8(enEBoz-w)x%j zteRZ?|GVMT4Q46TvB7sZvW53c{jJn1n&;(y>GLWL!Mnly+0S^a?Y8M{s|~aMuD2{M zF?so4$uf@Besjz|9%YIByR!Xu%@e!Gv);d3?}ta&KbhF`ujq$dvDmkjufIKZegF5x zvldfZlh;eFEU#6r3cvEcW$o?q9TmIJ&*+ns=_`F1&u#tP;MSzr_Pf)1I-boGFDtjZ zd*sUVH&>5uJ=C`SNyhBC{%c?B&a^wMw5W0)$L;=U|ID)U59FraKbqsX+ y$~kx6pCl-#r1Z)iGdki9d1<;%2|6Y6pYh@GO)=aLZ07^ZPzFy|KbLh*2~7Z|e21L? literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource-members.html new file mode 100644 index 00000000..69418d3b --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.components.VSource Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.components.VSource, including all inherited members.

+ + + +
op_pt_eqn(branch, node)PySpice.Spice.OpenSPICE.components.VSourcestatic
trans_eqn(branch, node)PySpice.Spice.OpenSPICE.components.VSourcestatic
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.html new file mode 100644 index 00000000..4cab9e95 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.html @@ -0,0 +1,201 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.components.VSource Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.components.VSource Class Reference
+
+
+ + + + + + +

+Static Public Member Functions

def op_pt_eqn (branch, node)
 
def trans_eqn (branch, node)
 
+

Detailed Description

+
Class that represents a voltage source. Class contains
+methods for formatting equation strings for use in the final system
+of equations solved at each simulation timestep.
+

Member Function Documentation

+ +

◆ op_pt_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.VSource.op_pt_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for voltage source.
+
+Equation format: (((x[node_plus index]) - (x[node_minus index])) -
+                   (voltage value))
+
+In other words, the branch voltage drop must be the source's voltage
+value.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+ +

◆ trans_eqn()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.components.VSource.trans_eqn ( branch,
 node 
)
+
+static
+
+
Generate op point equation for voltage source.
+
+Equation format: (((x[node_plus index]) - (x[node_minus index])) -
+                   (voltage value))
+
+In other words, the branch voltage drop must be the source's voltage
+value.
+
+Note: Equation is the same as op point case.
+
+@param branch: Branch dictionary for the component's branch.
+@param node: List of node numbers.
+@return: Formatted equation string.
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • components.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy-members.html new file mode 100644 index 00000000..9ff2defb --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html new file mode 100644 index 00000000..c62527f3 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html @@ -0,0 +1,180 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy:
+
+
+ + +PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy + +
+ + + + + + + + + + + + + +

+Public Member Functions

def __init__ (self)
 
def gen_eqn_from_branch (self, _b, _n)
 
- Public Member Functions inherited from PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy
def gen_eqn_from_branch (self, _b, _n)
 
def gen_eqns (self, branch_dicts, nodes)
 
def gen_kcl_eqns (self, branch_dicts, nodes)
 
+

Detailed Description

+
Strategy class for operating point simulations.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy.__init__ ( self)
+
+
Empty initializer method.
+
+
+
+

Member Function Documentation

+ +

◆ gen_eqn_from_branch()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy.gen_eqn_from_branch ( self,
 _b,
 _n 
)
+
+
Generate formatted equation string for the given circuit branch.
+
+@param _b: Branch dictionary
+@param _n: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented from PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • eqnstr.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.png new file mode 100644 index 0000000000000000000000000000000000000000..ca466d7ae46f7260410904b3d2f61c2eddc3fe16 GIT binary patch literal 1564 zcmb`HYfw{16vr=t2#H0E1X13D1tl7RLJA^}AfY^L0t7-t5Q21)syxC|kP^L486I{B zVGs-tL4iUO2x&nO0lA_`rzB#H2pB9>1f&q48lDo84nyni1{c zx@=d+iScKg_J?fiii?V=zq#!b2=WAfnNq6-r!Qa|1V$D}fnbX-C=h6HLMK>Zi!SYN zsWcUVLu0J(icrVmX+!4E%`t188Ph(caMIhkxMWhE; z!%bbluxuKwxdm0>F*RsQ8;Y9rNrv-1o^X|JA%aHJtR>Qh0JxMu{5TZ={(C(TI__BD8$LPa1L}CmhMaUyx-f zde#^oiS%NdO(5xWA{vW96(YPzh*~0s2OLHW%tgu4@EBgfetU9ZZpiRv3SVV9yJ(uC zV41Eid2yfS2n{i(M)Z$yA31uHTtxROwD18c^^hBe=Y<0;E%6HW;k)Vt#0)-G*3?fh zUr4(jb+5}uIT%sJTv3ouMb-?SZ@xO``&u>JB*@VV4;5>*Db|NKSPR{ib?|uv@U@Z0 zrC6y*?#@j_%oR@6%QrwMZen;LKewmEb2BkEnv;Ks5EAFqTJ<6mJV=O*Ec;V9Q+jgK z*g0)%8p6>t2xppcV)usuTwG(=RD+xA+wcTNXEv{*ZN#KsiBOq!+MFGSczmAr-c-9j z2J2|hY)M;rc7WCfKPRc+(KJP3(XsKw0E}@^`6;7M#2dBdj1QI_^u8Arg?1fC*lQnd z5T7(5f};72$<^bp3LxD4Rxo^97oIIOj=Rygf4->W!O4{`|as9BvL_#GbQ#`E_6$7jvXnn#{4AG2g&U{ zYg?X#d6R0NEA@9`{79tx?_K)XI9DV^=4d5zB)0==r_2BpF zcXaV-|I<}zme4tUJIDN7tEI_wMdW}+8?qcTHR{KSa%3+w*nioGh2Yo=8{I)oN(SAK+flf3&tUj)m>`9pEvSmk3 zvUp9Ssqz{7_>R{Zq6RG9I=9(*^d$+ygB*&uac8F&^pYo5Bu>IS zVM@}D$-&I|n^JIr@U)0FBt$prDP=Y2Gogo$1zlbdK{ Zn|Dh4^^Y2A2EqS0;O9*tiH + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy, including all inherited members.

+ + + + +
gen_eqn_from_branch(self, _b, _n)PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy
gen_eqns(self, branch_dicts, nodes)PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy
gen_kcl_eqns(self, branch_dicts, nodes)PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html new file mode 100644 index 00000000..6cd5642d --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html @@ -0,0 +1,240 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy:
+
+
+ + +PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy +PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy + +
+ + + + + + + + +

+Public Member Functions

def gen_eqn_from_branch (self, _b, _n)
 
def gen_eqns (self, branch_dicts, nodes)
 
def gen_kcl_eqns (self, branch_dicts, nodes)
 
+

Detailed Description

+
Abstract class that represents a simulations strategy (e.g. operating
+point, transient, etc.). Class contains methods for generating
+equations for the given strategy.
+

Member Function Documentation

+ +

◆ gen_eqn_from_branch()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy.gen_eqn_from_branch ( self,
 _b,
 _n 
)
+
+
Generate formatted equation string for the given circuit branch.
+
+@param _b: Branch dictionary
+@param _n: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented in PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy, and PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy.

+ +
+
+ +

◆ gen_eqns()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy.gen_eqns ( self,
 branch_dicts,
 nodes 
)
+
+
Generate list of formatted equation strings. First portion of list is
+branch equations given by underlying Component classes. The second
+portion of list is KCL equations. KCL equations each represent all of
+the currents flowing into/out of a given node. So, there should be
+one KCL equation for each node and one branch equation for each branch.
+
+@param branch_dicts: List of branch dictionaries
+@param nodes: List of node numbers.
+@return: List of formatted equation strings.
+
+
+
+ +

◆ gen_kcl_eqns()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy.gen_kcl_eqns ( self,
 branch_dicts,
 nodes 
)
+
+
Generate list of formatted equation strings for KCL equations.
+
+@param branch_dicts: List of branch dictionaries
+@param nodes: List of node numbers.
+@return: List of formatted equation strings.
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • eqnstr.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.png new file mode 100644 index 0000000000000000000000000000000000000000..f76a7a6343f8589f2c25f2ef24f2118a244841d4 GIT binary patch literal 2246 zcmc&$YfzI{8va5-5roAXcwJGvR1lKvw;~MHB+xcQ3n6HAW6B2!MIc!SA^TDP?2qltPG@KK{5a=%pZEE3 z=Dg1{bG`}*I$>kA*$Myvo4^2nA^@1dD86m^5xV=>KB-2JEg`2#$4w>^3V)fL1Ml_J z9d_S$Wg|oKOLuoS%7+!m>e1e+zY>GO0JQ#X9WpB!0szayE3sTfU}qM+)Cop~4` zM{Y9p^`B3n=j1aZ7IOG**`=R+4~Oh}vms_b@nm3i;g5X4GRvJffX^#U>0HaUw#yrm z;?-h04DbS!D7E!JQ(^$|u6y`r#e$2v)Mpc_5vw^R_<&^<^rU%i%v3T&TkQB~w%i8FxR4>|7YETrW)SN)u&dcrO zq4Z0Ge^V{jA1~LRbavs@Uh7e4&n`(BU^s!8SUQYX-^Bj`DsbO!I`QO7Ge@8|U4*d& zFz&WQhhso~pJoq)G4Bouh(;-UC`IL#1#Dc!wsr)*^m}7wnf2{`7%+=*uU@8CFVidh zkpCYYJN9ogED(vVKwTe32tr*S2KT!_90kfQB;3t&g7n+s;#oVPCfz)8aG~P)`%y!h zQ2$Lr=ryIMcWH;nfLVV06st>Tq+g2+cd@vnJH;H82`LpBb`-%{t!pB50A|2I#dkC? zE={nq!!2|sThN%`Q$H`ekk)unmfzWUSNh}pqW)r=&Z8o;v>~#PB3@nGqf1@lFEOK% zlIS9X%d%m7&Om~<>=P5S&Z7pFuM+-ZJ|X~mq34);q<-wsqW6lOp5-AL7J+2tzFu@ENqfTS0GEC*K4V+&JB_D1Q1fk z%chj1=8h1dv*8vz;Yf6Nz3y<6w)xS~u6ey$m|nq{nxMWluxc){Sxp;kbd`hZcYjJ% zCQrvp&!{|GKW%)@>M>4xwOzeW9fqJON7U{3>5bR7BiMUWB3LwP!w*9RtXiF zJ(q#nsB*aqaHac3IgLxBXXrWd0}yvoo{@z<$zEGtOS_ZvOmg}mGdhsXWis8dqP6S zKsA>c0T5qG_7`yBaUQO}kIo!M145uP&lqlkn~cGfH0`7DjG>IY=83WV=RAmi0-{pG zd1v)e#Pks@BDqJU>g{z6_LO0P zo0m0&W%XyQZ{^Q4%?*yuyvt^8FeHGcc@hH~6@MnTFVQR5bWnpu2A+E7(q!bSG;&zZ zImUjUyi{A?u_GCygo7^nng{Rci4>Kcn61obl|LWR4cwWbhHH}KMkp*=t|U;QEuu9U z_pgza{Q_msoS^U!*@rL0sTRJ^v>kL4{E)}E=^bIi>v-Fje#o_5bfoi;+3Wgf^H-ZHn=bp@QhBzw z8&$1hS|=Io+95}hjxy&oG^fSmBe_U%%fyPGJn&(%H8oyG)?M}KFv><4n$F>sh%R2_ z@~Q>Ga&#||r5UzB4BlWL>L*tloxqo!I*y*n;@8*5J0*p8>dvKfQLZ=nai6mw5woB982`d2;)+o0sQ(!?#U& zCsI}<NMI zg?df$EF-AUc=azns4NVJ72U6>j~Wa@Si=IwsS;*{^cMW;K?8I6_@vC6BxIHj;aXyw zx_YVM+9tWNk|dRIV;Q>Xh6L&!i6lev?FX=A^v0q7_(2WA%CvWHpN` Yp%=KGC58(h{c!++$AkR2zA@SV0`K-dG5`Po literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy-members.html new file mode 100644 index 00000000..c30b157e --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.html new file mode 100644 index 00000000..e5bbaf82 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.html @@ -0,0 +1,180 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy:
+
+
+ + +PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy + +
+ + + + + + + + + + + + + +

+Public Member Functions

def __init__ (self)
 
def gen_eqn_from_branch (self, _b, _n)
 
- Public Member Functions inherited from PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy
def gen_eqn_from_branch (self, _b, _n)
 
def gen_eqns (self, branch_dicts, nodes)
 
def gen_kcl_eqns (self, branch_dicts, nodes)
 
+

Detailed Description

+
Strategy class for transient simulations.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy.__init__ ( self)
+
+
Empty initializer method.
+
+
+
+

Member Function Documentation

+ +

◆ gen_eqn_from_branch()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy.gen_eqn_from_branch ( self,
 _b,
 _n 
)
+
+
Generate formatted equation string for the given circuit branch.
+
+@param _b: Branch dictionary
+@param _n: List of node numbers.
+@return: Formatted equation string.
+
+

Reimplemented from PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • eqnstr.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.png new file mode 100644 index 0000000000000000000000000000000000000000..d5fa4f706ca1887dca3b62f435603b31c6ae3ca7 GIT binary patch literal 1610 zcmb_cX;70_6#W8H1L5KtCbLfK?77zt{`1_^=&uxzp~qZon+3Q|xE zIw+O^#uQD&u$4uq1~9Ui2q|uWfsi1P1cD^}bf%qY$A9hn@!om&zI*Syd(WJr&|qIJ z4I>Qz0JQx5P-p;vU_ngUqzdkr*Hi`IVH~=5zmHO>1mQd3a!P6UZRhV1i3UHj-*t6$ zf%dRVBfo$?^<;E#7y#ZsFDI3&qX3{b=8y8+e;TrIZ6f~7?ymt~htMTu=ZZtg_Avd( zjPVVQSlb=^f%Pu6SN;wYtcugepQCYU{w9+R4U{q7BdF8dkI;+ zwJnUCFwFYZ)eZD%B16IRrBZVdrrV^*jOQCke8*Ta29sU(T`I8|aR9RnF}l$jg~6D< z!cA>;05iIGn~lSxKSk79q!QJ|2_Qt8J_VobDTOssjXc0;Ewe9_MmJI8fGK<+!V+<- z!WXh)&;e-Y#rV^KVaf7k0>s3sPsMeZ`P@Ns(E*`nc4k!L8xOMDCbK@34P|(UiXR;S ze~<^DZ9D+bod?tWkM1ttB3xy(e`Rz8<*X0N0t!vP1hY2R_8{v*)y?|IB(SOvO69>8 zMw=of%1Ik)_&{ewt;kOjA&zfUqU0y6!um0@$gDZu%DoKeMI8}|*plWAy_oM}ukSg5 zQ|2ZGq25;f&_wbJsTG-JKj1ENq&w#3aZWuQRyj~fIcF*<>EW2{+8B`~%cWKC9LZQu zX{dhH!_Z)K<+SBA=8p5$T=by3Ud!;$UrhDM9yMN=H?U%8@j7-}TH$5AwA;4kiWbZF zwAjs(z^3i>hOE(?i?h8C$6MCsDv6>g@_Uz5QHPiwWcT6mT+`OO*&MN95H@`Jq$^*q zRK!(q2+!o+B3A-zzBU`Xl-NIXe(<9+uiSEL2m?;=j%7alXxA$z*FPJ2vE<3VnZCw> z)03j!7#sBznm8GTiXMOf+&1DL2a0PU}6ia*UaZ*RBNzW|JK74W^ za9zNstQ?AIBl8L-BmQuG<}QpGHJPw5Ihdao9&_(U+)L*p#ggJl!ChwW5Ns+i$9g8d zf;6zpN%E2R6BIv@th~-u_`$$7=;K+*%GVc&ta8%8md-debMqq7z)r*glttb@$F{gV zHKNioqB1%imRI^p(+qOD5~jK68W|a@_wp3lrc08Q8Po!Vl;a^@e$D?gr~XaYtO_nV zz&`*n9kGo-D5~a_-^3zY0CZDz1b`T4+vLGc5cE8B*OD%+8V@GMD}(pyA0rILw6mHO zIszK5L)tNOsxYLzuLkqU+!)=Kc3{$$Q6elP5LDCfwgn89LOFA#nujO>(^BmDcDZ%9 zbY-|uete>4Y5i9zlhLtcD=w+3J+Gi#9cez&NPK*!C=z+1epx<`M)sUra7odeEMN+P zykrLACp5A51sPKwgX2W+fw63tgZaj^-FKpDxQ@rx<|=APe4S3p^{Un3%HGa;H?|!; zU=hQ-H5ga(HgS5Tdj^j)=7o#U4zh&46}U^dS zbW4AhHT=s2q>TMev9Tu+iyOp@R@W!{R12RP@r##rgKiC$o*k+3mq_be@UxE|IXM(+ z&ElD3Ylm8l&bg<5Fm7I0IVi*^+ei(b*`;nU7q@~5lX=s5kcp{b!r!6}llhs#2JVY6 z`3TGHJ#*-^Zi`xL9TSmYDn-VX616usckM~L#wom?kF&0lR?Y~qNT=fV*>>@0_m%b5 zB6v<}d44tTjEj9*9h*JWT0Pq^&1Q>ESu)_a!Nv#5qms>~S;q;EW%z7~bG+K;QP-B? n2ic%%5eT4c{WbKz)o*n(TV2rB3`ZXYRUh#82}a%VI$H225=8v= literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt-members.html new file mode 100644 index 00000000..0b764787 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt-members.html @@ -0,0 +1,92 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.html new file mode 100644 index 00000000..046fd825 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + +

+Public Attributes

value
 
+

Detailed Description

+
BehavISource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..5307e8250c3a684fcfd562520a7ceea8fce7f47e GIT binary patch literal 1508 zcmb`HdsNbA7{^h|(rFIdOr{ItbTBu|1Sge=RuDr`3t8pzwnCicEpJ$OcNbk3Ff{y` z&T}&FNn{<=(9&87foNVrQ#2=Giu}CIn3}TR_RmiL_x$m`&*yoc=bY!f-{(B}NBzl` z=3kh@U@%L{w?rBYW<-Jfyv-)i8N#3Pf-bwGR65CEFhK6xnWbdT8jqfuz89#A^Hr0 zmb6lZ3;5M7KwcxUF-gR%5>q2Gv;0h+fs2dA;-kyAUcX@3HMKO=204iQ?-J z`p!`6SYojut4rPb95ptg^15a<>Zno~KE+Ofzh_e)h$9_%Ac&OQ60=P|42@8)(|+4o zS$GbXb|4I9{2Gll3#vT<9knx5~LFvv-gQHo%5GA8EAl7Dj{J3|_0+H(J*x9(6 zp0G%Zi5FkerXA*;i_$e@K2e89PMt%gR86|Fd7MO5FF`U&R|W?MOexf_gh!gzNj%OP zLl`4E`|OnVpgi0}K#nUO(SzgD+wxZ@F=4uFm(z8hDB_8`?<> zghTcnm)Z@@SEyPTuPP&l=TrY_t6iHg*2j5W$;f3 z_;xfJ8WA`gDPa(ardTArAe(xG$PkvaHkGdsarRn*b>Bu3F;O1LpV3QJn#L=eP$)95 z`4g`P3#5a75n{>geUHF4sXH5gIdAa)8L@%it?*b@o1t&+tE0o=E`#JN&-Y{ZdC3rA zv9sZ9{-SsqQI^*-c9(D>q%UH&`unm!&(G^SX;TNHsqV;^FV@$W@@MBlmKP^Ir4LTl zRflTc2J#Y-92)znwkx!gjv40qJVo->)_jTSmo<-TZtafHx27)-i}QC5+%3G{_TmMh zCCK)X?3Fsd_@e*S2>mLBlbW_w{Anow)Q4(gT-Dlo) zFYHzB(&f&?RM)r&CQo=d4qIq*t!UedgP(`-lg>28vB?;1;bGs2lzBI%&`4QOIhhh{V>P|CP|;164b^7*3UWG@q7d ZnT@Xp5G(HAp`d*XqmcZGf + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.html new file mode 100644 index 00000000..1d2673c1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + +

+Public Attributes

value
 
+

Detailed Description

+
BehavVSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..5acc817a6ae6088a4749049c7755ac3a7c451fb4 GIT binary patch literal 1519 zcmcJPYfO`86vrzlkrKv=+nBd1I7AGLF&q_v7nA}+5U{WyYUhHk6)Yl3fkIn0b!j`J zsK})tzKeoYxkZW>TI6OmFp8Zk1F^gEm$MdoJ|A_1lr2C(GnyU%BF^yL)J3WDj4~2dkL9LcHz!R2Y_0!sGEV@9b zp3?$4zV-H1E3RmvNHxr;68>US9_6G@Hxt~yc@MV z8m)J|_;jrLtkV&15S2YquzO3iCt`6ZPOlMzHsBYHMI?*bGTghgPiHp;^xj#p=>JZk}*#jpBE)> zE14`U_HwKbZ5E3)zDyN={hedAOQ|%^4yeU}>p|)YaN&17d>kIY*oV1is$^E8t~JkG zJRT%kH0)C}U7L;rUuI+N_7@~UsPO#$JVQ>EjQK@K=?}}n*+tzdZLBVhj!iRDVzzo` z(C2Mle9O$UUBOLlE$5VxHC&=P$PAy@i!09_0fIy$)>Exr5|CBDbdLYQO zZq{n(k{BLwB;?Myge0m9*?SczwJ@3T6usJFbf;s#YHxa+`&QmA=hp-ty`>|1L7Wzt zoaQ^0A-%dV^Q6PbIIp4GD=a{W3?~+EK3J!imGz4?fu;&cA*46QgHXE)mZ%|d(g2S; zUUr6F%T;-UBocxtHxr8khuQ7=CI$#U|a{tcsy3W8gq$7kHaHuVlXrfQ1)XQ<3{$g#zP1o zKG**N2x;=uMa`fQp6jSJyI)eA@#roA->wso@S@(z8o!+~$WjI$z>A`b;65}`TnJXb zVU9khoFp&dGN+o~d;uruzI*&9x8SJA(SVLgJ(SCBc1rvUukOJ-g2ow?`OL@2O`1d{S3>O# zuAk2j5+!+_f=c?-`xI(5<379wtT-7w4#w24l~|hqQ1#R=m|D3#Y#uV)G};!sK(!=u zO>-h$aadhYC?9JJGDpm0X0T-KW7tNxCUB}*jvcmhBFpZxiUOUCG)1CjaHZ0%_2xZW zQ{rz*OZSQgfY1W0d!De#C#%1*rfDw*1B$2kxkF^Ui0T5C*I_Wudh^k;I6RxpR%~3F g=er~RdsCS<1jIqF#=~=1$ZAF<#3tigcYSmE508)}<^TWy literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt-members.html new file mode 100644 index 00000000..1f9b1e9f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt-members.html @@ -0,0 +1,94 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.html new file mode 100644 index 00000000..2fd08dd5 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.html @@ -0,0 +1,161 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value, branch_plus, branch_minus)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + + + + + +

+Public Attributes

value
 
branch_plus
 
branch_minus
 
+

Detailed Description

+
CCCSSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..9f384b9ddcb0897a4b48ecc0763967553804c522 GIT binary patch literal 1479 zcmb_cdsLEl7)EoYnHknTJk~LXm9u@E=1j9Swd_M93l%cO>*fX1%$8B+g>=gl`&?!i zig?+fr5(*1~tP`&f-8Nzt6at=zFy?>S9#hsZ0`U<62OT(e!DO*=E=BR>y48NW17GW_f3MNh zUr@p+XUG_*W)Qar>de>{%LO`BfIp`6k~n-Gl@RfE_1@jZsOjE z|4?T=U?<%b=->)~NAHjti4I#?D2XK7iX&H6VF8JR`_G{;*e*zDBZ0Rz1s!%)t@`an zmWg?e8OQwEjKbf}B((><|2hjwG&}SOj7Xo^-~fZBamCmi(AaW@2zeIJZZ=%wMI+^3!r6RcYyY_T^RQSCOM3t~j z?zO85Uzh7nX`E$+eZ?4Audl`6zrb}V6F<(_;u;oFeeTKfz(W6g`GDrQ60{d4y1$L) z@Lv_-%9C3~#JS2c+{1?OU7=e}zI_V~{-h_ugQ-$_*?dXA&kms0ZRLGICmqETXOq=; zD3O>`3RP8qm2ly}!5@@)@`1QY6sw%4cjzx@ym<9z-_ymFLhsO<30}H9=6LSO`iw-& zGA7kb6_zYJ4#+rT9e2RabauZe7c6J$13qjUAnkVTL&Ib;DFrBvCv|hcJ{=;CG;<_U?ar}97GnWN zG^Zy9f&fw>ttU0~owJ+fQqA5F>h>DTE3{V=RZ6Y_8j&3pNIN5%Ql=a)^5?uA(e};3 zQrhiCmGc_^4&iZVw2)@Yw|TSeM0QxVy9^7hqgZQov2`zM4284{4{hDTpL@dMnc1gT zJyYLTJese5{H`$6yMBejEec;)7rigrAP#AF6Jye~HPY4_@^k$2b5Eigtq*A)>!evH z&V*~)MNul3u{UK;V>S~K`7te9yP)CGjj(RFh9VIx`8R3LdJm=LzbUPFDID4_NgkbO zPzD|8K+Ups_r~JdrWbVsnk*D}-aZpvbhsqENfd~f!rnR6sAq#uQLHbl;3_?2%#L2~ zqq7;GMRPnvXP!(2<(D_O&9pfIqpsdKI(5?0g`OMEi)!{5k^4KX;E@6@D!PruZsiV7CGD9myVZo+B-$6Y!90NT0B{v@c5-XJBd{gJXRFM z0teM%JL;zV*g7@&bz4Y5(n!8rhII<&yjzB7D}C4o>5{trRnjr2TNQiPBcK + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.html new file mode 100644 index 00000000..5cf622ae --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.html @@ -0,0 +1,161 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value, branch_plus, branch_minus)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + + + + + +

+Public Attributes

value
 
branch_plus
 
branch_minus
 
+

Detailed Description

+
CCVSSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..6aaa674a56da02f0a6628795c6332a5e79b6c501 GIT binary patch literal 1487 zcmcJPX;4#F6vu@M35vhEG7bmR8W#a5{wk0C`n(J>DbSm-VgVld;e$7nK}R8 z-2BjxAe(jgbvPW(CU_qy42QEIV=>3d65E3s)(Wu0A@o25*=#mrp+>vF;&#{i?jWYw zUzBR@+_{6jhnEgt!?d-TVIko-?EdHSS-~5@;a1UtNgqd?u+UY_GN*RGwK~Wv^!YOX z#g(ED+nkSgi%{aTcdNY$i1}OgPsUP+0UVk|~!hUq&HM8`I6cG`*fLZW6p0Tr<#1dsN295<4Z#bpQ47gUaR4@HsTB zM3bm29xHd6*L5lR2Koxw1S+adnWy!puX44m8oeo{n4D#Vgc^M{8B{7oeV5Q2@L%mE zGMIRk6Gl0?HE)C3IuPenOwMzPjUBQo-V0ikK60Ws2Ck#7>~lPeqs9U6A<&Ar5^^3S zv??Zp7Q#M4Ac%rLYWs^&r#v`6CZdahQ4*oG(Yxe+0xv_qaQXB4iP(8(4&?IhC0*EY%WrAt`dBS58L`taiU3_P#QdCWZsp?hQ>$rJZPL>|0+guOfOchR4g4n?`&AxU@K63WlOrXPV#r#1xeO>cja}sjy+?9bG+Bem`h2WgAP4}9<=z`W{ zbe#7?a?&epmM=mR1KfM=qsbLpuWo={)-aXXU6YZQYyGlabbQ)Je)A!4eYCfAMdbH# zO|RclS8EGe znzMZNIM>1|ZzX2@liB@vi({Der94v7%6;1q+{q_z|1V@o+K~~T%IT^u){JXCUBUKGcnIi6ftyO21$@I`8nx`vG-EyqFCIp_cui32Iqq<$t z;5s3n4*wgPSM)cb$-mZQi;R0MWGY3AbqZ^g|10{l!6iWrv#KLx-ii-oqVjCF`(&dU z&gj=2Qe`!&QMzFM;gQre8zFtwm{$Vmigvz%(5XfGVodK~YfL}aZQ|C%iQGMc7R8T@ zBpdakd@*a%P_CVd;Z$sDVa={WzAR$5UG_mX6g)iB>>D9Y59&-dXr+Gnb;s{Qad0~A z^42*`W5zA#*?~H7WB-Ay-w?Gu{pV}SlNPxR9ls6m(fKKipJYFW|a6DHd13Un*6#9-1 w0sw(9=^?ZSO30uiLHLiO$3%ZwJ)sT&Zx1|=rbIr$zFu4~IfT^s3H|He0qZs3LI3~& literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt-members.html new file mode 100644 index 00000000..443b18a8 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt-members.html @@ -0,0 +1,92 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.html new file mode 100644 index 00000000..98721bdb --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + +

+Public Attributes

value
 
+

Detailed Description

+
Capacitor class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c78cf8295ce35e1a18d9bd173e4c32cf5099d6 GIT binary patch literal 1466 zcmeAS@N?(olHy`uVBq!ia0y~yU^D=-J2;quWcX?KTp%SK;1lBd|Nnm=^TnI5rTvGN zTNr2-NK8NT;=q9eK=I&7msbGgI7@>3f*F8(FfeDDeT9L6)z#C*F{Fa=?cCRsUTg5M zN$=FU^xOVpnovB0FnjJ<%h#*^F1sU{+#M}_A>K>VbxP1F8Ikhxhwto~TXybNpI}h_ zoki%`yLk?W?%Wl=<9DOlVtvh)`#X2vZ{5wQouB;sd|*-eenxZgvi+YQr5)Pls+#!j zo$#AO*A{yNHRxx!WVY_y9luGMxSu5BZxl^!#8S2r!+5acDebczw{0o_Uljs{B=o`iYFosTgrn`qEbId5MIPl6aH zvxj0V1E&g)LSqY~$^?T379q9?4u=?oJR}^LfRYM{lt|`j=R{6()j7TC%)z8IwKHeZ zCKwoRW)VtDo91xn%o!n%88aiBBom)LU#}gmYP?z4*f4g&Ow;SX%3l8!jkK2ztF^0% zFFpSLgWf;&Hzvl$o3od-Y|Slo1*?p2+P3}c|7SC2-t2srn*L7dlRrmv`<|^)^WrmV zch@a{T&$WDr+e-FDy!J{hhLgct*_fQaoy3pl~=vDN_wIQhNvnFj@Hyg3t}>sa2Iq-TmjUSYKs_DMj%{$&Ro!3xYMObo zVdjjR8pfOd&zrKLED0FGWv=G>oW{n&KreuTnF+}DR!B@s116X=ItPPqY|`nDn3g(| z>A^G`29^UdLTm=-A1fv^T=tMSVB;Te#AeXl!nkCD9(B_LQZm~v8s??BXiCtt1uiZf z9UYP?I!a27Ev_yq6E<{oun36>PD~L0c8cL^_cDuZR>GHAU0sUT=5N0jKk@74#H-H_ zf4^E1P0&Z{KPbG*K-FZlK9yEBRHu~%1p|GV7f%JplX zKi0aXN37kGzdUP4SeYm^v1I!#$z57Eqjd9@S-vH|a?Zw@U#vRw+hCSpZwv3XeETDb zMLYT|xvTfT{`R>2-fZS2D`WI8Oy01qdvS?oj=$+*!B~#f-@gVN`*CDnkEBdrsixwa zIjZ{Gp0wB5uiwx(U!yQ4_|U$&{_#nxzW#gY@v`0g%%u6-Q^J4N_{7ai{5#Di=-{3W z%9$lM*PLxQp0vLYnvmvw-e!5L`EADjvy-ZsEO%A0UXgv5nI{~{`(cjibv~=a*l9Lz z7da{_B^~fNlM~`{ME_&Dl?`|HX<)Q`Efp$@1qSp-`}jmbK_#W64wOi9IHaT`WYan| hs7qt%6wQB(dP_FClv$lS3@l|CJYD@<);T3K0RZf3nSlTR literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt-members.html new file mode 100644 index 00000000..2082a547 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt-members.html @@ -0,0 +1,91 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.html new file mode 100644 index 00000000..aa84f546 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.html @@ -0,0 +1,147 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+

Detailed Description

+
ExtISource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@return: Returns the string "(get_isrc(t))". Function defined in
+         solve.py. Used to get value from external current source.
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..45fa51581cfbd2d02caa52e626542e3edd6785a1 GIT binary patch literal 1471 zcmb`HYfuwc6vvlhL98LgI?AJsHmFDnRsj>MA}R|8WI&!4Bg50hkOs5}2q77CR00$T zpg_z3wkAP&*&)fMA-u+6q-p?N6oySgglUlw2o=lQkZwC2zqH@l`{AB*?|;s@Gxz_S zQ*bKy1a5=l1^@tX0aP#y04&H@&RuVb?Pp$6NLX+>6%^rTHk+|@a(X_a^kMyhy{;GR zt5lQS-QC!Ic=_NxOtZNZ790*>=f4)^1HlUb_%JX4JQi`;Vy4EBYB;db>V(&+IaA%` z!6h**;ceVv_eZ(cU5bfk%6m60SA_-IiEfr(88`0HXlI?7Mk8I=r}ZwDDwOqQvWXz8xX+|S{{0jPHYG&yG&1f8WwTu$@U~N597l%w3IRamGC4yC&%KfV{1XXeIC0))2omk$4xR!;&*Jl%}hSg|}JS(%a4OFpu+8(sk3)rOZ70Zi>vHGEDIHrTy7->`vsHO{j z24VN~nA5XwzkZw%Bx=UpuU##HIqwppVzvEypm`bo;uP6)HP}O5Q+k#%Fp|QgBur_^ z6!mL3{P?Y#Hw1=dFT${HO`RIVtOL1lec(0CpQc0@cMiW%r>#m{+t() z?Qo#cK~IA4jwCt-%u-EhhBi0M;JossbGj(Ry>)OQEehdxcg92Hu~CC^>p5s)eJhIg zR**d`gzuHe%oDozjm}hf0g)y0v=^AWF?u@zYh(U8eRrz9;I36lG7^pforz=&g*5e zkkS3lL@Q&@*>y7=^X3UTmwTl}!nw*vS+D8e-EJPMfSF^g+-w_N4rQj^^q!9n9XP+) z(ATxC7dq&|AP5Ub}$E9~2`)HzEeuCulyLf_o1Z z+=m*!>YXLD#2Vg&5~mn-UDr2cPU+tPWM9!!^(F5{j!xp%@Kfry63rms+Qk3o?RBy4SYQ z21WzZ`%y&%W!I>BUxhGQz6pI4xMJc3dn_c$aWckXVKnn}wt*-{S0%gxn7-4LOSNXI zXX>OGqWB!D;Pcd!Lni}Izd@f!l7)@c-skTLwI8z`n$jab>D)QF!Xrc)cXL=)KFK + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.html new file mode 100644 index 00000000..9d228128 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.html @@ -0,0 +1,147 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+

Detailed Description

+
ExtVSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@return: Returns the string "(get_vsrc(t))". Function defined in
+         solve.py. Used to get value from external voltage source.
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..c6482b03f2a6f8d0e054879b934d5feecc464c16 GIT binary patch literal 1490 zcmbu9eN@s{7{`CknOi4vSX#?`*)Ocz+;K&3D%esiQ6#6LF(y_T&IwvGUkK4!X9;z3 zN@~8Owstf%)6|J2h%ZTH;>$A2G_ci=NCM3tLvjl2w>qc2o&DAQjk7ytkiF@O*X02VmJ=e=i%*kHrOC&=UwLJIdco6U&(OruZvq5I;t&)g2K zJS%(F+1ZJ#hY5zO5$*lMq2w?CiC>Ma@08vJ0IMh>VMlnng|=)m5!$w7QP8FjU}HtP z_e|xbn9|V)S_{dsOY53yt{>np1i4l6LIc@LrShn&qV4|hL;0D2auLV2H#u!L$ex-a z`h+Xmsw+;WE-0r=)Ql=|)0lVWK%r><=8MQ%^LJ%%9z5H>7D=@6gjh9XWPj3~fZ>7U zw2uCWy{?0DquX&Dg_dUEoP&i=M5b4V#3HiUAs3fszz9@R<%Ith#SF^vy+QQXcU#hF zt+R3g%Ga;~Pl+Vf#^rm+0!qJj27h#kz&dxQ8W03HeQw)p833{YBF4sr4_RRHa7QtS zNPyo)%(yB(K(%jl?}Jy{W3l@fv&(z2*dUP2U=T5bGIu^yTU&;Tk!HYGrw*+SR_fTkHpWcQb@D1QArF&YPK~zc1ToJ{GhX}=+t>*yfG_zP{usZ z8Ko|`!n^y%3p)lw=+TLsHg1Ow>%*J-urV`2Kgp=5{n{(btocMXHHd4K3uTXKeYc zqM-HZ3F2ZVOEwIZ77;gIrrAKJM^cY4jx{poPw0cuZ^dtVITQ{(|yyjb09 zd22@R$^qOE0&ez|X)I!MaYr|WzAXd)ixzZUSrB@1ePzBX1Oy3$o-m9D2=XC+0wzz) z<6#6V(0Nd z5#j;vKhN3I(X}${v=jPJ*UHVbUT^j|YZzu7#^cW{r)G&}LfVt?FI3ldJ}Ew4Os; zc3jtF?S9(XSyGB!vo&f&=&*l%0cB}IcWY0S^Y~AToGNFEG`IqNn;P})7c9f02zn$d z`^=Vj0)cdOS@PD8!N(2z^6v{>J;2AP + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.html new file mode 100644 index 00000000..12aa55c0 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + +

+Public Attributes

value
 
+

Detailed Description

+
ISource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3834eb0fdd9fed6de0902a61897bb1bc7f52b1 GIT binary patch literal 1425 zcmeAS@N?(olHy`uVBq!ia0y~yU{nRNJ2;quemlg{hOx9U@+I`xcyXSA{=)Uv- zGODGlqrBg}bDx&%3*`A*MqHA7{_ft!=%})LHP7GuW00FX{mxzaZk?UG(@#v=UEPMA zu}61mP?yHiDa8zO$G9CBVidd?IM+`%VT@4*GV(nyu@rRbFg`gU=+LIam~ujhy3{dY zUEj+lotd+ianCq&re)?$%}pt3(-gha(j?)G&ZVC|U!S^q(#)HU)`qbYW}03P+WqZc z=bHJv@wN7I*6(_3xu^R-r}ddLXWsOj3A*hNZena*psvOlmHqnvS!3hP%(1DD5*fv767A)}9M>vfLB%-F(Xy-nF^EwohZT-YI|G;B@?P8Qrs`cgw6_?v;%FT(noj z+B^D_yy@R|owL8oCoH>_*&lq<^Nhm7t4sBDWY6z-*eC7zbM>@Mb0!}N*_|L_w86yY z@wxIlo^erm|7R`zyX3{WMc@8JZT1w~%qDwo$GXnE^H(ZYS_X?fJlnUrWPAD@p_`Gv zj!K$;x+;F=4BMT~ozkgk-}HB8ubkVfGjpcw3pHh6C?7hr%6r{#- z@!{!n*<>#B2ZJ~UrUy)sOdb_`mvBCi0x`TNsWo_~a4NX>F&F_U=V?@?=4Gs$66B(} zG{&K`LqJe)`H3JGmo^<&mlQZ7XPVv0J?k>MlBbp@?OM>0v2JPE+rPq*_R{-))mg;* z9)E2uD9CyGq^RK4ua}=3bjn{jHzT~K!vdZtHg|L|$3C@dj#jq%y=<}Gc^%!yF^^B* ze*bUowD%WEOO&5oPKpiRd->}<{fWD}e?FZ*zjTTB#`#b88BIUO=Nw&U&zr-&W7fr8 z+w^pG7td0~YMTo2Q;*3*7{^LD9yYn``0_xUCM+~1mlU$>TRukQ>5CzIV9 zO&0I($t*wYkurb!tFIf@o;-ZIwB9%TZim#X+qW)#3$pH+xb)z=H^)uSe7bJv?p++a z{jOhC{wHTpYB_Ffv2hDu?(MYRrT;1{Hk-UZ={W1v<9!{HDtmT)XU)Xa>R zyCeh)AN=1jO-aecC1g5E)PUmX*zF*2NoV=oe!kbjxjEaPJpvY<44$rjF6*2UngDeI Br0@U$ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt-members.html new file mode 100644 index 00000000..0c832368 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt-members.html @@ -0,0 +1,92 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.InductorTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.html new file mode 100644 index 00000000..8da9b965 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.InductorTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.InductorTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.InductorTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + +

+Public Attributes

value
 
+

Detailed Description

+
Inductor class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.InductorTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..39326301c2b3d57862ce48e20bbb8ebc9fb53030 GIT binary patch literal 1418 zcmc)KSx{3~7zgmH4z!94r6VmyEE>d=MG=A<5N(}c0ELU7GCBl0A|O;ygb+nTs?`!y z7FolR8>?ar!B_!_BrfQL{Wf75774jz#-I>^B!*46BK(YwySWf006KJ4kAYYz%l}6*5@m*xu_Xg#LBwxgNFkx77NC)i5XhKYu>JHZf70K z;jxyM7OWpxqt;~oBiv+Oz*VwtdsuuvP9D>Q;A3ncqk~5yF@mp<8@eMbcxS#HQ z3>C3;gVegqrd1&BSZ@mc5Yw$@&7lyt@^BS$O@dk(M|6-2sMGCU0%&ZMjW8rmY8Aq5 z`8lBUNbkqAG8JO+kcfE#XQ=Gb}=iD=LV{^T8x$_iUmZt#^^G6kmMaX11FcE zW*;IdwIiiW9Vh%@6Yz^H&K*n%deY+$Etqc{Gi6*9vHRr1t=a+jvbh*2}@sT7lHZSJ+;a<#)e7(=-lkCWyI%zUtWan^3=4*TZmpUO`nn9nROj_^R{eRsF_rG5X9#1Aqt&D5zZ@GZ> z_Pdvm!=pz$@~C_p{hq_#`YpaPQGigGlz#pF&{(el-rA?O>v5TV4Z|<}*9S~P$`|4j zWN8bBz3J4WhnAgsJlzLxW{eb)S@t*>&{MAIg%JIe|3GK_f^@B^M~?Axb5{{i)~pCR5% zn^teHwI=NeA)6*vK=q09{2j<#BrUp1e4Rh1h>quS!@wi8>@D-G&^E`~@q|1vX)o>W zO_a~o!mrq)!V_)V>uAWY=(en4*UGk;%tcqQy~ew$;~HvZ4nC|hyB>c5VeaSF`Bx|y?7s4dez^Xeix62I>z{0 zx)q;+1FbC9WoG)`Kr)MU>YEGKSsk}{ESA$hs4nM4gxJ@VoNHyKFWieVxFc!UuL%SP LhLMH)ez@`{#W&aQ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt-members.html new file mode 100644 index 00000000..90c185d9 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt-members.html @@ -0,0 +1,92 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.html new file mode 100644 index 00000000..9c253666 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + +

+Public Attributes

value
 
+

Detailed Description

+
Resistor class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..c9abe3092885b5d67e85fde4e8be1d1d1b2bad30 GIT binary patch literal 1428 zcmb`HX;4#V6oxNahh;=3VkZJcIsw99rIjWDDMGDYln6ILgQI`}Yh<~kfJ-ziVbQTd zh7m`gAzlKJ#fzx8Kmn7;G7=XcD3TJb7$TY|5x58%DNvGLol5`or{9nBKIeRM{=D;k zpD>)U)!xp@4gdgqdI-1!0IbM3=i4mCYgT6SEnJ+#!yFO*&hI~#FY;I6p>~%UOrf;_g%Uql)6rD$vK#T zW>xP0^PRhM%`wTZNzHK&C=>LQMd|i_UX!jHODYL^_DHNL(C@9_VCP0vHSr$;QQjHaDW9d4>X_SCT zchu%d)LV;|f^Thp@obbl^#G3Yl$!=(VmZm|_O3}doA6f6NeP`;TFoSCTmPO*7lyckqcx^^BFD2ff8;CHJlgKV7BJY9fcc>zW zN0h@gT>Uwt^eK<>Gv~JI zms`c++U@c27B42v)N_VRX{2-};Rc6^BX=$MyZ|wXC@xaju(rn@klrEY0yj1zz?!x; zz3sV;IK+tbw$E0>i_&u4KYt!RWK2+n{`*$ENt-}$j~hfFc=WF%Y$tt!2JURvD_P~G z`|Kd0<8e~eH{4O*S?2z1-z<~q4O@P!c9;|H^nT^M_7%PJLfr)S!WK}Hwu1FVa{Y`2 ziv*Rz%7bmk^Y0m=p6zUDK{UdY$#IXgWH!yUIp@DnwC7AuO-qweZj<_V=Dw@7L|yr~ zwp}`rx!xNdWaDdaYu>8)@$vy5I?J_4GXtt0=M>zFGgn3{!~4Z~1NowE-=RtGc$rth z>N&bg!gjt-x?e9;C^PnzOeu|q4MTz@nbFg3r^*uK%ZGY7D12z+T_MDp&r(II70K%l z607-MRhj;&cZOe#g$DYI6P@A=AHmlwD~QsC$=d`vwn;FdQv{ zk?c!#-2uU2jLXD?RPoTq#N>GToyx;P#vagIc6A(ZGqpT!ZoMS-9^t9&+4}P-)|JfN zTP^cY>5m--sB}UpdDsuN91TcxN|CGm&qk0)k8YHp4$=SR}r>uHJb(xgo|0h5XW`I{V?LGbv7QVbW literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt-members.html new file mode 100644 index 00000000..95c9385a --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt-members.html @@ -0,0 +1,90 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.TextFmt Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.netlist.TextFmt, including all inherited members.

+ + +
gen_txt_str(self, nodes)PySpice.Spice.OpenSPICE.netlist.TextFmt
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.html new file mode 100644 index 00000000..ce10ae21 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.html @@ -0,0 +1,155 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.TextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.TextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.TextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt +PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt +PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt +PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt +PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt +PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt +PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt +PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt +PySpice.Spice.OpenSPICE.netlist.InductorTextFmt +PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt +PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt +PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt +PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt + +
+ + + + +

+Public Member Functions

def gen_txt_str (self, nodes)
 
+

Detailed Description

+
Abstract class used to generate values for components.
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ + +
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..a23b18a97de21dbe6f55730e57aab4170310ee3d GIT binary patch literal 11397 zcmeHNdpy+X{#RSsl#taOTefTzwL+0>nV~|Oi9{|NGcv=>ZmnyfR?(W`G##2o zV>V(!LrK}qWymmYL$bLHGib~VGsgU$?~vL~doHi@`kizB*yj)C8RI+8_xpT4pZDeS zBpyCwr>e3>MM+6X^}v3_S4v9r$x2Eeeg5%B;GG>eUd{)<)*g0nLCWQF@N!^Sh)%7% zwR79%uvHng0}mfQ1n)cl*aZGZX>r6?hn$tbTrte&6In`1ThtFA_PU&z$K&*z=I$)C z?TN=gKT0cJrY%_dTMUt7-6)L*U2eFTXnxjwKKXY9nAc zeM+iak6?+xIH7^+QQyFof>D@24*OU`CQQH|X}sw7;_P!|q`zP7O@RetZV zHPA4?z+fu!r!xYkz30MY@@V&~D+or+8Tg8qz!gWAlkl?ZYlq_DWi3twYZ2()g0D{7 zhlsUFAj2=28~(M0??c3Z%M(^;Xf0b$DzB)hus#pIDa_*fp`Hkf>sj*`Or*YEG;eFk zV1z|%(_jQvMg2wFwLM@|R)e8Avr)ZZ%x=^e81P2zL&zp3CeF;(&c+ zwfH{xE92~r@fT1TJY3`m_*UP?4ZBuJ?T;g3f12ngdAqpl?~HN%tNloh5$9QxZdEk1 zRb=WLH(b_^K3C!0a>YB-=47yac;U06N_b6Ei@|pE$hUHl7YY~Oe8gr{=r$#^$M49s z+Q8i@AMCx!h~vgcCIV>aB;pHQFj6%^cuha@kIu+;Ehvua=yqi(A8Su49eEv<AX?F8Nv359TkgzvylE-ORK9Ejz(tC*Azmg+%f;L#Aet@i!g5vO^Bx>qcUS z6G}_O(#8ry?&RwFPz^2rSMv2-kK0Dd1H1^vy8fY#bK8R&)}RN27M&{cX7W8xSj+qE zBgf63(zeqtd!pnMHE>W9jJR0^zVP1p##jF+Bcy}97#lN&GiX}Zb=*cT5D|NGqTh9? zp5oP+qlWOlZ_-l)ekvHV84K^qY{tSDdoK_w--#USXKNRHyv+~rTeONk`w?O=GyBQXy-@ReQN2;8lCUP~#9rCTFKqESoM>kat&|*% zB6)qhKh*p-sA-hI#|SAzn1S!F zj;!t|_piMev*mJdlHdg`1D%uMuOFDv)81a+jfsv8O(#Uj4xQdAtaGMmnUN}QOnuJv z%V2K0u*gTu#XIN)>OQ|JN+9=6-J*!vrMG!oPwwBfd*uEUQ3BoS^T>#hJ_6PEqAhFW zbmPHdpF|IoZo)}JZh1}r=8(3Iq)4hO@lkNOX)fU`UW4-+?ࢼ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 + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.html new file mode 100644 index 00000000..f2d2330f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.html @@ -0,0 +1,161 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value, node_plus, node_minus)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + + + + + +

+Public Attributes

value
 
node_plus
 
node_minus
 
+

Detailed Description

+
VCCSSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..ea91ca6257d52ab7794cc0836acc27a63abb0eea GIT binary patch literal 1492 zcmcJPX;4#F6vrQmRxNadp}_(LeJ(T_TnZwh2E~^kAW;Fq$07kOd} z1OdU22yTdqMv`d4BH;Ggbdtbe5KJXRBeEqtR0v>zq|xbgrqhp|-VgVlbN=_tojL#C z+}z!i0NVvl3jhGH4cq~R0)Q3C60_&cw(J2l^97c}dH2q6lG$vwgadlR@q)+IK5Owu z7nR8e9zJ|%sfQIQZ&04wV5;4J5M^n#bp#n$nh4w1Uf|646iLpJJVgZIVOl8(r;rP!S2%E~qetmT3qSV0 zTt1iol)jDD8KYCCj8{sHJ@<6OeKWV*n{zVWYYsl)ayYSX_aejAu}XRJs~~ytrQxI* zRkx?7^MLD*zHX3dJ)&bIhn;_!R!@v&wZF+>F6le;)CfPX<}!z_4NlLbMGyX=_fBlO zS+h5lp_J>vjfn2nh)i$5zGS$D!O7cK+C~z_-#ChlL*vYKHFs0kPntQZ_E;8Z^=z7Y8MPV}06E=R`3ptfr>VMtqgPw|DJ5{3T?T=jb6 zG*sD(8gzc5%lXjWk#6zLZbeYH#4s&%{F?peuv zB2RvNe{a*hIdVDibcTmGZ55IR>-R_CG@ILLG=IymP43ioIRPP*a}qzBumOK%r9{HU�b+(%nnFrHKr8Z;{iI>TmX zI>UKv3v+gMFm)XWA_Ou-Re6|7%8lEUyqacv|p z>L|@<8P}W=IMt>Kq5q9alP2EaFwv?pi_h~FnV`G}$i#NDM z#Y8gWXm>N*^jSL-1-3W6VgxS=;=mzYE}Bw)q5+GYs_L4`;tlpkZb`MtdcTjXzU`Y= z!*KYEp3bQ%4Q*7?a6mBnB09Ni)4uLa_hmeo$20w;R<0cLq20@5b$;7ltl~~9>3m80 z^Q$4*DNedRA3q(95kR#_N~v!+w&Ldlbf6a@wOiD4$&LF`+051j+oTG5No+Cz*M;e*8vI zYXiFwh^b`AMyl + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.html new file mode 100644 index 00000000..4cf72642 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.html @@ -0,0 +1,161 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value, node_plus, node_minus)
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + + + + + +

+Public Attributes

value
 
node_plus
 
node_minus
 
+

Detailed Description

+
VCVSSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..1487803227ec042fa080af90508ffa833dd50bcf GIT binary patch literal 1488 zcmb`HZ&Z?39LLezj{R|kcCbm)Vx_AdEoYgTN=?8_MZ-GwXepwhhNujZVWQ?%L#dg} z)O6@6kCxfU2U?(HwvHw#WE@R2{}rW@7>1Pu&e*e^oxR!1c3<54z2DF8o_o&ke$Oq6 zB8E6Db6JK!ARI#X;YbLC4Ib7!`z7!k(zFzU7j#tkLA=#!g{5xh-HDQWSNyhZ%34#Q z)ZM*%7xtqCeOF<<m&&BjEktW2bF(KLYVdTqthu!S8Hd314RD{a1V%vOQ{UvG#pK zku$wf__~Hkdb%YbZFMxi%h6mx+K;R+6BK9-UL&L91k~uLL~&Vu5(To@y%@g100s?e zlM+pivV11nx+h3O;iQgWe=3(Rq!?*H9!qOJ%pacr8P7Jchdf0uqu}!i_0W|zo#BH& z4J?O!>F2;Tf?VFNNMr;Km1G(WZi=o+*iZN#XqBgw!U_=U3^n-w-kgC7+k`J8buS=t z{Spwi>rMf-8_X5~pfs1!j-yE;|K=j{uXA>-d0eaw)z5fH59rBZeUg z{1`Zg2E2O2yklUw9YCetQ_j$n)k=U5R9!q)iuaKK;#6w+1fD;!aDx`(=_5I{#rx>_ zi#s$q?CM2V(CYgtXTivL?1a51e?Qy&?154#n!DDST_{SU`etpM+>k1dvu5V`_@H$e z+5Y*wKWHe;)L_GADZ6Ft=(x^EN#M1V93F47uq2Vf?ZS5KtqUSmM)W{+YwX0Wohqf5 zKq3=aAZ7gQo#r={-4rw_O-6y-+AAN&NN4#Vmma)!9Y<-9~ zag14{jW;hb1IPQdcW!3uuylqX)N&%S=~1tDU1wLD!4G?}4LsV{GS)5ZZ1Yo{`4EP3 zGbah$<2>ISv}~XXvh)MXQC%*9foh*LYrhtJxVxy4I0Ph97_oJ=wK@+DW6{zJxLy!7 z)zcS8#Y3PHwY^`L!83#paG*wxet8;^_0Io^OB*2@WhI}hG0&i>R437|)AgQY>OAr` z4dTXvxjht9v-tgFk*|*v+~;}hdOnp3{@ec+@JRVFWRDn_UGn-_u8n5% z3qQM{8kc6bZ#^Hud9mt$PsKlB>&a|BynoZ>GLmBy27|+O3@a!&911+kgVTsag2~<( zOizX}{`fRHf+@1>4|iUTRQ)zKN^K7rXpfMO<>ekxb(G|*>=(8U@563w03WY12TqV1 zrGv$~DkO4A424*DOa9I}Ddq7_879fl7njfIuzs6T-bWhAx3i7NLcBbzQK4&;{wKjh@fi4cX zpGkWgzjk_NJf$otQDv+5WRmKnPX{P5bw39CrQvYlGDqf)%^0o8J2rh-yavg*Pc}|b zaUBH!k;uaRz~jlz0t8%gX(x{dz_=8T`Vu1^0m@0mU)7hH%qt@mz2@Phq&oQTMTFvs KIMFxc!ao5a^4=`~ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt-members.html new file mode 100644 index 00000000..a1001921 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt-members.html @@ -0,0 +1,93 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.html new file mode 100644 index 00000000..f229c6a5 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.html @@ -0,0 +1,158 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt:
+
+
+ + +PySpice.Spice.OpenSPICE.netlist.TextFmt + +
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, value, srctype="passiveValue")
 
def gen_txt_str (self, nodes)
 
def gen_txt_str (self, nodes)
 
+ + + + + +

+Public Attributes

value
 
srctype
 
+

Detailed Description

+
VSource class inheriting TextFmt
+

Member Function Documentation

+ +

◆ gen_txt_str()

+ +
+
+ + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt.gen_txt_str ( self,
 nodes 
)
+
+
@param node: List of node numbers.
+@return: string (or float) representing component value;
+         may be an equation
+
+

Reimplemented from PySpice.Spice.OpenSPICE.netlist.TextFmt.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • netlist.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.png new file mode 100644 index 0000000000000000000000000000000000000000..3f634bad2824ed72bff9e7d7002969d13d2ee1ae GIT binary patch literal 1451 zcmb`He^AnA9LK-tvMiy)HT$8(#O2O(l43fYQYx0Hd8IkBaLh{FX_jD4JRzUC%=YbmB7_PV=Up*-A{G}HA$QbhrdQmn|9rDY=9+5x zXlG|9l#f5t-vDX$S#h!P02IGl0XF9!1Hcl00zPz4E^PdwpCtjGm2i2cSt3(9|0X65LE74>M)b*%CBrPO< zdYFSX`hwZa6roroHD{S%OC$GcJk)dmUT^ ze9*Z{U=ukx?Uo3v)h++{L3Gt2*e8{q-+B2isSF1Js`R662!V~%l?VhvatR5hgG3kV ze-X8pKz2%E*G(_kDkm&9nc^P`%H>pP6(t{>ItaV;%ZZ)obsC0OQml3I!F}o>nq;?%he&Pu2|Uof(DP7?#t*`rUPE zrD)(w(aODFO{9oK9T%rJGLX|7ZitEIF$xNo*FR%9NFIA)^xxYN%1bcK$>m0FbJCIY z{j2+{xRt2V-~M77^jsp zx`fMuEO5kG7{q>pu%?pWvAK7I$?!j1X!O=017cWVROrw3nr|CP>+6#J-k|8MTtnz= z8mj2Ri;M$yrPnhU&-MG3mZWC>{Az3F7Fh(VMo&5wW(WRAf4$%^q~nbn?ilq=?nxbK z>4V%9icdjb9U?nCtG=O^xbwl&TLG!p&kQ}e``JyJxxz3k-KW`%b*?P!-p=7zQ^c7{ z9E-%^sQW_BK*k>10;8r-*x~=``y{p1ONNFfLji&-PylRm1PH{<&qq3KvwKTO+{Q$} z9zvij=6^uo{bc1f@cw!-j!0KD+FhD}$0GzMnGk(QWT0*n8ZCLQzc^}e-bwTF`>=mW z1fF&z$MRHj+I;jr*o;!~IJwp~%PD5f^@KKN1E@KU@y;iXYqJ$h<_b;?p|7ZIK{M}! zJa$R+R20QGn5^aQVp=Ody8?rejXWC|+8(eQ{VL=Dqgmgt7&=;=f3kIYLL&Z^pO zs1*>~JTNN;ahm%s`-S-+qn44?%0H46gPB}&ctgA(ExfTr(XN+ZkY;6jyKf$}viz6#Vmo>iHdSSb;iKn546L-{S`?wK{rw5ud z_S)hkq$IvYXq$^IVEMddrYYag-crnC9GBcpCz&_udX@gqw=m4d$XyPO$?DmA%2vef zkaLQuJaW>ehodpyj-;{6+{RWSBkaiuqf<|+DlnKw+yp

zzzyv^zi8qymm!gl-2R?X2`K`vtK>16E*N6nS#*>~$}fvRux;bvW!<;T(6 + + + + + + +OpenSPICE: Member List + + + + + + + + + +

+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.html new file mode 100644 index 00000000..176bed8f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.html @@ -0,0 +1,187 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy:
+
+
+ + +PySpice.Spice.OpenSPICE.solve.SolverStrategy + +
+ + + + + + + + +

+Public Member Functions

def __init__ (self, eqns, nodes)
 
def solve_eqns (self)
 
def solve_eqns (self)
 
+ + + + + +

+Public Attributes

eqns
 
nodes
 
+

Detailed Description

+
Operating point solver strategy subclass
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy.__init__ ( self,
 eqns,
 nodes 
)
+
+
Initializer function.
+
+@param eqns: list of equation strings containing x[*] list entries
+@param nodes: list of nodes
+
+
+
+

Member Function Documentation

+ +

◆ solve_eqns()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy.solve_eqns ( self)
+
+
Solve equations.
+
+@return: solution array; first entries are node voltages; the latter
+entries are branch currents
+
+

Reimplemented from PySpice.Spice.OpenSPICE.solve.SolverStrategy.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • solve.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.png new file mode 100644 index 0000000000000000000000000000000000000000..fda200a7505134abd7e31625ade05fb78fd5d08e GIT binary patch literal 1514 zcmb`HdsLEV9LF(Nwl?$7WnC;=h?3eUB&AYQ3ky>5f~{p=Xd#@=lPxU{hWv8PuXL> zX!Rll0%1-j5d#qj6IVE9E;NOA->I?z_^|Z%3Gy-;jd1vSWFjT!e%aQ|c0a8wl)P?k zZieerj`RlH`!YF@LPfy&$3>WTp$mbSpF$>j1|2hjE@?Sx+pl+9BzBWVjcvuy*!;~^ zbb8>hZ=)SAhSmnH%xcOH%-m3#ukr6woT)QV(VYr6mik^DhV9CjLUS}au6ozttk0X2 zD-c7c<2{Ia?BG5*d2)|fF-!Z)TAdLKOp`!4kO!-OAJNN#FrZFHh`AP{xmTwG+z#1v zDrW64;C8w~F`Dq`pu39a!kFrOWu3&WGw@D*_6||sr^q95>(ZBqlNf#|_#SfO;Q5ck zJwzPe9FCaRzl~#-JD~NRLybV}aD*$SXihmzt;HA|C_Ro$|t4m`e+d-y^0 z8~~W-@r}-)_MK?%@l<iQQ4Kbpd)_Ip{$zB-qVyadXHDdp$yrz zmwX7bZvd-9Px(2>9rue(pX$Sx52q`s5X~D zkpe*c^d_iY7x|&^{z!-9*W%t)Vm#jabFZcgK3QpH`nKh`$-+~b4-g49^_r5_gNSX7 z3bB>P0vIFfl>Z&0e*xSP5@uJ*4BQJYwn6PA5?#IYC=`bjMkFo~XE9-Zkw|hXD3D&| zM`zMn84UlGi$>8{lEsfv0=!+Npy_s8+cOE+ZH!<+`UjP6A literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy-members.html new file mode 100644 index 00000000..9b11329a --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy-members.html @@ -0,0 +1,90 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.solve.SolverStrategy Member List
+
+
+ +

This is the complete list of members for PySpice.Spice.OpenSPICE.solve.SolverStrategy, including all inherited members.

+ + +
solve_eqns(self)PySpice.Spice.OpenSPICE.solve.SolverStrategy
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.html new file mode 100644 index 00000000..65be1848 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.html @@ -0,0 +1,136 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.solve.SolverStrategy Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.solve.SolverStrategy Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.solve.SolverStrategy:
+
+
+ + +PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy +PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy + +
+ + + + +

+Public Member Functions

def solve_eqns (self)
 
+

Detailed Description

+
Abstract class used to implement a "strategy" for solving system of
+equations for given simulation type.
+

Member Function Documentation

+ +

◆ solve_eqns()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.solve.SolverStrategy.solve_eqns ( self)
+
+
Implement this function in subclasses to solve equations. Should
+call send_data if defined to relay data back to PySpice.
+
+@return: solution for equations 
+
+

Reimplemented in PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy, and PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • solve.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.png new file mode 100644 index 0000000000000000000000000000000000000000..5f084c5a56929a9bbaaf5fa7ccca23133e69b218 GIT binary patch literal 2175 zcmc&$X;4$=8a~K{T4-665hxX=fFgtfD!U7MCkzcplr@F`1~8X`f;VCUk^;7jvRPxZ zNKM4_B8vnFl89gfL=nkwPy}Q#q#;xd35F2%9nurp>Ga37_x@_nkMlm~dA|AH_k8d3 zo;d|4kO3bXd}06qz{iL$;GqDpg$v>Qt-8?NS+sNl3RWkMh5KtX8VD*T<_YAsN^dvE ze_IqkQ#^X~2;##iFYiLyhZjPTVF2{Jd3kMN_5;9H0|fkNc!rLuM0x&B^A0^sk<%H0 zW;@G!%=YxX&a3V$0yp|XJXYCO`uVz^MFA~zpJREy5un?1nU>bQTYd`@htpY!!=-gU zbd22bgH5ET{1!9*zf;rG;NjihPqOAQ-99-k+SM%1*-UT#hN$~|_p)6*7g)DACL&AC zYMhUt4rftocc5T~Q+!K*(Q0Cdm;9EW1r*4e4yI-QJtK(Gvirm$N;!yEmJ>? zxJpUuW);x&6v92=h##3M3xcxPYqQu*-1m_mH2GiU{eLgS(1akK49bTsnG>3&|#%@;|h+{$ud(qp$p- zk7lNEwzg5fw$aX(@oV$m3#KDQ7c}AWr)YTlc2qLEH2>AkSqW}V4bBXQycDpG5f)!$ zztA4Fnl2IW-?`hqE`WKQE4;y%X(SE#`HUx40kh=%SNOgLy55qz3+zA;ufMYHa#HJo zx_EK?LM}sX-9_?eCeINn_>O8ZC)w}#*!{6H?F7$7m^6`mPRUZ^!Ba?hyQMaXUj&i( zc2!ytI`8S)Zw5{V-Ka}5KS!(O=j^@7W8`)E_agG1&gbW+L6-6x5nNhLB*~NqI1$5w z=ZzjRCz7+crY{x$)4%R3$I7{RR7ZN2i|?9822>irspU4f2l%F1$5dU6T)?Z*j61zu zr}~k?i_{#So9waCDr+y}iU_2g?Q0XQFS|e&*OhP~yOYisE^o;yrXA{?9yrZre=I(1kbH%dx$q=&9wXhvh>ljp#_~MKq7lQu1Ou22%`ej?`}6G-Y7q^%kb$ z%&+HK!r^P_C()NQx0P)Zu$-G*nZAkXw83VjZQ+*%DfHlRc0F{4c2CZBnVKeGH)r;} zZI8qKCjE8(7cj*t;{HalYETdQ+!*B<^cYqe_E`LdvFPi*l8U5Ha>ee!FHO89NsNkE zHw5LovPc>js0}C4h~%qudRgqBfKQ#6ldN~m-qbP&PJg&Rg(&lXmy~GBe#A?mnCN}g>RxoA=_i#HM$j=rVo(24pCc6Ck{3W zqu;$9Iyo|ArlW=iE6BM{m%|r$_eAl&J^w0u#Is1HYHDh7NlI^yAU45KI95jnBL+X{ z0M)K$rQDMoulj0g-HL<><9sOWeP&$0icZ}>Oh^k6?GmcKHgbs4UtV+1Q_m+>PmC7a z@CdN#`1vE>U0JQ*AUVTqWT79G+oT+v>Ome5HOoHc3 z+%1TN;TtG6#uC`LjU#`7z%>_a4x{g6GNPt#=cJXtz*XNDMU-x2UGH-0IUt(LzUOzeWRq*@cGS?JJqP+#01*C2IOm_( GZ+-!$Mh;T| literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy-members.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy-members.html new file mode 100644 index 00000000..117e9063 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy-members.html @@ -0,0 +1,94 @@ + + + + + + + +OpenSPICE: Member List + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy Member List
+
+ + + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.html b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.html new file mode 100644 index 00000000..415c1f36 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.html @@ -0,0 +1,196 @@ + + + + + + + +OpenSPICE: PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy Class Reference + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy Class Reference
+
+
+
+Inheritance diagram for PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy:
+
+
+ + +PySpice.Spice.OpenSPICE.solve.SolverStrategy + +
+ + + + + + + + +

+Public Member Functions

def __init__ (self, eqns, ctrl, nodes)
 
def solve_eqns (self)
 
def solve_eqns (self)
 
+ + + + + + + +

+Public Attributes

eqns
 
ctrl
 
nodes
 
+

Detailed Description

+
Transient solver strategy subclass
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy.__init__ ( self,
 eqns,
 ctrl,
 nodes 
)
+
+
Initializer function.
+
+@param eqns: list of equation strings containing x[*] list entries
+@param nodes: list of nodes
+
+
+
+

Member Function Documentation

+ +

◆ solve_eqns()

+ +
+
+ + + + + + + + +
def PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy.solve_eqns ( self)
+
+
Solve equations.
+
+@return: solution array; first entries are node voltages; the latter
+entries are branch currents
+
+

Reimplemented from PySpice.Spice.OpenSPICE.solve.SolverStrategy.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • solve.py
  • +
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.png b/PySpice/Spice/OpenSPICE/html/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.png new file mode 100644 index 0000000000000000000000000000000000000000..da16428cca9df09df99d34188410d00ba8cd5ae3 GIT binary patch literal 1561 zcmb_cdsNa_9LHL#tX8;Q+Dt`O%1l%=ndq#AJk-cgR{5f-p^=Z~B=YUr*&@w+q$xVI zmPlwx>J*hsGmnpjj~yiyhO9J12rLyz2;Fa;PUr0Z?jQGlKA-zN_nvz`-}|`|K)`M> zwJ-&NKwI!QG!Xz#@QmOTOfK|ZUis{mBI)Y9_0I7lb^^Seugiq6hX zKo2Y&xdZHNOd=8jK>&X@+}D(kf2%_tvpdzUkb8EgH_NukE z4y)13Ju&zlfY+)j)k3N9z%r6sIec$2T-kv95-7YvQvU4=0Aq=(OA~NJ=D>qzel>#B zohYu@2+-brwD`3=Te?p7LY-P8FmPc ze~!FavkjDtgB@}tlN(I)v#Zuj&!30Yf|!8hK{U<3TD1mh%LVlV)TQvFQsH_$tNN_j zi0jd0Cnj?vqR{~=5;~aU-4K2l;()NQAPCVI6^}b0^Oh#lD3siTSSF?4-wguryS#8BEh8#Wa-;{o#xC1VCk~=>S9?%ufOsHav3twS zXQm^rL3+_W0>+K&OGI*7^2Ho)d$}DY-acgbaF?=;IpOTB;D$WZCzZ#dCeQe{6MH@M z6~XXUnoalyltcB6wyhQqd5gv3W9OiEWy6D!OGL76X~ZITGJR#BNJV#csLnALQYTt2 zoMF)xy$jlk6762z-D1_fxr~;60jvD!{)pGDTyvrF&7Kemk2zt|k)I-h!y}r*T2$G zIrLD78a0W->c$nvUwcuZtG}KR(Z}rgeCgGFkKFU~Zhd3j#Hb zt?Xbjoe(JO2ZKI%CbyxLRpb3fT-heCY|>0NWO+h&SeNkNr`F+oh$e~2$YN5KKOkA! zuft)8CV;(JQ2;f^e^e^}x$4IIe+LFbAdpS?Tn2EREu^qul);FCx~Xnh zNP%j46t$^gE8k51>d|MgY)J2?&8vqHneBV8u?MvedgkJIu)4^1{nc^@St90GZEwU$ zbL(sCJR}$^IZF~Ca_o5|(tdwTsu6J{QIe%Z^FZEc{k4ajr%$587`v{|MPRI?_b)yB zgvvFX`b_qE)>qAOGkcm4Gvl1f<)s?Tu(#=znSmKb#}ux5w@O8I%v1A|*YB&D7Nni~ zGhA7?6foZMOJ&ddmU}d<3+W}S)YT`wsCZ#nid=Ez?@hPY){w)yV^OhVfm_+1@g>qm z(&Sg%^`cyMb25(|@1+e=ievR*ZPJMn-ZYG|QLJ7G%hvA@j+Gshc?n1prQTF3X?p$R1Sd#DFRN5=91OPVD;`}61xzEH)pws%E}unrUt2Z! z#-YaFEaWk^fx(&CRTwl7OJHz6j*3RR6k31_K4jXI)h71zBGz{Me*q7|`w-A|-=4no EFJ9^d(f|Me literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/classes.html b/PySpice/Spice/OpenSPICE/html/classes.html new file mode 100644 index 00000000..0f8d043f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/classes.html @@ -0,0 +1,115 @@ + + + + + + + +OpenSPICE: Class Index + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
B | C | E | I | O | P | R | S | T | V
+
+
+
B
+
BehavISourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
BehavVSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
+
+
C
+
Capacitor (PySpice.Spice.OpenSPICE.components)
CapacitorTextFmt (PySpice.Spice.OpenSPICE.netlist)
CCCSSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
CCVSSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
Component (PySpice.Spice.OpenSPICE.components)
+
+
E
+
EqnStrOpPtStrategy (PySpice.Spice.OpenSPICE.eqnstr)
EqnStrStrategy (PySpice.Spice.OpenSPICE.eqnstr)
EqnStrTransientStrategy (PySpice.Spice.OpenSPICE.eqnstr)
ExtISourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
ExtVSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
+
+
I
+
Inductor (PySpice.Spice.OpenSPICE.components)
InductorTextFmt (PySpice.Spice.OpenSPICE.netlist)
ISource (PySpice.Spice.OpenSPICE.components)
ISourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
+
+
O
+
OpenSPICECircuitError (PySpice.Spice.OpenSPICE.Shared)
OpenSPICECircuitSimulator (PySpice.Spice.OpenSPICE.Simulation)
OpenSPICECommandError (PySpice.Spice.OpenSPICE.Shared)
OpenSPICEServer (PySpice.Spice.OpenSPICE.Server)
OpenSPICEShared (PySpice.Spice.OpenSPICE.Shared)
OpPtSolverStrategy (PySpice.Spice.OpenSPICE.solve)
+
+
P
+
Plot (PySpice.Spice.OpenSPICE.Shared)
+
+
R
+
RawFile (PySpice.Spice.OpenSPICE.RawFile)
Resistor (PySpice.Spice.OpenSPICE.components)
ResistorTextFmt (PySpice.Spice.OpenSPICE.netlist)
+
+
S
+
SolverStrategy (PySpice.Spice.OpenSPICE.solve)
+
+
T
+
TextFmt (PySpice.Spice.OpenSPICE.netlist)
TransientSolverStrategy (PySpice.Spice.OpenSPICE.solve)
+
+
V
+
Variable (PySpice.Spice.OpenSPICE.RawFile)
VCCSSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
VCVSSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
Vector (PySpice.Spice.OpenSPICE.Shared)
VSource (PySpice.Spice.OpenSPICE.components)
VSourceTextFmt (PySpice.Spice.OpenSPICE.netlist)
+
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/closed.png b/PySpice/Spice/OpenSPICE/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/doc.png b/PySpice/Spice/OpenSPICE/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/docd.png b/PySpice/Spice/OpenSPICE/html/docd.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c94fda9bf08ecc02c7190d968452b7a2dbf04b GIT binary patch literal 756 zcmV1wr-rhpn+wxm%q2)IkAYsr{iGq<}_z5JCD4J;FN?6Qh;@TCubdp(_XdD-^ zG_#)IP7_z6hKNdx5^+FGArwLWTWCG!j+oKji?U!hxA#d-ljgkN`+e^@-P+RWG{Bx= z2iQyYTtEf*o~ySWrIVW}HWHi0_hd4~$E6Jx1U`>Owo}EYJ1O>iZvS?!z8}B}QwLMA zC3Keqf1c}K@?C`X>68b(EUzYUYAS&OH^VPteZLPr{S&|nQvp@6W4GH-1U8!u&7l~A zx~RUSNH+>7@q38W6!BzirtjLFCzc|XGx)EF#G%^pWION*k@?vP<2O>|XkCD3ujl%1 z{55JSVkw{~HbX>iEZ2%yJ2eHj5Yh8OTpzs0A2;tZ^x!#5D+y-es{k1&0|Ns9-|+Xt ziGiTsZ8(^nUo#wdTpIDkb-Zp(3|A*FzW}GZ5SQD-r^R`&X@`26E3W|GyrwDIZjtQ& z$g5f8Sv=VgVtDien@J(!^BK+#l;s-LgP--p7C;7;E!ysXcXK6?+9D>_-B(?Wm(U zQbNm-5TyYxIU=rs0+)!ixqzhuxw(AqKc3?KKX32{D~Qibp*r0x&Wux5-9WCMMRi3U zTd6dOCQlj>a;gr;gLwRKulT&(m@^L{&HkSC(qH05HSSf$YEhynGvH zWNez``Z8FJXE+BSg=%ak{OR z+Nylcb{?evLYLuE1_HngYw0g%LC#=$a@?4~Tx>F9295Q>9UJ|_6v-KMw;!YZSgGj@ zR8fRov=hJ#QvsO@xw*{0%zH@OKVEUr + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PySpice/Spice/OpenSPICE/html/dynsections.js b/PySpice/Spice/OpenSPICE/html/dynsections.js new file mode 100644 index 00000000..f579fbf3 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/dynsections.js @@ -0,0 +1,123 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/functions.html b/PySpice/Spice/OpenSPICE/html/functions.html new file mode 100644 index 00000000..ddf94928 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/functions.html @@ -0,0 +1,189 @@ + + + + + + + +OpenSPICE: Class Members + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- _ -

+ + +

- a -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- l -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/functions_func.html b/PySpice/Spice/OpenSPICE/html/functions_func.html new file mode 100644 index 00000000..16a50d3b --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/functions_func.html @@ -0,0 +1,189 @@ + + + + + + + +OpenSPICE: Class Members - Functions + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+  + +

- _ -

+ + +

- a -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- l -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- w -

+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/hierarchy.html b/PySpice/Spice/OpenSPICE/html/hierarchy.html new file mode 100644 index 00000000..5f57f847 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/hierarchy.html @@ -0,0 +1,127 @@ + + + + + + + +OpenSPICE: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 CPySpice.Spice.OpenSPICE.components.Capacitor
 Cdict
 CPySpice.Spice.OpenSPICE.Shared.Plot
 CPySpice.Spice.OpenSPICE.components.Inductor
 CPySpice.Spice.OpenSPICE.components.ISource
 CNameError
 CPySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError
 CPySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError
 CPySpice.Spice.OpenSPICE.Server.OpenSPICEServer
 CPySpice.Spice.OpenSPICE.Shared.OpenSPICEShared
 CPySpice.Spice.OpenSPICE.Shared.Vector
 CPySpice.Spice.OpenSPICE.components.VSource
 CABC
 CPySpice.Spice.OpenSPICE.components.Component
 CPySpice.Spice.OpenSPICE.components.Resistor
 CPySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy
 CPySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy
 CPySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy
 CPySpice.Spice.OpenSPICE.netlist.TextFmt
 CPySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt
 CPySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.ISourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.InductorTextFmt
 CPySpice.Spice.OpenSPICE.netlist.ResistorTextFmt
 CPySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt
 CPySpice.Spice.OpenSPICE.netlist.VSourceTextFmt
 CPySpice.Spice.OpenSPICE.solve.SolverStrategy
 CPySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy
 CPySpice.Spice.OpenSPICE.solve.TransientSolverStrategy
 CCircuitSimulator
 CPySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator
 CRawFileAbc
 CPySpice.Spice.OpenSPICE.RawFile.RawFile
 CVariableAbc
 CPySpice.Spice.OpenSPICE.RawFile.Variable
+
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/index.html b/PySpice/Spice/OpenSPICE/html/index.html new file mode 100644 index 00000000..0a9f35d6 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/index.html @@ -0,0 +1,82 @@ + + + + + + + +OpenSPICE: Main Page + + + + + + + + + +
+
+ + + + + + +
+
OpenSPICE +
+
Lightweight, Python-native electronic circuit simulator
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
OpenSPICE Documentation
+
+
+
+ + + + diff --git a/PySpice/Spice/OpenSPICE/html/jquery.js b/PySpice/Spice/OpenSPICE/html/jquery.js new file mode 100644 index 00000000..1dffb65b --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/PySpice/Spice/OpenSPICE/html/menu.js b/PySpice/Spice/OpenSPICE/html/menu.js new file mode 100644 index 00000000..b0b26936 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/PySpice/Spice/OpenSPICE/html/menudata.js b/PySpice/Spice/OpenSPICE/html/menudata.js new file mode 100644 index 00000000..762383cc --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/menudata.js @@ -0,0 +1,65 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"l",url:"functions.html#index_l"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"a",url:"functions_func.html#index_a"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}, +{text:"w",url:"functions_func.html#index_w"}]}]}]}]} diff --git a/PySpice/Spice/OpenSPICE/html/nav_f.png b/PySpice/Spice/OpenSPICE/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/nav_fd.png b/PySpice/Spice/OpenSPICE/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/nav_g.png b/PySpice/Spice/OpenSPICE/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/open.png b/PySpice/Spice/OpenSPICE/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + image/svg+xml + + + + + + + + diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_0.js b/PySpice/Spice/OpenSPICE/html/search/functions_0.js new file mode 100644 index 00000000..c5089419 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5f_5fcall_5f_5f_0',['__call__',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.html#a9b32d3efb2d703078900bab456442923',1,'PySpice::Spice::OpenSPICE::Server::OpenSPICEServer']]], + ['_5f_5finit_5f_5f_1',['__init__',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html#a45bcab4a9eb6e701b0ba87c8dd2bd3e1',1,'PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy.__init__()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.html#a988aec6662268a954e850913151b8258',1,'PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy.__init__()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a37d68d976f955cb5a279c5c9e25363f0',1,'PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared.__init__()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.html#acf61620112226d8dd1d6057f1da87ea0',1,'PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy.__init__()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.html#ad7d38403a82dec88ba02bc10d3a8257f',1,'PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy.__init__()']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_1.js b/PySpice/Spice/OpenSPICE/html/search/functions_1.js new file mode 100644 index 00000000..b2d9252e --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['alter_5fdevice_0',['alter_device',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a6f7dab12bd779d95a30bcdacc682555d',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['alter_5fmodel_1',['alter_model',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a2ba787abefd14c1c38cdc7cd3b74e81c',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_2.js b/PySpice/Spice/OpenSPICE/html/search/functions_2.js new file mode 100644 index 00000000..13112555 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['delete_0',['delete',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a5bf48a46eabd940a02014f7724e6f9d9',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['destroy_1',['destroy',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a467d0b7bf06b099ecb1544ad4dec587e',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['device_5fhelp_2',['device_help',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ab03f67ba8f07275fd1271266d18021d2',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_3.js b/PySpice/Spice/OpenSPICE/html/search/functions_3.js new file mode 100644 index 00000000..1d6fffbe --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exec_5fcommand_0',['exec_command',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#aab4ab016f018f9e6fa077297740a17aa',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_4.js b/PySpice/Spice/OpenSPICE/html/search/functions_4.js new file mode 100644 index 00000000..61038c73 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fix_5fcase_0',['fix_case',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.html#a92fae55aefb86094168d1f29a7bb1739',1,'PySpice::Spice::OpenSPICE::RawFile::RawFile']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_5.js b/PySpice/Spice/OpenSPICE/html/search/functions_5.js new file mode 100644 index 00000000..8f505f0b --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['gen_5feqn_5ffrom_5fbranch_0',['gen_eqn_from_branch',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html#aa758bb531654f0ecde1a7ac354093f83',1,'PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy.gen_eqn_from_branch()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.html#a8ffcd2311ae2eb7d682d229d4ab1b8a3',1,'PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy.gen_eqn_from_branch()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.html#a14658a496eebd4540f74e0fcf7a4c778',1,'PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy.gen_eqn_from_branch()']]], + ['gen_5feqns_1',['gen_eqns',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html#ad807f82bee170ec992bc45045d370e22',1,'PySpice::Spice::OpenSPICE::eqnstr::EqnStrStrategy']]], + ['gen_5fkcl_5feqns_2',['gen_kcl_eqns',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.html#a9825e3b57fefe5948f905bdb7603fc95',1,'PySpice::Spice::OpenSPICE::eqnstr::EqnStrStrategy']]], + ['gen_5ftxt_5fstr_3',['gen_txt_str',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.html#a973dc692c0ca4787ae14d8fbd590e2c9',1,'PySpice.Spice.OpenSPICE.netlist.TextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.html#aa898c5d718a876f08110033ed156b205',1,'PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.html#a809dcee0f8dbcc600ee29878b57fb5c9',1,'PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.html#a8b26e5c7d5d2237795dd7cfb7cbbfca4',1,'PySpice.Spice.OpenSPICE.netlist.InductorTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.html#a1ce38e2bdb46dd3d2ea62d0d09c1b2c2',1,'PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.html#a4ebf00a3da61fb48c0015fe3dd6e2713',1,'PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.html#af38b1b8666f2f8a65529dcd542df07a6',1,'PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.html#ac951e005392e3310cf2eb4d784a1fa53',1,'PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.html#a7ad533355bdad39c4b8364455d5a6420',1,'PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.html#a90d68eea5ce0d62c56f998b4a730f900',1,'PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.html#aeffc88eb6eae5c426a3a828b9d502001',1,'PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.html#a3dc82309536fd0478148818da021af98',1,'PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.html#a0f1c467846d3338bb5f769ba9f1343e6',1,'PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt.gen_txt_str()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.html#acd7115fa1041bcb82b596cbe89d9292e',1,'PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt.gen_txt_str()']]], + ['get_5fisrc_5fdata_4',['get_isrc_data',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a810f756e2166d7eb7e03f5fc49720cb8',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['get_5fvsrc_5fdata_5',['get_vsrc_data',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#acab2c42d747a063219aa30d29c340095',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_6.js b/PySpice/Spice/OpenSPICE/html/search/functions_6.js new file mode 100644 index 00000000..2dbcc5ee --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['halt_0',['halt',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#abafd3313bc4e91fc6d62aaeffb9b1368',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['has_5fcider_1',['has_cider',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a120390a0bc25d269e6a1550ebde19275',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['has_5fxspice_2',['has_xspice',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#affa0a362f5d1dae4e7c754198f8cb871',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_7.js b/PySpice/Spice/OpenSPICE/html/search/functions_7.js new file mode 100644 index 00000000..9ce1fbc7 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['last_5fplot_0',['last_plot',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a89441cbcf79f3d495c8378cf8335e691',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['load_5fcircuit_1',['load_circuit',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ae6168252554082ee5347a1cc380821ba',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_8.js b/PySpice/Spice/OpenSPICE/html/search/functions_8.js new file mode 100644 index 00000000..5ca5fe67 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['new_5finstance_0',['new_instance',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#aaf488b49a2e4a1c27885b62838f953bd',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_9.js b/PySpice/Spice/OpenSPICE/html/search/functions_9.js new file mode 100644 index 00000000..2ec92177 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['op_5fpt_5feqn_0',['op_pt_eqn',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.html#a39d990fbc97e25fd5d6ee640b4479bdb',1,'PySpice.Spice.OpenSPICE.components.Component.op_pt_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.html#af2854856cb75351027800ff8fe2b226f',1,'PySpice.Spice.OpenSPICE.components.Resistor.op_pt_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.html#aaf9b507f017790399af275a3cf19d2c6',1,'PySpice.Spice.OpenSPICE.components.Capacitor.op_pt_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.html#ad06a129aab82f87f4c3ee9f0ab1b3cbb',1,'PySpice.Spice.OpenSPICE.components.Inductor.op_pt_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.html#a162e750ddd6488d6b4bbb9742f1a73c5',1,'PySpice.Spice.OpenSPICE.components.VSource.op_pt_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.html#a045e7e1c272fa2f0c1bd873316cb8a55',1,'PySpice.Spice.OpenSPICE.components.ISource.op_pt_eqn()']]], + ['option_1',['option',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a06349026c87fc0c2890ce132bdb0395e',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_a.js b/PySpice/Spice/OpenSPICE/html/search/functions_a.js new file mode 100644 index 00000000..83367fed --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['plot_0',['plot',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a4b742ee2f4befee6aa540f30618374a6',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['plot_5fnames_1',['plot_names',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a02fc26f745fcf8cf9ec84aec4d913810',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_b.js b/PySpice/Spice/OpenSPICE/html/search/functions_b.js new file mode 100644 index 00000000..6699a16c --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['remove_5fcircuit_0',['remove_circuit',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a95fa7d686a732eaa519d7bf968090e29',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['reset_1',['reset',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a2a3974918483857a8d1e8c58c385f9a6',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['ressource_5fusage_2',['ressource_usage',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a2975560396ac271e6e0f2185114575b5',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['resume_3',['resume',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a1ddcc31222b376a2ee9f931363020259',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['run_4',['run',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a2f024a8880622974cce0e8d761dc7b35',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_c.js b/PySpice/Spice/OpenSPICE/html/search/functions_c.js new file mode 100644 index 00000000..d19fe8db --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_c.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['send_5fchar_0',['send_char',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a872f439f711ec7d344f2c0ace268d88e',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['send_5fdata_1',['send_data',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a73b6fce7ec12ee47a83190b851c137d1',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['send_5finit_5fdata_2',['send_init_data',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a4ab3fd2b7bfa431354e3323e813e0389',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['send_5fstat_3',['send_stat',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#af54da037bd4cbe7b0c9084b918c29475',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['set_4',['set',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a9fe67a8df71a72fda18d23bda4e06c1c',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['set_5fcircuit_5',['set_circuit',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ad3ff148a6bc0d76b456ab5e20c300115',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['solve_5feqns_6',['solve_eqns',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.html#a1adde88d9b0006e96ce7fcfad14b8be5',1,'PySpice.Spice.OpenSPICE.solve.SolverStrategy.solve_eqns()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.html#a7046e1818f18afb2e7bc32ecf07c664d',1,'PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy.solve_eqns()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.html#a369e30252265706d3adbfcf91613c963',1,'PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy.solve_eqns()']]], + ['source_7',['source',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a1f4a553731c211663406866339daac54',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['status_8',['status',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a24bb4f5c5c0f823688c0fc7976f6c472',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['step_9',['step',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#a982c0d1e975838cbcf688dddeb2ba162',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['stop_10',['stop',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ab6e523dc420dacad61780ca6fc176b9e',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_d.js b/PySpice/Spice/OpenSPICE/html/search/functions_d.js new file mode 100644 index 00000000..e40b01ad --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['to_5fwaveform_0',['to_waveform',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.html#a396d3934c33e9835f58647bfc140d078',1,'PySpice::Spice::OpenSPICE::Shared::Vector']]], + ['trace_1',['trace',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ae214794bb54d521a2cf205b069a0db59',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]], + ['trans_5feqn_2',['trans_eqn',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.html#a48e5b75381d3291d5ebda2cd2c817f4c',1,'PySpice.Spice.OpenSPICE.components.Component.trans_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.html#ae51955bca73419e44e93ca3d0c9ce027',1,'PySpice.Spice.OpenSPICE.components.Resistor.trans_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.html#a64077c9e67f757235858299bd3d97c0e',1,'PySpice.Spice.OpenSPICE.components.Capacitor.trans_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.html#ac341a3ff55622d333f6c98f3882c7845',1,'PySpice.Spice.OpenSPICE.components.Inductor.trans_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.html#af80cad45c7e98c2138ddee60d9a97456',1,'PySpice.Spice.OpenSPICE.components.VSource.trans_eqn()'],['../classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.html#a4806826ab24c1ce0971ca6977b00352f',1,'PySpice.Spice.OpenSPICE.components.ISource.trans_eqn()']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_e.js b/PySpice/Spice/OpenSPICE/html/search/functions_e.js new file mode 100644 index 00000000..ec85bb25 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unset_0',['unset',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ab6945dd05fcf1b3e7e2326660331be82',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/functions_f.js b/PySpice/Spice/OpenSPICE/html/search/functions_f.js new file mode 100644 index 00000000..99da535e --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/functions_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['where_0',['where',['../classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.html#ad6f50f9acb100a118c009d6aceb0a618',1,'PySpice::Spice::OpenSPICE::Shared::OpenSPICEShared']]] +]; diff --git a/PySpice/Spice/OpenSPICE/html/search/mag.svg b/PySpice/Spice/OpenSPICE/html/search/mag.svg new file mode 100644 index 00000000..9f46b301 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/mag.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/PySpice/Spice/OpenSPICE/html/search/mag_d.svg b/PySpice/Spice/OpenSPICE/html/search/mag_d.svg new file mode 100644 index 00000000..b9a814c7 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/mag_d.svg @@ -0,0 +1,37 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/PySpice/Spice/OpenSPICE/html/search/mag_sel.svg b/PySpice/Spice/OpenSPICE/html/search/mag_sel.svg new file mode 100644 index 00000000..03626f64 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/PySpice/Spice/OpenSPICE/html/search/mag_seld.svg b/PySpice/Spice/OpenSPICE/html/search/mag_seld.svg new file mode 100644 index 00000000..6e720dcc --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/mag_seld.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/PySpice/Spice/OpenSPICE/html/search/search.css b/PySpice/Spice/OpenSPICE/html/search/search.css new file mode 100644 index 00000000..19f76f9d --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/PySpice/Spice/OpenSPICE/html/search/search.js b/PySpice/Spice/OpenSPICE/html/search/search.js new file mode 100644 index 00000000..e103a262 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + searchResults.Search(searchValue); + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/splitbard.png b/PySpice/Spice/OpenSPICE/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/sync_off.png b/PySpice/Spice/OpenSPICE/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/sync_on.png b/PySpice/Spice/OpenSPICE/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/tab_a.png b/PySpice/Spice/OpenSPICE/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/tab_ad.png b/PySpice/Spice/OpenSPICE/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/tab_s.png b/PySpice/Spice/OpenSPICE/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/tab_sd.png b/PySpice/Spice/OpenSPICE/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/html/tabs.css b/PySpice/Spice/OpenSPICE/html/tabs.css new file mode 100644 index 00000000..71c8a470 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/PySpice/Spice/OpenSPICE/latex/Makefile b/PySpice/Spice/OpenSPICE/latex/Makefile new file mode 100644 index 00000000..07f226d4 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/Makefile @@ -0,0 +1,27 @@ +LATEX_CMD?=pdflatex +MKIDX_CMD?=makeindex +BIBTEX_CMD?=bibtex +LATEX_COUNT?=8 +MANUAL_FILE?=refman + +all: $(MANUAL_FILE).pdf + +pdf: $(MANUAL_FILE).pdf + +$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex + $(LATEX_CMD) $(MANUAL_FILE) + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + latex_count=$(LATEX_COUNT) ; \ + while egrep -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + $(LATEX_CMD) $(MANUAL_FILE) ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/PySpice/Spice/OpenSPICE/latex/annotated.tex b/PySpice/Spice/OpenSPICE/latex/annotated.tex new file mode 100644 index 00000000..6497eea1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/annotated.tex @@ -0,0 +1,38 @@ +\doxysection{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+ISource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+VSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Capacitor}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Capacitor\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+CCCSSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+CCVSSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Op\+Pt\+Strategy}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+ISource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+VSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Inductor}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Inductor\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+ISource}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+ISource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECircuit\+Error}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Simulation.\+Open\+SPICECircuit\+Simulator}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECommand\+Error}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Server.\+Open\+SPICEServer}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICEShared}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Plot}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Raw\+File}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Resistor\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Solver\+Strategy}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Variable}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCCSSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCVSSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Vector}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+VSource}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VSource\+Text\+Fmt}} }{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt}}{} +\end{DoxyCompactList} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.eps new file mode 100644 index 00000000..e0156770 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 147.058823 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.400000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.RawFile.RawFile) cw +(RawFileAbc) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.RawFile.RawFile) 0.000000 0.000000 box + (RawFileAbc) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf new file mode 100644 index 0000000000000000000000000000000000000000..76102de79b6a02dbfdb581e4c6cd9702d10bdb43 GIT binary patch literal 5729 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.tex new file mode 100644 index 00000000..70a44966 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.tex @@ -0,0 +1,31 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Variable Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable}\index{PySpice.Spice.OpenSPICE.RawFile.Variable@{PySpice.Spice.OpenSPICE.RawFile.Variable}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Variable\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_a2228a16b928ef40dfa2030aecd787457}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_a2228a16b928ef40dfa2030aecd787457}} +def {\bfseries is\+\_\+voltage\+\_\+node} (self) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_afdbd329fcc15ec41ff4570d31a088ff9}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_afdbd329fcc15ec41ff4570d31a088ff9}} +def {\bfseries is\+\_\+branch\+\_\+current} (self) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_ad58306879a233a6d8f90bbd8fc7d9fb4}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_ad58306879a233a6d8f90bbd8fc7d9fb4}} +def {\bfseries simplified\+\_\+name} (self) +\end{DoxyCompactItemize} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_ae86c0cc4ad99b894d9d2e8e585f3388e}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_ae86c0cc4ad99b894d9d2e8e585f3388e}} +def {\bfseries to\+\_\+voltage\+\_\+name} (node) +\end{DoxyCompactItemize} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Raw\+File.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.tex new file mode 100644 index 00000000..cde501d1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.tex @@ -0,0 +1,43 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+Server.\+Open\+SPICEServer Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer}\index{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer@{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer}} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_ac6249afc8682cc156b9f47321ae3789d}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_ac6249afc8682cc156b9f47321ae3789d}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, $\ast$$\ast$kwargs) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a9b32d3efb2d703078900bab456442923}{\+\_\+\+\_\+call\+\_\+\+\_\+}} (self, spice\+\_\+input) +\end{DoxyCompactItemize} +\doxysubsection*{Static Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a672788a58688ec90b2a61452106fb845}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a672788a58688ec90b2a61452106fb845}} +string {\bfseries Open\+SPICE\+\_\+\+COMMAND} = \textquotesingle{}python3 -\/m Open\+SPICE\textquotesingle{} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}This class wraps the execution of OpenSPICE and convert the output to a Python data structure. + +Example of usage:: + + spice_server = OpenSPICEServer() + raw_file = spice_server(spice_input) + +It returns a :obj:`PySpice.Spice.RawFile` instance.\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a9b32d3efb2d703078900bab456442923}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a9b32d3efb2d703078900bab456442923}} +\index{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer@{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer}!\_\_call\_\_@{\_\_call\_\_}} +\index{\_\_call\_\_@{\_\_call\_\_}!PySpice.Spice.OpenSPICE.Server.OpenSPICEServer@{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer}} +\doxysubsubsection{\texorpdfstring{\_\_call\_\_()}{\_\_call\_\_()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+Server.\+Open\+SPICEServer.\+\_\+\+\_\+call\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{spice\+\_\+input }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Run SPICE in server mode as a subprocess for the given input and return a +:obj:`PySpice.RawFile.RawFile` instance.\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Server.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.eps new file mode 100644 index 00000000..755cceab --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 112.044815 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.462500 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError) cw +(NameError) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError) 0.000000 0.000000 box + (NameError) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ab421c5680c6a8bde33b03de2b6bcb498f29bfa GIT binary patch literal 6028 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.tex new file mode 100644 index 00000000..44237375 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.tex @@ -0,0 +1,13 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECircuit\+Error Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError}\index{PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError@{PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECircuit\+Error\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError} +\end{center} +\end{figure} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Shared.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.eps new file mode 100644 index 00000000..bb4414e0 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 106.666664 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.687500 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError) cw +(NameError) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError) 0.000000 0.000000 box + (NameError) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4798528ef2f9fc616d9506528e7643ce75cff81e GIT binary patch literal 5843 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 1', 'v(1) > 10', after=10) + +A when condition can use theses symbols: = <> > < >= <=.\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ae214794bb54d521a2cf205b069a0db59}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ae214794bb54d521a2cf205b069a0db59}} +\index{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!trace@{trace}} +\index{trace@{trace}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}} +\doxysubsubsection{\texorpdfstring{trace()}{trace()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICEShared.\+trace (\begin{DoxyParamCaption}\item[{}]{self, }\item[{$\ast$}]{args }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Trace nodes\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab6945dd05fcf1b3e7e2326660331be82}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab6945dd05fcf1b3e7e2326660331be82}} +\index{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!unset@{unset}} +\index{unset@{unset}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}} +\doxysubsubsection{\texorpdfstring{unset()}{unset()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICEShared.\+unset (\begin{DoxyParamCaption}\item[{}]{self, }\item[{$\ast$}]{args }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Unset variables\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ad6f50f9acb100a118c009d6aceb0a618}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ad6f50f9acb100a118c009d6aceb0a618}} +\index{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!where@{where}} +\index{where@{where}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}} +\doxysubsubsection{\texorpdfstring{where()}{where()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICEShared.\+where (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Identify troublesome node or device\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Shared.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.eps new file mode 100644 index 00000000..490eb676 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 163.934433 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.050000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.Shared.Plot) cw +(dict) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.Shared.Plot) 0.000000 0.000000 box + (dict) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55d0f2af6dae216139d95afb6b679b863b32ec85 GIT binary patch literal 5714 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 Z5s3H8l$bz)sU1(JQ7NE#?BMB0_zyO{i{bzP literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.tex new file mode 100644 index 00000000..d3f33d08 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.tex @@ -0,0 +1,48 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Plot Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot}\index{PySpice.Spice.OpenSPICE.Shared.Plot@{PySpice.Spice.OpenSPICE.Shared.Plot}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Plot\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a6aa560820c3f6137c6d2382bc178d44b}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a6aa560820c3f6137c6d2382bc178d44b}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, simulation, plot\+\_\+name) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_af2faa6587b7873e82fed3c0fd96fe05d}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_af2faa6587b7873e82fed3c0fd96fe05d}} +def {\bfseries nodes} (self, to\+\_\+float=False, abscissa=None) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a7ec829a77d9a04b08fe3db8d75ec454c}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a7ec829a77d9a04b08fe3db8d75ec454c}} +def {\bfseries branches} (self, to\+\_\+float=False, abscissa=None) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a08abc7b5e0bed955de5817adcd0f2e7f}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a08abc7b5e0bed955de5817adcd0f2e7f}} +def {\bfseries internal\+\_\+parameters} (self, to\+\_\+float=False, abscissa=None) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a49a1bb6e60767ef756d2cfcd6566b375}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a49a1bb6e60767ef756d2cfcd6566b375}} +def {\bfseries elements} (self, abscissa=None) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a24daff7f9c334b655ada4c998d3ab159}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a24daff7f9c334b655ada4c998d3ab159}} +def {\bfseries to\+\_\+analysis} (self) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a5151dcf3583387f7110c74e011dbd39c}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a5151dcf3583387f7110c74e011dbd39c}} +{\bfseries plot\+\_\+name} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb} This class implements a plot in a simulation output. + +Public Attributes: + + :attr:`plot_name`\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Shared.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.tex new file mode 100644 index 00000000..69a38eb4 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.tex @@ -0,0 +1,50 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Vector Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector}\index{PySpice.Spice.OpenSPICE.Shared.Vector@{PySpice.Spice.OpenSPICE.Shared.Vector}} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_ad330afc88a6d62d46ba8809989f4ddf2}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_ad330afc88a6d62d46ba8809989f4ddf2}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, ngspice\+\_\+shared, name, type\+\_\+, data) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_acba185990e750c258df8edfaf026a6d4}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_acba185990e750c258df8edfaf026a6d4}} +def {\bfseries \+\_\+\+\_\+repr\+\_\+\+\_\+} (self) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a4c3e88b20f6f7c6d75e3696fdfc411da}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a4c3e88b20f6f7c6d75e3696fdfc411da}} +def {\bfseries is\+\_\+interval\+\_\+parameter} (self) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a53073c514ff8f3442a8a1de27957351e}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a53073c514ff8f3442a8a1de27957351e}} +def {\bfseries is\+\_\+voltage\+\_\+node} (self) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a9eb08ad6a8d4032c193ea71e0a5dc5ea}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a9eb08ad6a8d4032c193ea71e0a5dc5ea}} +def {\bfseries is\+\_\+branch\+\_\+current} (self) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_acf0baf55206851b9b2e5ea1dc3858c41}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_acf0baf55206851b9b2e5ea1dc3858c41}} +def {\bfseries simplified\+\_\+name} (self) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a396d3934c33e9835f58647bfc140d078}{to\+\_\+waveform}} (self, abscissa=None, to\+\_\+real=False, to\+\_\+float=False) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb} This class implements a vector in a simulation output. + +Public Attributes: + + :attr:`data` + + :attr:`name`\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a396d3934c33e9835f58647bfc140d078}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a396d3934c33e9835f58647bfc140d078}} +\index{PySpice.Spice.OpenSPICE.Shared.Vector@{PySpice.Spice.OpenSPICE.Shared.Vector}!to\_waveform@{to\_waveform}} +\index{to\_waveform@{to\_waveform}!PySpice.Spice.OpenSPICE.Shared.Vector@{PySpice.Spice.OpenSPICE.Shared.Vector}} +\doxysubsubsection{\texorpdfstring{to\_waveform()}{to\_waveform()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Vector.\+to\+\_\+waveform (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{abscissa = {\ttfamily None}, }\item[{}]{to\+\_\+real = {\ttfamily False}, }\item[{}]{to\+\_\+float = {\ttfamily False} }\end{DoxyParamCaption})} + +\begin{DoxyVerb} Return a :obj:`PySpice.Probe.WaveForm` instance. \end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Shared.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.eps new file mode 100644 index 00000000..8426e568 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 101.265823 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.937500 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator) cw +(CircuitSimulator) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator) 0.000000 0.000000 box + (CircuitSimulator) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf91ceae14ece29e53b34d487e4bfce6addfb911 GIT binary patch literal 5758 zcmb_AcR*8D_wEtV4?z(H=@W$@7+waMlGqT4Y>**K)QkrNlDv?-K){6}f~er0peTw9 zq>ie9h*Ya6R%?H^wP+GA3 ztIR_LD=Rl;94ZlEGE~WdA~g^x79vUg`9c>zFnas=@&o-{z|4ssAaDhv09B{}u~;UT zVF{i{93tleVGv2HM`~4TAYfFfN5m2B5yR5LIFtE~eH3VNw@`7?JYj@;?CiS`76=F%gFN ziXsusOxPP$0%8IkB15P+n&9XNdm_q6EDB-(h#w4W!4NeB3*~^t8Ihn;gvTRjFf}4l z5Oi5P{Jeawk_}2f1$B-w_sqJcNJRD;5*fAgl1?Z{p%=8ZYdbqw-8uVAM^8Hb_Qu)n z{Z%I8DSLJ6O5|6XMuj%nr(X?ZbOu~`9G0HtcdPkyuwY5~?yci^)!S!0bEvvf-)uMU z=O^hO-@FukTR845u-siEf2 zy4xITl1z;^DbO0v3U}X*+KeQ^@(AOf*2&Fh-y5Y~)Z=3tx$Y9#dQY^;i*r3Udq+v` zB|eh2aEph3GF*#gZfQ$lueMbQUDj8B$Y}0b?6iEy`-M~5V-D}wP+)MXW2aNv4|BVj z9>UvA-sa+)fi{-;R_|>xZW8mMlV!tGTBz#!BWv1|mCwxzsOk3*rL^B!V1_#wcPl

    q`N^3haRN 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 G68;aktDX@6 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.tex new file mode 100644 index 00000000..45d2f1c3 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator.tex @@ -0,0 +1,28 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+Simulation.\+Open\+SPICECircuit\+Simulator Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator}\index{PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator@{PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+Simulation.\+Open\+SPICECircuit\+Simulator\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_aecf97a60152602696eaaafa443ada617}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_aecf97a60152602696eaaafa443ada617}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, circuit, $\ast$$\ast$kwargs) +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_aa60a584f430c8dbf67371102ea9c3167}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_aa60a584f430c8dbf67371102ea9c3167}} +def {\bfseries str\+\_\+options} (self) +\end{DoxyCompactItemize} +\doxysubsection*{Static Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_a389a78a5a2e263e68bd8d7d5cdea203f}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_a389a78a5a2e263e68bd8d7d5cdea203f}} +string {\bfseries SIMULATOR} = \textquotesingle{}Open\+SPICE\textquotesingle{} +\end{DoxyCompactItemize} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +Simulation.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.tex new file mode 100644 index 00000000..5844174f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.tex @@ -0,0 +1,67 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Capacitor Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor}\index{PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_aaf9b507f017790399af275a3cf19d2c6}{op\+\_\+pt\+\_\+eqn}} (branch, node) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_a64077c9e67f757235858299bd3d97c0e}{trans\+\_\+eqn}} (branch, node) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Class that represents a capacitor. Class contains +methods for formatting equation strings for use in the final system +of equations solved at each simulation timestep. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_aaf9b507f017790399af275a3cf19d2c6}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_aaf9b507f017790399af275a3cf19d2c6}} +\index{PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}!op\_pt\_eqn@{op\_pt\_eqn}} +\index{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}} +\doxysubsubsection{\texorpdfstring{op\_pt\_eqn()}{op\_pt\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Capacitor.\+op\+\_\+pt\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for capacitor. + +Equation format: ((x[branch current]) - (0.00)) + +Note: At steady state, capacitors act as open circuits. Therefore, +the current must be 0.00. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_a64077c9e67f757235858299bd3d97c0e}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_a64077c9e67f757235858299bd3d97c0e}} +\index{PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}!trans\_eqn@{trans\_eqn}} +\index{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}} +\doxysubsubsection{\texorpdfstring{trans\_eqn()}{trans\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Capacitor.\+trans\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate transient equation for the capacitor. + +There are two cases. The first case is t = 0.00, the simulation start +point. Here, the equation string is as follows: + +"(((x[node_plus index])-(x[node_minus index]))-(initial voltage))" + +This is the initial condition. The second case is t != 0.00, or the +"else" case: + +"(((x[branch current])*dt)-((capacitance value)* + ((dv[node_plus index])-(dv[node_minus index]))))" + +This is a rearrangement of the differential equation I = CdV/dt --> +Idt - CdV = 0. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +components.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.eps new file mode 100644 index 00000000..03a97e4a --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 192.307693 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.600000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.components.Component) cw +(ABC) cw +(PySpice.Spice.OpenSPICE.components.Resistor) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.components.Component) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + (PySpice.Spice.OpenSPICE.components.Resistor) 0.000000 0.000000 box + +% ----- relations ----- + +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in +solid +1 0.000000 0.250000 out +solid +0 0.000000 0.750000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.pdf new file mode 100644 index 0000000000000000000000000000000000000000..919bf8d40c04f3fe147fb36d39fea108b72dbb7d GIT binary patch literal 6012 zcmb_Ad0b5E`xoWbL{#SB}>!HX&TMeoHH$CiRe-)WXY|N zLUOGsTB$6N5JDnUmO}PO_`PQ;%l+Qp_ufCg=QN%7eYW@6-uLr9kD0fV3yEUIAefzf znvzX0Gjmf!Dn&v}s#MrO5)>juKqRq%>*CA@Ur#S@uAjgej2yYXJXi4LDdj3a93quT zu^4wG5|MF$Fo=XYInQ?EIdfFv&?vPOLjc4}gQ+x_i&TbiW&lpGuE5#X*UfXLU<#~K zBj67O%ZWXN(E?2fieTO%j6)%l0jPKGqEuig2UBZ+FtM{d1QBy(vLAq44W{HPF(HO{ z3nd6T1@=@b05O39ks)QsLV}$g?2afTSQx|v5Izia!4NeByT|~G6CzTI5qo2gg#NyUr*=fd%d0}SN&9sf!5r@2=oX_9fe72Kw z8+G6&nJ#^Fbg#obgYnBd%(GImD}4;R&;U-=TB-nkfV1;ho=N!M^X8jf;4zKw*r@bny>DS{Y*#%BN zAF5`bSc9I)y2;G>82Lxxz$a;D`KG&xUnbSBPC^X>*BhQ*YP%yQX6_`flA`c-r+Tvu zrfq&u{=(5qg6Jbvb2bk7Wbn##lZ$&3bRQYpW34AGu9@Z~bxY=z6_41W%s@BXE~L%> zB|c>Jn^CuStuy#^XZf{cw|(=214OzPN+zk+(Q-7ijs=w)7u~)eA6`|p=Jw42U8YsP z`lkvGRt%S>N?z#aKD;^vQHc8-4@P*f@DSl&8q=E42cmzAqi>7~f$=EA9*9^fbW}z| zL1chtfP|s2sa7<~JOaS05d{X(@L&^QK7uMWY7v5hH1Jj{MFIp1f3@O0Mw@jF0VJ804vY~(kg;N@GPkqg@OpUntZ}M2uRQXiIneH zDPLLpIC(-$C{s%MMf9oafnY*0z(5q7;rq35_4-noZ%weqvELNKr+r9AA&TJkz%EXX zyxDUse5G;(CGnMVp+ak?6M~A=QWd6DLo8f~Rvj${_(7^hF}3m@YfoQ@C*Py0{-n?iN<1oN2A4pXge#wewQjFz$gV*fl9y5!D)lx z*@cIe^3A#U8hy^yCLiwIZ(h{8&QmBy{y&F1f)oWAN}^I&Kure3WYOl~2M;)6X>N`T!!zDPw}g+zvc5WoTqk#W1P>@kd2^TxJHkBJ8FqucU~iZY3t$n9z*1NaD_|w8f>nrGsuaU& z7=ZUW)v37k!u#li69)oVmC&cKnJl zPAXQ$z3PGK1(>GPaWiSb@%e5E5s!1ZZ>UzGt*9LR<3j;!>&a7d$Jchu=~gW=&xjd6 zKE?5tNGGLgP1B~QpD&ibZ*6vQ+P~IkRCtyqhjZfjLWu2e+&%We)4UbnP#)4xwy5xxOF&^sO z?J_r(yFxaUYv)|bwIn|Heb1V*YJzE;>(qB6EY{FNOkVzaI61(pC;6tEZ0ft=DMpC_ zYxO2hHdCMl85Ue0uAqrA*VgOYh5N@|Z+UsWC*>UL)xfvZHbD)wL5U=ex2! zW;|)DHPaAi8KM54NoTkfMXh=@t#u|*6pN%{EPwC#dYimAQ=W5+jvgy_rs@uRd5V{n ztQupT7Q9l=;+UTs)7Nm_wOHNb@eXmrhPSjNT-My2Ww3|6z4m0`FN(9K=ekn!Jm(o0 zLM(2XX7}wS<98h`bGDtDly>Afy}iCYb)uT%JEyEhZky=9Te2}G;zFG1vjaD(qw*Hc zRL8_k4}|OaL+hq3rn!_)Te2)^-;X>Qv@Cs%G3~6ItEha`(u6&h12{%a6*=S1-TI_+*MIY3Z@;}Yd5v*C+jiE# zag>Q+(-(JL5j}h7_R;9npnEpWvu?f6SvuX!wsLgk>1~#Ks3x zf~#xmKVEV)kN^B^5)@|^ULjmc%JbHf9B?9E7)xz=`?!f$CPIu($J`m(Gr2pmz1xFg zdr-LH^T)9XZGYI#yj)ZHoA>JruCvnXqILX3$^;9xH)J&)pQNnxaV{BI)VcYJG@)eQFsIK2^f_)vNUkl8cAY#}?`92nTXuTI=0z^k;fZW_fy1)m z&K52^L7jY*P7%DKAQ4Y3E*x~dwiff<_-SmU5X(MQx`4Xf>;BY@?79^?lHj2n%kjly zw-#$6X|GcQQY&?GoxyE#*pM~6uwduKZ|U@P>hkSv_01^1r1q1D?C7mf{L?woiz-?hbHuqbCVCEUTSF(G;4TcM6{DwKcYa^Zlt>otcmW^`H* zXY7mcXN4H2g{;dXS6|CkFN!C`E#9BHt2ATAMODWb?y-c}J3GUV&FAje-P7_Y_UyKW zwHHHD?#{cq!spcO#GJJdZVT0`i4!l5bqRaR=C_Ea*ZlskFYY%&OJG<{h-{Mu`o_7o7HqWGN|m< zmc~fEj>DeEW(MW>Z{B1Q@N|=9;YtQcc=~Dgt6Mm%6q5cO2 zqa4qsE9-l>p3P_Hc25r=x;JO}k4w4Ic++cncSQG@J#ofIubHuTE7GFEN)GR>$Upk% z!8_|ISNX}UZLWOU=!5sijF?hdGWfXUOylZ758|>sn=g+p@a`Iv`Z126dh9pc%)L3o zta(*SM8l4r4WR{%%Ch8p;{xAi#dts2qHBnmwfL4Um_oX_T~Iny>6rBXA?mPX@khe& zmXL>r`;C~*Y>Im5f~vB$o7c&@Cs1`BFVkfam**@Pu)*Lk#0ap$E^@PGQx(Ul^#)<>&k6 zy?RZfyS@LZ?(sPj&vcufp9YP&)Lm|}Y-Hv()@{zZTUYLe%5O0SKXPHss9j;mYGN{@ zlzt4q#-i*G&(fZKXg`1Py6pMH&Ybxnn&6UE!NluIdC}XJlK1i(PMvxY*UXQ~S<5!-AC4YL7F4S3!nPgs5*Mos8>5tJ#&fXs^f?q3o~mQoyxNo7L-g-lo%u~T1G9+I-H29V#FjC{k;}(K(Ykt0*-Hh^OMaQ1Jt6Ps!UN5mp_B7M zMzgD1UzfOXWqa=2Y1a=w^XypWb(z_x$4~YNgv-m1e{9)4vKiUjlxC-yzSziX*OQm) zJ0xc=y!Kq1U=TE`@xjflL()6MGZ(0{Q03r|F@{#QrS-hsH#HXvDLTaIPs1<<{monV zg6-8|M{Jjs#IN^hh(0=9c)$6;D{uXqmqU>+MsKfOj<0C(NV3w5n(4OH?)*4O-raEF z0)F&fqnX08nw4H_poA3(=)v+M*16(N`@;|Ur%u{u#3fo}NAA4+)G@W%O2^H>AnxO% zRXZx&wpa<1eH!8kJX4EVs%^_JoER|I%I@<@@7=z}=Rc;ctol^Ot1|mUb^CqiCQmij z#e&`aLXwhXvvOtU#G#)@b9+qoJ-L^U7d$@}W!fA3_qX8wO6A*SFTlgS|E5Qw(!SmF z>}Eu(graZ+gF+CARKX#3mQ)ZSshC6bXLyi3R6Hb1>bgjc2o`zziWY^7*ka-gdxG5z zA*cosQnXM-3e}eDC#4j9^Me9RLa7o7(}&VTTw_9nk5vf2KV+Tr8*pHZuWSm`N~@EVNGXS< z0Wigi4EHb8UqgU~3xqE$3{h$@j;U#%6wpBVdoch3N9wPN6YQplf1JB?AXgfFoJH6ow7O z+J?*|ky$omvK{;vN)Rf*$^*?6&}{h^tlv?7$EsBOf&kh(DWhW~h@y89EoC3V4#u7M zot^*Ea-qt@iAgaTVy{hQt_5+k8PjSM5&^JGF4#f#To=gFk@ zy#p;H{7o1biSY0#)xGirNJPKjK8~-fS`^OumEmvVq6LAC20{dX-NyC==zsM5?*x52 zyTFOaAx7aR(|??e)Nc)f{@rN)cbjoKsKs$Ff(?&v19K-Ed=G&Vo<(6$thL*RNG1~j z8Q5n3K;er=+5Bt#`b8_%=6xFkKtNYC3;?Fv+xPXaqSZ(!Xr)l71UyH3ABf3d&=^oC z)DL6fO%?os6#Xy;9dG;m2qUv7pe6Me7?TAWG=G6nssAC5%w&Sr+F$6{*1(TH!YDK< zXoLL-BeUtCh4dqg!eE0Y(vL7Yh5ns9Of3YB3^iy3L$E-)2mwBTV7^ibnsj()1A^TY zp-Ko3BK41b+)GQs4Qy+oy}yp(5W=4wKbPaq4Q`wNBe)Kn1}cOP)w-C Rw2o&mDQwVYclL52{2vBXBGUi> literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.tex new file mode 100644 index 00000000..42e01843 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.tex @@ -0,0 +1,80 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component}\index{PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component} +\end{center} +\end{figure} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a39d990fbc97e25fd5d6ee640b4479bdb}{op\+\_\+pt\+\_\+eqn}} (branch, node) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a48e5b75381d3291d5ebda2cd2c817f4c}{trans\+\_\+eqn}} (branch, node) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Abstract class that represents an electrical component. Class contains +methods for formatting equation strings for use in the final system +of equations solved at each simulation timestep. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a39d990fbc97e25fd5d6ee640b4479bdb}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a39d990fbc97e25fd5d6ee640b4479bdb}} +\index{PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}!op\_pt\_eqn@{op\_pt\_eqn}} +\index{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}} +\doxysubsubsection{\texorpdfstring{op\_pt\_eqn()}{op\_pt\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component.\+op\+\_\+pt\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Return an equation string for the component. The equation string is +the left hand side of f(x) = 0, where x is an array. The initial +elements of the array are the node voltages. The latter portion of the +array is a list of the branch currents in the circuit. A system of +these equation strings is solved at each timestep so we can acquire the +voltages and currents. + +f(x) usually represents the IV characteristic of a component. +For instance, if g(I) = V for the component of interest, +f(x) = g(I) - V = 0 is a valid equation string. It would usually be +represented in the form g(I) - V. Similarly, h(V) = I --> +f(x) = h(V) - I = 0 would also work. It is usually just some condition +that must hold by definition for this component. + +As of now, only components with two terminals are considered. + +op_pt_eqn in particular focuses only on operating point simulations. +So, users are advised to avoid using any x_prev expressions. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +Reimplemented in \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_af2854856cb75351027800ff8fe2b226f}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor}}. + +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a48e5b75381d3291d5ebda2cd2c817f4c}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a48e5b75381d3291d5ebda2cd2c817f4c}} +\index{PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}!trans\_eqn@{trans\_eqn}} +\index{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}} +\doxysubsubsection{\texorpdfstring{trans\_eqn()}{trans\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component.\+trans\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Same as op_pt_eqn except for transient simulations. Feel free +to use x_prev in these. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +Reimplemented in \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_ae51955bca73419e44e93ca3d0c9ce027}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +components.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.tex new file mode 100644 index 00000000..c4529e72 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.tex @@ -0,0 +1,60 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+ISource Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource}\index{PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a045e7e1c272fa2f0c1bd873316cb8a55}{op\+\_\+pt\+\_\+eqn}} (branch, node) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a4806826ab24c1ce0971ca6977b00352f}{trans\+\_\+eqn}} (branch, node) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Class that represents a current source. Class contains +methods for formatting equation strings for use in the final system +of equations solved at each simulation timestep. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a045e7e1c272fa2f0c1bd873316cb8a55}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a045e7e1c272fa2f0c1bd873316cb8a55}} +\index{PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}!op\_pt\_eqn@{op\_pt\_eqn}} +\index{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}} +\doxysubsubsection{\texorpdfstring{op\_pt\_eqn()}{op\_pt\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+ISource.\+op\+\_\+pt\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for current source. + +Equation format: ((x[branch current]) - (current value)) + +In other words, the branch current must be the source's current +value. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a4806826ab24c1ce0971ca6977b00352f}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a4806826ab24c1ce0971ca6977b00352f}} +\index{PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}!trans\_eqn@{trans\_eqn}} +\index{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}} +\doxysubsubsection{\texorpdfstring{trans\_eqn()}{trans\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+ISource.\+trans\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for current source. + +Equation format: ((x[branch current]) - (current value)) + +In other words, the branch current must be the source's current +value. + +Note: Equation is the same as op point case. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +components.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.tex new file mode 100644 index 00000000..e4350450 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.tex @@ -0,0 +1,68 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Inductor Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor}\index{PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ad06a129aab82f87f4c3ee9f0ab1b3cbb}{op\+\_\+pt\+\_\+eqn}} (branch, node) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ac341a3ff55622d333f6c98f3882c7845}{trans\+\_\+eqn}} (branch, node) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Class that represents an inductor. Class contains +methods for formatting equation strings for use in the final system +of equations solved at each simulation timestep. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ad06a129aab82f87f4c3ee9f0ab1b3cbb}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ad06a129aab82f87f4c3ee9f0ab1b3cbb}} +\index{PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}!op\_pt\_eqn@{op\_pt\_eqn}} +\index{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}} +\doxysubsubsection{\texorpdfstring{op\_pt\_eqn()}{op\_pt\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Inductor.\+op\+\_\+pt\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for inductor. + +Equation format: (((x[node_plus index]) - (x[node_minus index])) - + (0.00)) + +Note: At steady state, inductors act as short circuits. Therefore, +the branch voltage drop must be 0.00. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ac341a3ff55622d333f6c98f3882c7845}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ac341a3ff55622d333f6c98f3882c7845}} +\index{PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}!trans\_eqn@{trans\_eqn}} +\index{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}} +\doxysubsubsection{\texorpdfstring{trans\_eqn()}{trans\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Inductor.\+trans\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate transient equation for the inductor. + +There are two cases. The first case is t = 0.00, the simulation start +point. Here, the equation string is as follows: + +"((x[branch current])-(initial current value))" + +This is the initial condition. The second case is t != 0.00, or the +"else" case: + +"((((x[node_plus index])-(x[node_minus index]))*dt)- + ((inductance value)*((di))))" + +This is a rearrangement of the differential equation V = Ldi/dt --> +Vdt - Ldi = 0. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +components.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.eps new file mode 100644 index 00000000..32c06e5e --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 192.307693 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.600000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.components.Resistor) cw +(PySpice.Spice.OpenSPICE.components.Component) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.components.Resistor) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.components.Component) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.pdf new file mode 100644 index 0000000000000000000000000000000000000000..13c50c30ae03e660dc860244ffa50992c31fc4a4 GIT binary patch literal 6014 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 ZP`v+#VnQ{hb3B7drGQ4eqo)(${{S(nDR=+? literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.tex new file mode 100644 index 00000000..51768cc1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.tex @@ -0,0 +1,72 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor}\index{PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor} +\end{center} +\end{figure} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_af2854856cb75351027800ff8fe2b226f}{op\+\_\+pt\+\_\+eqn}} (branch, node) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_ae51955bca73419e44e93ca3d0c9ce027}{trans\+\_\+eqn}} (branch, node) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Class that represents a resistor. Class contains +methods for formatting equation strings for use in the final system +of equations solved at each simulation timestep. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_af2854856cb75351027800ff8fe2b226f}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_af2854856cb75351027800ff8fe2b226f}} +\index{PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}!op\_pt\_eqn@{op\_pt\_eqn}} +\index{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}} +\doxysubsubsection{\texorpdfstring{op\_pt\_eqn()}{op\_pt\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor.\+op\+\_\+pt\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for resistor. + +Equation format: ((x[node_plus voltage index] - + (x[node_minus voltage index])) - + ((x[branch current])*(resistance))) + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a39d990fbc97e25fd5d6ee640b4479bdb}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component}}. + +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_ae51955bca73419e44e93ca3d0c9ce027}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_ae51955bca73419e44e93ca3d0c9ce027}} +\index{PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}!trans\_eqn@{trans\_eqn}} +\index{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}} +\doxysubsubsection{\texorpdfstring{trans\_eqn()}{trans\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor.\+trans\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate transient equation for resistor. + +Equation format: ((x[node_plus voltage index] - + (x[node_minus voltage index])) - + ((x[branch current])*(resistance))) + +Note: Equation is the same as op point case. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a48e5b75381d3291d5ebda2cd2c817f4c}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +components.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.tex new file mode 100644 index 00000000..9e3f4bfe --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.tex @@ -0,0 +1,62 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+VSource Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource}\index{PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}} +\doxysubsection*{Static Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_a162e750ddd6488d6b4bbb9742f1a73c5}{op\+\_\+pt\+\_\+eqn}} (branch, node) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_af80cad45c7e98c2138ddee60d9a97456}{trans\+\_\+eqn}} (branch, node) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Class that represents a voltage source. Class contains +methods for formatting equation strings for use in the final system +of equations solved at each simulation timestep. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_a162e750ddd6488d6b4bbb9742f1a73c5}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_a162e750ddd6488d6b4bbb9742f1a73c5}} +\index{PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}!op\_pt\_eqn@{op\_pt\_eqn}} +\index{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}} +\doxysubsubsection{\texorpdfstring{op\_pt\_eqn()}{op\_pt\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+VSource.\+op\+\_\+pt\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for voltage source. + +Equation format: (((x[node_plus index]) - (x[node_minus index])) - + (voltage value)) + +In other words, the branch voltage drop must be the source's voltage +value. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_af80cad45c7e98c2138ddee60d9a97456}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_af80cad45c7e98c2138ddee60d9a97456}} +\index{PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}!trans\_eqn@{trans\_eqn}} +\index{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}} +\doxysubsubsection{\texorpdfstring{trans\_eqn()}{trans\_eqn()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+VSource.\+trans\+\_\+eqn (\begin{DoxyParamCaption}\item[{}]{branch, }\item[{}]{node }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} + +\begin{DoxyVerb}Generate op point equation for voltage source. + +Equation format: (((x[node_plus index]) - (x[node_minus index])) - + (voltage value)) + +In other words, the branch voltage drop must be the source's voltage +value. + +Note: Equation is the same as op point case. + +@param branch: Branch dictionary for the component's branch. +@param node: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +components.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.eps new file mode 100644 index 00000000..ea64f9f6 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 182.926834 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.733333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy) cw +(PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92ee9aef2f31fe40f03dd294158f1de22aad3ef1 GIT binary patch literal 6120 zcmb_gc_38l`!694Dn)72Noho!S&SLe494zeCq&dN2b0;%oMDJ|OQ}dwN{ZYzsq~c= zA#F+}(xw}3t5U9HiE#V9XQH~x?|bhb-!o>;d7t-rp7+__*LglhUJg!XL~{zxsQP_c zKF-L9j%5{pn76P3z=GM=N5gYZ}a!5@e$IV$!MqihuM zVuvHLxv+;=1ekFYhyaN>D{%}4?1qTK(Fn*AP<&uu3yMe~*hv6H91yOUhge(VWT+Hj z3vr5^of)@0t`H_Ve(KT-RY|RSadub9v5AGHG@G@@O4PO=Td>{hOKy~byP@R)m(JTg zk7Xy?gIwm#>3Wn_hAW`iYTrMWKRbG7pzephwnRfMV!Cl}T@j?SJ##MXlJ|+8lE1#} z4rO0Uj8XKLp7V^K@7$6mA_<>Ynx8x7dG!48yL*$8&mLkd>qwmtsCP;Ycf^hGd@n0^ zPRx-@KV@&YYhG8o0^Qyao1?jHMZVUJcdoIwE%XY$G}dqQST(6CKc;!8sTMZ%QRop@ zk^}YcHEZ0w(QP&`Z)WP_Et=EIIaAWIU$unk?q5I7J6-#IQV`iQ^_A-OEnD>m*U}2c zaJ=U454%O%Dn^{WLYK~~VeZZdx-mFk%dx@{!3X%uk5b$a%1IAd-u~HX(49oa-EAdP zYw25(&N)mw*?0X=O?=wi_p|9mHm@o)Dld%h+Su>LedAp6fm_eJ( z21oVYE6+kiyy1X@CoD-=YOp(*Vuc$fS$xl*U#tXyvFyU`2#?RU6Dy!#0+^HAtnKor;kDGiZ9@M1ns1_k3VGktI&5YQk88i_xM62FNKOWLzh zwm=*{qGH%ocLZhgzzjsh1b$o_GjF(reW*ApHv8Q$Y&bk=$Ce?OKd@T>Yl#!f)Q>Mj zWM)2MAzP&M(*cojrF;o0mO?a4iP9Y942T0?Dnsof*iy*C5_V$`KNCqrIDpSXBV@r4 zi2`Dc!{Ys4K46|oB0-jxROOcdSt`B3B*uKBfFacq2V;w1bC@U&b_Mmq=dwiM0tBQ0_C*n)KPVF-4tD3uWWXO~j<5{j z;J{%u7M5UuB@~prG0cMPV0+jRc7;7*FW47m!(14F!(l!wf+es7k@CenI0}}+G8lzp z7brc$PHQqm#3KAdy(!1TG5LCi{&<7}<9>{!{m7Y1qEM;U*56LoeLEw)e8Z<#dumy= zou&`9GskH1ud&%jc4+gJKEm|dsIW!Pkxlh)d-5Oil@ny~L@R+XPB%;37 zmvbsCkH#$h?U4Ps?uzYNVd;@s+hO7yqh%?}AKx*I{awF1+-^dqV2)MEQH&MYbwww$;0t>~@9N6wYj;684Qq}EM1 zox}0o1UVa9ErV`kW)&qoj1jtddN)2GKYna3&%4xi zw(W+i{jz<%qczOWrGDxEp%rsf$8YaCVS9Ct^XGo5PVwfUa|vv{ zaF3Sb>Q`yNI;!0$EMD*@g7?iGpe`2 zci;Gy$17i+O-Ooj<)FGG({1Qd|1^*LeST|)6hZfP#70mUhPP@nbZ?T=I+CHKO)p;^ z)Uhdm-1hb0pSZs`1oiq}EqUtlw0L^OzTL$)&siLd%NeZJ*bsJg*`*t*9(oz4d5W!W zM;9b7@j|?p?)YWLbYHgq(le0ZSBDt?u48Dkw%5jKRMGz2OeF2YMMvQFr~}9WRhI)@8KVQnbljfv_TZBDQ%sG1 zg@#g`~e!`A+kg_R_aswI=$ z4^6I9uUfIed}rlu&r6CT^9$;y?&cNoYz}vv7C-MzY`QNsShPJT>mr^(x&Em7;Mlr5 z8Kw-aPjd@$xcQDBXL$sjJ+MGi#Y95BR`Af*)VigU7j|r5khVXcvU#WJ+{kq*{NPP< zd)w5nEVZ?sQ!@Xdb=&B%Sr7c%jum{gb0;oLGAfmZd+&cwA5=NeYMwCkA!yCB)fZ;x zZ%vTvQnbmdv%@ny>lV$_$^9tZvpXnU)u@l2TCaL{lxn>{r?xJiKWy8!8dVM!3y3sN{?ZL&} zYKNzkU%mJI^NY_HrU#CZhZQZkXIz}c`Vj4Ar#Mc1$HuKW^Z|`sHErSRLsK_RYPmH# zch`r^`=wJZR{4t$%_yF{H?OJg%sjTcXH1c4UvoH_3TJ7@zj@*NSngd`qrK|f!6D}4 zhJ?gl$`qrIET_7DUNw!%pEKj8qE=m1vbQR~H9^_{nQdp3_x3H~$OIj^sXu^LI5p#9J*SnrS%bz@fTo|lk#5XV^pB2f58g92wokUruBg5cO7}avt;<_w zG`^?YV0osPFqOpJc)IibPXPov#&U8re8$^)ZnWa7(I z^}8S6jca(&$u5cSZhSbd^~Tbv8+7Y;A6cRIo3PO5;q=J1WBoIZhHkdSuMCO|&fBW# zNuOT3XWfPxzsXH!+MhV7U0%RVFTctwX=Atw&wHuu%($|dvop{?@6cQSdit#yFMEE{ zs4+3QnmF|QKg&Jb@_KyZ<20#f6?=su&6siZW*HA|(d4^aE7q4r`51Q9a3GCMpVf6L z-J1pTpCi}BDjCu>5$D(y$3_FPMAsq5KXuF_J!O?9`b z?<*^{quE9}1TC+N!6)ZF?}#}83AQ*l+3&Tw^GQ89?AbyzH7NRC|L(%x?O#3;)pa~7 zQYG_0w_Y|MueZ1;@1Zw8_~M-X*FS{kufFknZfNbi67^2+C-7zGsDM82<%ypyS?R6R z(fF4Y`JOul&f2!c>KDa&W_cO;rx;}n4qC)A7`O(H*FAU-UF*b@aji_7v;?i%oboy= zwYSU59L73VYh0jR?UNfU(Am)F)M9Wpjk+YecilCY%Y9Dr2fwZS+^a8{ByRAaG^@WE zRWFR7Mqe5DkkNj8;MgOorcE-p?O8_i@y>m@X6W@ZFWyL04_Z_ae|zSPIAmF zbPpTXk?ne@KK!uPvuTCN&(3ekj9JBSJDsleJSTQnI_u2O7gw1x_Hjx3sl2- z#}>7w+O6hiA76H`sPI)y0VU|j+IwN`fw2lZ{+!!toiPn-F33)<5@b-Hw)~cO0 zo94L9GQ&41=Z}voWj(s|HrHwSzJ?V^_L8ghE#zOLa+0R9PgX2$SM%$6zOr^jPx&5C zs4waOspDW%qi&?LTZbZG2lpkTWwU|ogu=tKJH}L1$OvC8n|@oRIDhb9GD$pGqB{Y_ z)!rW4ymt*(q&HAly3?ig(x>3Uy<3)#*_aZfsW++GM`!E&vPRKq)`@|owMR9sG@CRH z$kz@{>^Bp<$aI-!$Uc0(;ZbAbFQ#vGKk||L)<;tdoHUoMTNAhOzGpx&bw_atnMYf- zwZy;BTlL+6{Lp%h$771lpWm8THH{GBZG0Qf3csY<_fWC$V`{}tX13hq@X>oF8#t$I z-oB}5Pd?;jJIQnXC-45_9yzmKSu_UEs=9Nk{NYmf03Yo%1DnZPE`9p6X2AS6x*nSP zr3SrD%Te*=+CQq@y5!})*F96uWR*HLoV6cyIzneh)MR3I#I=(%*99({$1wV>y(9Wl z&#q|AzR_*|q~@f1L7mT94H!0p&QF!gJHCw78lWb$&nm~7tUoq_%C6zZH}8?|==%$1 zpu5}1+a-}i1~2Wy8W=VT37Z>b0Tg$FyTl%e;Jd_05#Klu zKWiS(p+UkU`)boM~w9gu5z1DWiDYxZdP+n1 zf#1YLGIOO(=3KE5<_E$=a{@fF&`93`z#Rx%n9UK(QKq5cuoeK;{Jk150rZf8d*F!< znrNP!i%6MxXD>I%IYKN$zc!VSl{tlkhljoThs8i7|9&wL{$ZmTfQRl5y0x%a2Y}F6 zlL#OHL=Z@tACW>QQt1RsGXjlHATZ!Rae`C56p0g$H?*H9)p%5!2jF0Xh=E{Yj4|H{4;^lHakIrWExFjp! zx>Xp548jpcGb4b@jLJhuToM%oiAMalN#Jq6*&&fj1>oJ%uq+#Y%ioA|1Vn%w{q#q635n%#+k)1WFJGqq_JkH#>~N3W~P}l47!CEUM#3q=U{6NBZrK5VIto{r+{(i3@1~Tpa504^{axQVj2zsk zn;{=i+NC|pxwzoAMb<$ynK@EAwW5zb(sqxQ2i;+`w!yqpBoC(wUndF z4O#uJf2wEJU4$fAF4x?tE9^Z?78v!auM8>L(e-!_)kD;wv?XimAz!ZdPF*v&{STv# zkpg=!ji$W&H4___G`Cin*@x&}J3V9Jef=$rqCxF;+ng%vvl)?F=GV)KHLD7qI_cg2XDXy^NcTbs?-rJNBubdM}sPtvJSTcq@B&9h~8^1I)$ z!YqsIYELXTkSyqIX!$XDSaV}qa_Q~4FAO5?FRZ+BacigBZpQPwxwH2l>Unte{!8uh zOs_yf@!28!8TGkxLt*R9_07(cdU~HcU#quX%njklkL=gqv3pCiTKw~mMY(d-S?Yhf zcig(KwzuP9&&;u(uH|hR{lNh$>7Gfw6-~L~wS*qI^=(;)>N`0-g4#@k&z(#jc)}8n zr5U?hQK+~{lGWE*@J|vVFjgtB55ncKT?JAolnAD&py+5+OEM)K2c|^`AB8Abz2IOL zA{IzQ97GH%$yX%c_#tR037{She&*s*eiY-P-#l3+R*0&y{fRUiuoNRw7z`aV@8 z5CvvHGCRZ&?8W1Xp->!VB?}i00SywMk@Sry>5J&3B%O`2;{;KkRZN=dgP?3Kn1M)` zz_)8-=1uMfmJQAZoBe7SHk_PvWs4EaAJ{!)p|20q!k-t9hzTq~Jex1`(+v@GL_8rX z5J5CdiOd|?42T0yBu44cY!PH-4STaEpGjmA9K_?I(c(~uOa-CFVd4G{A24r2CPUWN zHnJ}fvX*&+Nl+-5qn|&33rD45=?3Wo_pf}PIVSHwqm>mF-EV)fgcBjM4d%wDkBoxD zez7mM7KLW}JqO4)gAWc39zP1W#dqP0d0)oh$U?F5!jen+8eVLL$?(dm4~y^DILd;@ zWXB`_U&viSje-&-kV!Pih6voGQNpp)3!KvwD;(@1=3vDNsG#)N!i5MgDjE!JtZ^{5 z2sVd_;$TluF+7e7KPnCZNr3%OBt8%n3JC}M@Wf)^k1R`Aj&N}Bq#7%0Fu+m@irx%% zfn8xb%z!=N#jr2z2m8Zpm;)nl6wHJ9un-m^BA$Q?uY^Ug7)IeFbD3}0;ZK1`Sd71^ zIoWtJDxZ$zZ%<@k-nX%&e?G#=)>hVzj$aPzyntALzaX7D(%n7|5^ZX+==|K{fk92D zED3EJ;MPEf*VLpE$n3edoT18H#*a|iT@yoBS7?QtoAOK|1hGz-{eHA(14nY>WMO-P zd-1;l4?DFW;gKC-xl7AlqyWJ955-MjIZa(21Z zKGIds&od_cq4{z2_UO$I^>1gdCv?rdr62BJOAj;Z{>9uW=l#ks<}%kmW7JYKCT54G z*Jb>iet~o4sKR{p-fe`YlN?^K+DVPj%@vJ~4GA3Gqgh>LU9LK&^Odh$d_vOP@<6O0 z{ypjzoi~gGA~%eZwR|~i^Tn5ucMNK8IrlGv2hPmByOv) z^LP?|*|iU6aiOG$vd`fLIqP|9cIf)HTj$eQQM=oFxUqM)6;{u`+pr;!wt0BdulrOl zY`ScsVMc#--rH6roSC*t+1D{pd8xdENmTB$$0nQhat{Qjio&I(0o}^-Q(mb*XgO({ zVn`b$+`3SFOl6RtMXpdf(z-+|JF?x*=fTt*jca5}!21$hRXZ>+r z{cy#-eMfYXyXt3--O20t@Ox^%_@@JFjW?Z3w{(fh7AL+4=9D$|;<{kw$!fXA&AzQ? z%5DVe-`reeHSEzMrj^b(GG$_DmS?e? z^{jAGE*d!8P`7cx>&VKq8+y)j+{0o>cB#SjTURIM;hlbSxNm%J?xm~@l>?3P8y~2y zNjFn22w$x3>{Yp?dF%A&?-VVwQ)~)&1qurbUhFXJq>uU-4eiKy5Vx#Jav?%XftyI5IF#rDmLlI=2QD zFSwN7Y`P*RP^);_qpE0XcjM6Sdb8_NR;yBXH!**`e=t7Fakjz3``6_k&b>75xPDB9 z#Ux)>8=s1=qpxt1n>y=EP6W%VWPEw~ngmJh;4S6+Lfb{#EfW3Z72B-UC-MR$7b&T$ z+@r6SKfYl+eSV2$XTZXHavfT zEEL~R5$W{L4e4eoGkbo~UUhlV>>aP(1{1Ct26Y~Owq3WE?o^Xj$cGP3{fPUyxx~G) z>iFqj+kA^QBp<1Yj?YQnSfP+UHn^im@vl z&Fr*|A)v+yi{w$A-YD}Mi3$EG4F;=Lzj~dK)3;526|TlSW=RqopLnEL{Blv^hcgMw zl!vcpWuIGpF@E2rWb(!;wW+t*$91InZn)>`aPhyaPRP-zx*nsTRpKS(j@^lUFs+tT zSNmLv_uDa7Ty>LwUjB>gLs}ot#U*dukd|4pH0AWb#iIGca|gqnFRJfK$!hTk95`&b zQ+?Z-{(gc^yh+^1Bj)d|jZD7@a#sT)C~XPewZdNAjY zd7ILfr2cukJ2SJszh?bWw*IRr6?d)dACBawYP4F!+;W~6BuP@=1*Kl!AQVv=_CCyS z-%sry22*Ec)8 zv!e>fda)umvUq;AYxztslj`cB=O$9+!}*tnJhiW`nX0bA96vB)4UU;_+iyL6XnD;- zU5^pyOzX8b5}djE+HUXSrrV2BGLjbT>2}%ES5n%=VibE+?w95VmJV4u*KC~5*<2#; zxK3+MRBh+`G?h1sdVw=EC3Cd92SOPsVX9kSUl7`j4BIVvleJbr*yeR8lXaro=uVwx z^Q@QSo;%m{+~>UE8{d1+G}!S6zL8dJqd`7$a#x4vNaLnCMxi8yvQrnzH$J}fftNK>%4`pM<@`}w!Rghm2dj?V zGrJIC&`)jSC;o6?u(#E(h1y?o{lN5$g1rw~;umi4a85THYwar!b-LCg|2RFU*ww(h zj#9n-z2t@5LGhiMxPXLqn<<8cJ&P(lxh0v&RqcOTEr2>F+8+3?TN#@1q*3SW>MiMq zJ4KsJe#}1VGd#kN9U0C!t}<>#8BV=HXVH@mv^qJs3~Q-&TQn<#Xp?j6f`pVnn7Xlf=tc-WP_qx-dJzuKmA|GGi%?R-4P z!?46&rO)Tyu^wSUdGDh*QHIUgT``HX!ab=(|0FxTGz0w)uYdm2XWpafAFo>MH5Te^ znK9N+TM)KOys6W#)&G{BM{(no8;1EaD86&@Y|Z&h|M==1KPfL=v$243FyOj7DOIbp z=xX_1m9WL}kx9=I&PT_)tWylzS8~or*8v;|rkzL0l{kg~*n+mLvj+G9QW*ftDjtAc}=Z zmezQnQpAn4V}Y*rlR_|Zz(=E~&<=(Z6B8{HDV73J6il+UwS|dfm`o-B4uUv|kFuo% zzStP7Co_Z>{6&l}wv^dq$q~fEykMAQNrXQy^tt^3fD?o*%#IL9PzNKUNi6_C`g=8C z0_dRt_rQ}K=*GDc4kB{Ed-!@o9?=3Z`l&mGY%Qr|JUr>uKP(0!`S*)~@J||T4|wc+ zK+_kQtmjKxGUxXW^*}YTj08FWCR6-Ba%iSf{S2{kcb>IjYx~2QU2Q`a5-P>5K2UGvSQ$_+wc%`;x!Uss$pm$qfQ102Ph~ z1an8nN$^c7LLvbUL?Yv`8vS%Z)>JBm3PnPnX|`4Xv%@Zk|CvU`AeZlGL>leiX*N_4 zi@(YO4*~Y`9nA*Au>MLT5h(zl`;JDj1&GOaG$MwYd`H7@vhQeC6x(msMMZ3Yz=!}4 z4#9rBWCX+jf>{CqKo~Jd27*2Lkpc)yBmg@--Jno=hP#a$gJ?^)v9h7lY#2lu$;#b^ nN@9?$++D0~Y^@#tnIjwnFU2TZgvtU>rP+XgHkdLNyW{>3(s6(U literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.tex new file mode 100644 index 00000000..db8489b7 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.tex @@ -0,0 +1,76 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy}\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.386364cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_aa758bb531654f0ecde1a7ac354093f83}{gen\+\_\+eqn\+\_\+from\+\_\+branch}} (self, \+\_\+b, \+\_\+n) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_ad807f82bee170ec992bc45045d370e22}{gen\+\_\+eqns}} (self, branch\+\_\+dicts, nodes) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_a9825e3b57fefe5948f905bdb7603fc95}{gen\+\_\+kcl\+\_\+eqns}} (self, branch\+\_\+dicts, nodes) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Abstract class that represents a simulations strategy (e.g. operating +point, transient, etc.). Class contains methods for generating +equations for the given strategy. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_aa758bb531654f0ecde1a7ac354093f83}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_aa758bb531654f0ecde1a7ac354093f83}} +\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}!gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}} +\index{gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}} +\doxysubsubsection{\texorpdfstring{gen\_eqn\_from\_branch()}{gen\_eqn\_from\_branch()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy.\+gen\+\_\+eqn\+\_\+from\+\_\+branch (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{\+\_\+b, }\item[{}]{\+\_\+n }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Generate formatted equation string for the given circuit branch. + +@param _b: Branch dictionary +@param _n: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +Reimplemented in \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy_a8ffcd2311ae2eb7d682d229d4ab1b8a3}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Op\+Pt\+Strategy}}, and \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a14658a496eebd4540f74e0fcf7a4c778}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy}}. + +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_ad807f82bee170ec992bc45045d370e22}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_ad807f82bee170ec992bc45045d370e22}} +\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}!gen\_eqns@{gen\_eqns}} +\index{gen\_eqns@{gen\_eqns}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}} +\doxysubsubsection{\texorpdfstring{gen\_eqns()}{gen\_eqns()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy.\+gen\+\_\+eqns (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{branch\+\_\+dicts, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Generate list of formatted equation strings. First portion of list is +branch equations given by underlying Component classes. The second +portion of list is KCL equations. KCL equations each represent all of +the currents flowing into/out of a given node. So, there should be +one KCL equation for each node and one branch equation for each branch. + +@param branch_dicts: List of branch dictionaries +@param nodes: List of node numbers. +@return: List of formatted equation strings. +\end{DoxyVerb} + \mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_a9825e3b57fefe5948f905bdb7603fc95}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_a9825e3b57fefe5948f905bdb7603fc95}} +\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}!gen\_kcl\_eqns@{gen\_kcl\_eqns}} +\index{gen\_kcl\_eqns@{gen\_kcl\_eqns}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}} +\doxysubsubsection{\texorpdfstring{gen\_kcl\_eqns()}{gen\_kcl\_eqns()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy.\+gen\+\_\+kcl\+\_\+eqns (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{branch\+\_\+dicts, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Generate list of formatted equation strings for KCL equations. + +@param branch_dicts: List of branch dictionaries +@param nodes: List of node numbers. +@return: List of formatted equation strings. +\end{DoxyVerb} + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +eqnstr.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.eps new file mode 100644 index 00000000..d65521d1 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 170.454544 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.933333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy) cw +(PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b200c4612afc7bb793afafcd2190c41ba547416 GIT binary patch literal 6196 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 OBr5p#fXixE-2VZa`&j7! literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.tex new file mode 100644 index 00000000..060695fc --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.tex @@ -0,0 +1,55 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy}\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a988aec6662268a954e850913151b8258}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a14658a496eebd4540f74e0fcf7a4c778}{gen\+\_\+eqn\+\_\+from\+\_\+branch}} (self, \+\_\+b, \+\_\+n) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Strategy class for transient simulations. +\end{DoxyVerb} + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a988aec6662268a954e850913151b8258}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a988aec6662268a954e850913151b8258}} +\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}!\_\_init\_\_@{\_\_init\_\_}} +\index{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}} +\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Empty initializer method. +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a14658a496eebd4540f74e0fcf7a4c778}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a14658a496eebd4540f74e0fcf7a4c778}} +\index{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}!gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}} +\index{gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}} +\doxysubsubsection{\texorpdfstring{gen\_eqn\_from\_branch()}{gen\_eqn\_from\_branch()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy.\+gen\+\_\+eqn\+\_\+from\+\_\+branch (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{\+\_\+b, }\item[{}]{\+\_\+n }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Generate formatted equation string for the given circuit branch. + +@param _b: Branch dictionary +@param _n: List of node numbers. +@return: Formatted equation string. +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_aa758bb531654f0ecde1a7ac354093f83}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +eqnstr.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.eps new file mode 100644 index 00000000..0902af96 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 178.041550 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.808333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f06b55e658ddf895a79462d8d5ba18ca66ace797 GIT binary patch literal 6700 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.tex new file mode 100644 index 00000000..96e70dc4 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.tex @@ -0,0 +1,49 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+ISource\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+ISource\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a414b6241d1f30e7fe3e1ed67a8838d5a}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a414b6241d1f30e7fe3e1ed67a8838d5a}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, value) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a0f1c467846d3338bb5f769ba9f1343e6}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a782440f28193bc1b20bbf6710aa6db21}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a782440f28193bc1b20bbf6710aa6db21}} +{\bfseries value} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}BehavISource class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a0f1c467846d3338bb5f769ba9f1343e6}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a0f1c467846d3338bb5f769ba9f1343e6}} +\index{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+ISource\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@param node: List of node numbers. +@return: string (or float) representing component value; + may be an equation +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.eps new file mode 100644 index 00000000..3044ea8f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 174.927109 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.858333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0dd84e696b38ed24d9ca66b55bad53756207c94a GIT binary patch literal 6806 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 XrwWuON7aF+Fi14;uL;}5cDVlo)*QU- literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.tex new file mode 100644 index 00000000..d3798005 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.tex @@ -0,0 +1,42 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+ISource\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+ISource\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ae6f0b97877540bb7d1ff87f7f3f3086b}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ae6f0b97877540bb7d1ff87f7f3f3086b}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ac951e005392e3310cf2eb4d784a1fa53}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}ExtISource class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ac951e005392e3310cf2eb4d784a1fa53}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ac951e005392e3310cf2eb4d784a1fa53}} +\index{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+ISource\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@return: Returns the string "(get_isrc(t))". Function defined in + solve.py. Used to get value from external current source. +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.eps new file mode 100644 index 00000000..82fc1a47 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 185.185181 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.700000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f9b54975f179a1aeab3467d9766d7c9736027d28 GIT binary patch literal 6415 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.tex new file mode 100644 index 00000000..f31fc292 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.tex @@ -0,0 +1,42 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+VSource\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+VSource\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_a5a238dd8e12a9872ba2a550b61a589b7}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_a5a238dd8e12a9872ba2a550b61a589b7}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_af38b1b8666f2f8a65529dcd542df07a6}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}ExtVSource class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_af38b1b8666f2f8a65529dcd542df07a6}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_af38b1b8666f2f8a65529dcd542df07a6}} +\index{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+VSource\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@return: Returns the string "(get_vsrc(t))". Function defined in + solve.py. Used to get value from external voltage source. +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.eps new file mode 100644 index 00000000..cee33659 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 199.335541 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.508333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16c87a89fd9ed9d03091dd1720cf62473a206b15 GIT binary patch literal 6319 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 Y3_n$(d_hmvo#AtQK`5@o61s3n@V+W z*-7Nu(n!X3IV{8oDBfdGlW$OsG=j$X3sF{T6Fu*Q@3``RXKG_k??A$n>o7wB_d}@^Ws)7Dt_L zbP8!zTNd)AnjKc-R`+TAOyugLh2?Xvwc{#(bukM`Q7hNkj+FguHFvnZ{r4%l#rf9u zu_mXlPS84YM`~xXJ0`2M+}2WU&!Jx^8tRMIUO&#k)l8Dz&9QvL?VJ6}dcCzV6I1R^ ztZmVbQI%*MtIJC--d){(c**4yp5`;JsT!#&%n+H^x}=shXPc`Uo0***G1@g5=A_?S zxVuegzx&4$ef@K&E*YEnENKJpW%3~9ot&D(3QXK#u!WN1uyfq@c=!3OQ`x8N2LcIA zJt~!IMPx+C8Fe?9p&>#8gN`J!A!Zb0@GW}GFfjt7v4tHF4v%FnQb1mKfF^@9AsA8h z@kAdCz)KLJ3?iW+#=tI!R3w+M5h)11vqZ#pMPyzu$UO*VA_^HGM>7aAQWAsU!xmr( z*rgDfG%gqb8Z`rzHvEm$%Z zUlcGVV$@UzM8@I(3`9T~zSoVKH=4jMh8RN>`^_+PIf^uANfC5E@H$%;hNqhzlP5r= zI2VzCB~(T5KvYzS(i|lQ_<<*p$}9p|63Bo8+p|XJ1R?=;=W%3#QZI-| z2EN9i{{A-~fHx!(AqvG%`Qjl8*bSMC#uX2dNa$9_K7bB0hCxS^at!ywII7dYz(5&k zbR5AG4bg4jA#^kZFPaD7#h~MeHWJlHi5-EAWD1yrxHE*{yz_(sV0%I{p_KP^4Q?A5 znrCQ`3E$j|Y8rL3G7V8bfAgo(iH40TiSlOKgqs0s_I(kb;3xB`6MM#lSWob9ihsVE`Wi!GK+5h`@T5|( zA7!-ASYcp~Q85M-us}l#l3xclgUw+Jm;qbDHn0=y47I3ym*n9`}cLB~0Ls@p9{7&mnVP4BQUtI#Giyu=rNko$Y5yzsB)JwEP{n{7(E zBHngHz8Q>MGHxz0VfNIC$89F{w%%n-v;CxBd2is8_kpd4O%gWQTA%gLijW-qH8Gm_ z3)9-%qKF&AjV?ckO@B$y*>Yss?5X~g(~8JqoMt;#W!_5flPl}bVtRWU>+6#Ay=JFf zj2#|6)|p#)dQwt%aSMi&b@71$46ceVsA+8=VT|? za9@yk_O$Fn>#HvW93s{wC)~ii2;-{sE$o{=w~|z~17CPUu+2>z=GmRI_KE*-i;n|) zGxv6#Ku&1QM&5VF=!~23j8QQ6%d^>Uwf!9S936hxFDg@`6vlkid`}(7@x!OI>fVy1 zw0+7yo4Cm^E9$h-%=p8d#wYd5m!I3w?|5MClLb8m#WMt1YZdf~rXN0zcd}{l_1`<| zV2EGVVs~>=xbq|-0qUG$KgeKtFMcO|+85`z#@x9R2AJ?y%MRi@FVy_z>JC9uG zsc~`QKz?Tfa&KGryNt{nng*qChsKlTLr4wL8J(0^Ms^`1f2k3jPIW7Be|F#)*$Cq~^ zXnW1FfzHIN6{i(Lz2iUsjAZ-zq-CEO@F=u5%D7@?dTq=6t0At}?*~(B|7uU(+Tlg5 z73)3?(wTcOyGfFEIf^;=s@r#X}ZI4Yo=o-=9Bu&Vh6edCfhb)RBa*(Qe6m|D7Z zPS>&>t02VxwyY6WnKSl9(_gHp^|V1 zuDRHGVbwUeMX≤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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.tex new file mode 100644 index 00000000..ba000065 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.tex @@ -0,0 +1,49 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Inductor\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt@{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Inductor\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a664c070ea0172ac12c502376d12d7974}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a664c070ea0172ac12c502376d12d7974}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, value) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a8b26e5c7d5d2237795dd7cfb7cbbfca4}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_affc695d1202a850a100375a211b300b6}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_affc695d1202a850a100375a211b300b6}} +{\bfseries value} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Inductor class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a8b26e5c7d5d2237795dd7cfb7cbbfca4}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a8b26e5c7d5d2237795dd7cfb7cbbfca4}} +\index{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt@{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.InductorTextFmt@{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Inductor\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@param node: List of node numbers. +@return: string (or float) representing component value; + may be an equation +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.eps new file mode 100644 index 00000000..876fd65d --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 198.675491 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.516667 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45ed9d6932db11bc2dc44ef1afa0c882494fa166 GIT binary patch literal 6330 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.tex new file mode 100644 index 00000000..4ef96a14 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.tex @@ -0,0 +1,49 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Resistor\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt@{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Resistor\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aabd77103416e27d09a3886a05b09216b}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aabd77103416e27d09a3886a05b09216b}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, value) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aa898c5d718a876f08110033ed156b205}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_a79c5b751e10bd433f6b409ecbd45c6c3}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_a79c5b751e10bd433f6b409ecbd45c6c3}} +{\bfseries value} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Resistor class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aa898c5d718a876f08110033ed156b205}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aa898c5d718a876f08110033ed156b205}} +\index{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt@{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt@{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Resistor\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@param node: List of node numbers. +@return: string (or float) representing component value; + may be an equation +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.eps new file mode 100644 index 00000000..763b7b4a --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.eps @@ -0,0 +1,253 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 437.317780 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.143333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 15 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +(PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.InductorTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 13.000000 box + (ABC) 0.000000 14.000000 box + (PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt) 1.000000 12.000000 box + (PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt) 1.000000 11.000000 box + (PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt) 1.000000 10.000000 box + (PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt) 1.000000 9.000000 box + (PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt) 1.000000 8.000000 box + (PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt) 1.000000 7.000000 box + (PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt) 1.000000 6.000000 box + (PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt) 1.000000 5.000000 box + (PySpice.Spice.OpenSPICE.netlist.InductorTextFmt) 1.000000 4.000000 box + (PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt) 1.000000 3.000000 box + (PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt) 1.000000 2.000000 box + (PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt) 1.000000 1.000000 box + (PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt) 1.000000 0.000000 box + +% ----- relations ----- + +solid +0 0.000000 13.000000 out +solid +1 0.000000 14.000000 in +solid +1 0.000000 12.250000 out +solid +0 0.000000 12.500000 hedge +solid +0 0.000000 11.500000 hedge +solid +0 0.000000 10.500000 hedge +solid +0 0.000000 9.500000 hedge +solid +0 0.000000 8.500000 hedge +solid +0 0.000000 7.500000 hedge +solid +0 0.000000 6.500000 hedge +solid +0 0.000000 5.500000 hedge +solid +0 0.000000 4.500000 hedge +solid +0 0.000000 3.500000 hedge +solid +0 0.000000 2.500000 hedge +solid +0 0.000000 1.500000 hedge +solid +0 0.000000 0.500000 hedge +solid +0.000000 13.000000 0.500000 vedge diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6e14f9fa42eec3bb54af4fc71a5fb6c297190bd GIT binary patch literal 7686 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 L{Nuyg#Rm6(?wak_ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.tex new file mode 100644 index 00000000..2354ea67 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.tex @@ -0,0 +1,55 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCCSSource\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCCSSource\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a594aea45558abed642c9fe18a76ce2f7}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a594aea45558abed642c9fe18a76ce2f7}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, value, node\+\_\+plus, node\+\_\+minus) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a7ad533355bdad39c4b8364455d5a6420}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_ac29c279ae27cdca7a4ecf18973266748}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_ac29c279ae27cdca7a4ecf18973266748}} +{\bfseries value} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a89c931a7ef213af7f0dfafc21fd4ae0f}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a89c931a7ef213af7f0dfafc21fd4ae0f}} +{\bfseries node\+\_\+plus} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a08587bea6edc63bbf62c0b10db7366c2}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a08587bea6edc63bbf62c0b10db7366c2}} +{\bfseries node\+\_\+minus} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}VCCSSource class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a7ad533355bdad39c4b8364455d5a6420}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a7ad533355bdad39c4b8364455d5a6420}} +\index{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCCSSource\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@param node: List of node numbers. +@return: string (or float) representing component value; + may be an equation +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.eps new file mode 100644 index 00000000..1fae4a27 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 180.180176 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.775000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..973ff2cd801a1ea81dd6772967530c99a049b898 GIT binary patch literal 6414 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 O1QHSa|L literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.tex new file mode 100644 index 00000000..d1e31674 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.tex @@ -0,0 +1,55 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCVSSource\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCVSSource\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a7c180287a7a530f8878f6ab05446a9fa}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a7c180287a7a530f8878f6ab05446a9fa}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, value, node\+\_\+plus, node\+\_\+minus) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a90d68eea5ce0d62c56f998b4a730f900}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a99ea9748ddc620c737d5b6ad95cb85d0}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a99ea9748ddc620c737d5b6ad95cb85d0}} +{\bfseries value} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a58fc02fb1a4225634ee78a873a318a77}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a58fc02fb1a4225634ee78a873a318a77}} +{\bfseries node\+\_\+plus} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_aeb075e1891924c5980602d06eae57c8d}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_aeb075e1891924c5980602d06eae57c8d}} +{\bfseries node\+\_\+minus} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}VCVSSource class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a90d68eea5ce0d62c56f998b4a730f900}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a90d68eea5ce0d62c56f998b4a730f900}} +\index{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCVSSource\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@param node: List of node numbers. +@return: string (or float) representing component value; + may be an equation +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.eps new file mode 100644 index 00000000..8cccc916 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 195.439743 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.558333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt) cw +(PySpice.Spice.OpenSPICE.netlist.TextFmt) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.netlist.TextFmt) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0a4fb6d1aaf7bb7fadd63c438a4559abaa9ca8e1 GIT binary patch literal 6410 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 R2cAkGnt*?L*tpu_{tsE=-W>n{ literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.tex new file mode 100644 index 00000000..2a73517f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.tex @@ -0,0 +1,52 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VSource\+Text\+Fmt Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt}\index{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VSource\+Text\+Fmt\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a218c5fe72f2e74293fee57658e6d08fa}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a218c5fe72f2e74293fee57658e6d08fa}} +def {\bfseries \+\_\+\+\_\+init\+\_\+\+\_\+} (self, value, srctype=\char`\"{}passive\+Value\char`\"{}) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a1ce38e2bdb46dd3d2ea62d0d09c1b2c2}{gen\+\_\+txt\+\_\+str}} (self, nodes) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a91a37c06f2a4b47544eb5a70ef94179c}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a91a37c06f2a4b47544eb5a70ef94179c}} +{\bfseries value} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a55a9cdb146bf28bcd53513545da0c43b}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a55a9cdb146bf28bcd53513545da0c43b}} +{\bfseries srctype} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}VSource class inheriting TextFmt +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a1ce38e2bdb46dd3d2ea62d0d09c1b2c2}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a1ce38e2bdb46dd3d2ea62d0d09c1b2c2}} +\index{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}} +\index{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt}} +\doxysubsubsection{\texorpdfstring{gen\_txt\_str()}{gen\_txt\_str()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VSource\+Text\+Fmt.\+gen\+\_\+txt\+\_\+str (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}@param node: List of node numbers. +@return: string (or float) representing component value; + may be an equation +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +netlist.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.eps new file mode 100644 index 00000000..5dfd7167 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 185.185181 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.700000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy) cw +(PySpice.Spice.OpenSPICE.solve.SolverStrategy) cw +(ABC) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.solve.SolverStrategy) 0.000000 1.000000 box + (ABC) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e93c9b98bdcf3b335fb34b491abd01b8d2df8db GIT binary patch literal 6252 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.tex new file mode 100644 index 00000000..f8c9004d --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.tex @@ -0,0 +1,66 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy}\index{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_acf61620112226d8dd1d6057f1da87ea0}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, eqns, nodes) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a7046e1818f18afb2e7bc32ecf07c664d}{solve\+\_\+eqns}} (self) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a0f519c747f41e6e1a9cbd1370f6248ac}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a0f519c747f41e6e1a9cbd1370f6248ac}} +{\bfseries eqns} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a2b6c73f946853db959352cf13cc6775a}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a2b6c73f946853db959352cf13cc6775a}} +{\bfseries nodes} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Operating point solver strategy subclass +\end{DoxyVerb} + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_acf61620112226d8dd1d6057f1da87ea0}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_acf61620112226d8dd1d6057f1da87ea0}} +\index{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}!\_\_init\_\_@{\_\_init\_\_}} +\index{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}} +\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{eqns, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Initializer function. + +@param eqns: list of equation strings containing x[*] list entries +@param nodes: list of nodes +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a7046e1818f18afb2e7bc32ecf07c664d}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a7046e1818f18afb2e7bc32ecf07c664d}} +\index{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}!solve\_eqns@{solve\_eqns}} +\index{solve\_eqns@{solve\_eqns}!PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}} +\doxysubsubsection{\texorpdfstring{solve\_eqns()}{solve\_eqns()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy.\+solve\+\_\+eqns (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Solve equations. + +@return: solution array; first entries are node voltages; the latter +entries are branch currents +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy_a1adde88d9b0006e96ce7fcfad14b8be5}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Solver\+Strategy}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +solve.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.eps b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.eps new file mode 100644 index 00000000..5c2e5a75 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 86.206894 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 5.800000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PySpice.Spice.OpenSPICE.solve.SolverStrategy) cw +(ABC) cw +(PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy) cw +(PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PySpice.Spice.OpenSPICE.solve.SolverStrategy) 0.500000 1.000000 box + (ABC) 0.500000 2.000000 box + (PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy) 0.000000 0.000000 box + (PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy) 1.000000 0.000000 box + +% ----- relations ----- + +solid +0 0.500000 1.000000 out +solid +1 0.500000 2.000000 in +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.pdf b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e44a3c9bcd4a5a5aa54b2c8de40ef8300c0d8f06 GIT binary patch literal 6420 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 literal 0 HcmV?d00001 diff --git a/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.tex b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.tex new file mode 100644 index 00000000..84434bd9 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.tex @@ -0,0 +1,69 @@ +\hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy}{}\doxysection{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy Class Reference} +\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy}\index{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}} +Inheritance diagram for Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy} +\end{center} +\end{figure} +\doxysubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ad7d38403a82dec88ba02bc10d3a8257f}{\+\_\+\+\_\+init\+\_\+\+\_\+}} (self, eqns, ctrl, nodes) +\item +def \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a369e30252265706d3adbfcf91613c963}{solve\+\_\+eqns}} (self) +\end{DoxyCompactItemize} +\doxysubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a291a6bd276ef841551ceea201bcfdf73}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a291a6bd276ef841551ceea201bcfdf73}} +{\bfseries eqns} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ae90d3563ec4f46915c502c4a5644b3d5}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ae90d3563ec4f46915c502c4a5644b3d5}} +{\bfseries ctrl} +\item +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ae4a7470da0001d15f4fccf0e269eef71}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ae4a7470da0001d15f4fccf0e269eef71}} +{\bfseries nodes} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\begin{DoxyVerb}Transient solver strategy subclass +\end{DoxyVerb} + + +\doxysubsection{Constructor \& Destructor Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ad7d38403a82dec88ba02bc10d3a8257f}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ad7d38403a82dec88ba02bc10d3a8257f}} +\index{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}!\_\_init\_\_@{\_\_init\_\_}} +\index{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}} +\doxysubsubsection{\texorpdfstring{\_\_init\_\_()}{\_\_init\_\_()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy.\+\_\+\+\_\+init\+\_\+\+\_\+ (\begin{DoxyParamCaption}\item[{}]{self, }\item[{}]{eqns, }\item[{}]{ctrl, }\item[{}]{nodes }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Initializer function. + +@param eqns: list of equation strings containing x[*] list entries +@param nodes: list of nodes +\end{DoxyVerb} + + +\doxysubsection{Member Function Documentation} +\mbox{\Hypertarget{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a369e30252265706d3adbfcf91613c963}\label{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a369e30252265706d3adbfcf91613c963}} +\index{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}!solve\_eqns@{solve\_eqns}} +\index{solve\_eqns@{solve\_eqns}!PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}} +\doxysubsubsection{\texorpdfstring{solve\_eqns()}{solve\_eqns()}} +{\footnotesize\ttfamily def Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy.\+solve\+\_\+eqns (\begin{DoxyParamCaption}\item[{}]{self }\end{DoxyParamCaption})} + +\begin{DoxyVerb}Solve equations. + +@return: solution array; first entries are node voltages; the latter +entries are branch currents +\end{DoxyVerb} + + +Reimplemented from \mbox{\hyperlink{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy_a1adde88d9b0006e96ce7fcfad14b8be5}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Solver\+Strategy}}. + + + +The documentation for this class was generated from the following file\+:\begin{DoxyCompactItemize} +\item +solve.\+py\end{DoxyCompactItemize} diff --git a/PySpice/Spice/OpenSPICE/latex/doxygen.sty b/PySpice/Spice/OpenSPICE/latex/doxygen.sty new file mode 100644 index 00000000..bde67edb --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/doxygen.sty @@ -0,0 +1,596 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{calc} +\RequirePackage{float} +%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{longtable_doxygen} +\RequirePackage{tabu_doxygen} +\RequirePackage{fancyvrb} +\RequirePackage{tabularx} +\RequirePackage{multicol} +\RequirePackage{multirow} +\RequirePackage{hanging} +\RequirePackage{ifpdf} +\RequirePackage{adjustbox} +\RequirePackage{amssymb} +\RequirePackage{stackengine} +\RequirePackage{enumitem} +\RequirePackage{alphalph} +\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis +\RequirePackage{enumitem} + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyHorRuler}[1]{% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{#1=0}% + {% + \hrule% + }% + {% + \hrulefilll% + }% +} +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + %\setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by

     ... 
    +\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} +% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output. +\newlength{\CodeWidthChar} +\newlength{\CodeHeightChar} +\settowidth{\CodeWidthChar}{?} +\settoheight{\CodeHeightChar}{?} +% Necessary for hanging indent +\newlength{\DoxyCodeWidth} + +\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par} + +\newcommand\NiceSpace{% + \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}[1]{% + \par% + \scriptsize% + \normalfont\ttfamily% + \rightskip0pt plus 1fil% + \settowidth{\DoxyCodeWidth}{000000}% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{\equal{#1}{0}} + { + {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% + } + { + {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% + } + +}{% + \normalfont% + \normalsize% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% +} + +% Redefining not defined characters, i.e. "Replacement Character" in tex output. +\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% + \textcolor{white}{\sffamily\bfseries\small ?}}{% + \rotatebox{45}{$\blacksquare$}}}} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}[1]{% + \DoxyCode{#1}% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \par% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
      ...
    ) +\setlistdepth{12} +\newlist{DoxyEnumerate}{enumerate}{12} +\setlist[DoxyEnumerate,1]{label=\arabic*.} +\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,3]{label=\roman*.} +\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,5]{label=\arabic*.} +\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,7]{label=\roman*.} +\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,9]{label=\arabic*.} +\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,11]{label=\roman*.} +\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.} + +% Used by bullet lists (using '-', @li, @arg, or
      ...
    ) +\setlistdepth{12} +\newlist{DoxyItemize}{itemize}{12} +\setlist[DoxyItemize]{label=\textperiodcentered} + +\setlist[DoxyItemize,1]{label=\textbullet} +\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash} +\setlist[DoxyItemize,3]{label=\textasteriskcentered} +\setlist[DoxyItemize,4]{label=\textperiodcentered} + +% Used by description lists (using
    ...
    ) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \centering% +}{% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @image +% (only if inline is specified) +\newenvironment{DoxyInlineImage}{% +}{% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \tabulinesep=1mm% + \par% + \ifthenelse{\equal{#1}{}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + } + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields simple class style enums +\newenvironment{DoxyEnumFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newenvironment{TabularC}[1]% +{\tabulinesep=1mm +\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu*}\par}% + +\newenvironment{TabularNC}[1]% +{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% +{\end{tabu}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used to link to a table when hyperlinks are turned on +\newcommand{\doxytablelink}[2]{% + \ref{#1}% +} + +% Used to link to a table when hyperlinks are turned off +\newcommand{\doxytableref}[3]{% + \ref{#3}% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Colors used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} + +% Color used for table heading +\newcommand{\tableheadbgcolor}{lightgray}% + +% Version of hypertarget with correct landing location +\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} + +% possibility to have sections etc. be within the margins +% unfortunately had to copy part of book.cls and add \raggedright +\makeatletter +\newcommand\doxysection{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\raggedright\normalfont\Large\bfseries}} +\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\large\bfseries}} +\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\raggedright\normalfont\normalsize\bfseries}} +\makeatother +% Define caption that is also suitable in a table +\makeatletter +\def\doxyfigcaption{% +\H@refstepcounter{figure}% +\@dblarg{\@caption{figure}}} +\makeatother + +% Define alpha enumarative names for counters > 26 +\makeatletter +\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname} +\def\@enumalphalphcnt#1{\alphalph{#1}} +\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname} +\def\@enumAlphAlphcnt#1{\AlphAlph{#1}} +\makeatother +\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa} +\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA} diff --git a/PySpice/Spice/OpenSPICE/latex/hierarchy.tex b/PySpice/Spice/OpenSPICE/latex/hierarchy.tex new file mode 100644 index 00000000..f8bf3963 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/hierarchy.tex @@ -0,0 +1,58 @@ +\doxysection{Class Hierarchy} +This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Capacitor}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor}}{} +\item dict\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Plot}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Inductor}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+ISource}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource}}{} +\item Name\+Error\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECircuit\+Error}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECommand\+Error}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Server.\+Open\+SPICEServer}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICEShared}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Vector}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+VSource}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource}}{} +\item ABC\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Op\+Pt\+Strategy}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+ISource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+VSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+CCCSSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+CCVSSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Capacitor\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+ISource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+VSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+ISource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Inductor\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Resistor\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCCSSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCVSSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VSource\+Text\+Fmt}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Solver\+Strategy}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy}}{} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy}}{} +\end{DoxyCompactList} +\end{DoxyCompactList} +\item Circuit\+Simulator\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Simulation.\+Open\+SPICECircuit\+Simulator}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator}}{} +\end{DoxyCompactList} +\item Raw\+File\+Abc\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Raw\+File}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile}}{} +\end{DoxyCompactList} +\item Variable\+Abc\begin{DoxyCompactList} +\item \contentsline{section}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Variable}{\pageref{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable}}{} +\end{DoxyCompactList} +\end{DoxyCompactList} diff --git a/PySpice/Spice/OpenSPICE/latex/longtable_doxygen.sty b/PySpice/Spice/OpenSPICE/latex/longtable_doxygen.sty new file mode 100644 index 00000000..a0eb314f --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/longtable_doxygen.sty @@ -0,0 +1,448 @@ +%% +%% This is file `longtable.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% longtable.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% reports for it can be opened at http://latex-project.org/bugs.html +%% (but please observe conditions on bug reports sent to that address!) +%% +%% Copyright 1993-2016 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. +%% -------------------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' +%% without such generated files. +%% +%% The list of all files belonging to the LaTeX `Tools Bundle' is +%% given in the file `manifest.txt'. +%% +%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{longtable_doxygen} + [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen] +\def\LT@err{\PackageError{longtable}} +\def\LT@warn{\PackageWarning{longtable}} +\def\LT@final@warn{% + \AtEndDocument{% + \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}% + \global\let\LT@final@warn\relax} +\DeclareOption{errorshow}{% + \def\LT@warn{\PackageInfo{longtable}}} +\DeclareOption{pausing}{% + \def\LT@warn#1{% + \LT@err{#1}{This is not really an error}}} +\DeclareOption{set}{} +\DeclareOption{final}{} +\ProcessOptions +\newskip\LTleft \LTleft=\fill +\newskip\LTright \LTright=\fill +\newskip\LTpre \LTpre=\bigskipamount +\newskip\LTpost \LTpost=\bigskipamount +\newcount\LTchunksize \LTchunksize=20 +\let\c@LTchunksize\LTchunksize +\newdimen\LTcapwidth \LTcapwidth=4in +\newbox\LT@head +\newbox\LT@firsthead +\newbox\LT@foot +\newbox\LT@lastfoot +\newcount\LT@cols +\newcount\LT@rows +\newcounter{LT@tables} +\newcounter{LT@chunks}[LT@tables] +\ifx\c@table\undefined + \newcounter{table} + \def\fnum@table{\tablename~\thetable} +\fi +\ifx\tablename\undefined + \def\tablename{Table} +\fi +\newtoks\LT@p@ftn +\mathchardef\LT@end@pen=30000 +\def\longtable{% + \par + \ifx\multicols\@undefined + \else + \ifnum\col@number>\@ne + \@twocolumntrue + \fi + \fi + \if@twocolumn + \LT@err{longtable not in 1-column mode}\@ehc + \fi + \begingroup + \@ifnextchar[\LT@array{\LT@array[x]}} +\def\LT@array[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \if l#1% + \LTleft\z@ \LTright\fill + \else\if r#1% + \LTleft\fill \LTright\z@ + \else\if c#1% + \LTleft\fill \LTright\fill + \fi\fi\fi + \let\LT@mcol\multicolumn + \let\LT@@tabarray\@tabarray + \let\LT@@hl\hline + \def\@tabarray{% + \let\hline\LT@@hl + \LT@@tabarray}% + \let\\\LT@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LT@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LT@bchunk{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@\setbox\z@\vbox\bgroup + \LT@setprevdepth + \tabskip\LTleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LT@bchunk} +\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} +\def\LT@start{% + \let\LT@start\endgraf + \endgraf\penalty\z@\vskip\LTpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \ht\LT@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LT@foot\else + \advance\vsize-\ht\LT@foot + \global\advance\@colroom-\ht\LT@foot + \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak + \output{\LT@output}} +\def\endlongtable{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}}% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \if@filesw + {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}}}% + \fi + \ifx\LT@save@row\LT@@save@row + \else + \LT@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LT@final@warn + \fi + \endgraf\penalty -\LT@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LTpost + \ifvoid\footins\else\insert\footins{}\fi} +\def\LT@nofcols#1&{% + \futurelet\@let@token\LT@n@fcols} +\def\LT@n@fcols{% + \advance\LT@cols\@ne + \ifx\@let@token\LT@nofcols + \expandafter\@gobble + \else + \expandafter\LT@nofcols + \fi} +\def\LT@tabularcr{% + \relax\iffalse{\fi\ifnum0=`}\fi + \@ifstar + {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr + \LT@t@bularcr}% + {\LT@t@bularcr}} +\let\LT@crcr\crcr +\let\LT@setprevdepth\relax +\def\LT@t@bularcr{% + \global\advance\LT@rows\@ne + \ifnum\LT@rows=\LTchunksize + \gdef\LT@setprevdepth{% + \prevdepth\z@\global + \global\let\LT@setprevdepth\relax}% + \expandafter\LT@xtabularcr + \else + \ifnum0=`{}\fi + \expandafter\LT@LL@FM@cr + \fi} +\def\LT@xtabularcr{% + \@ifnextchar[\LT@argtabularcr\LT@ntabularcr} +\def\LT@ntabularcr{% + \ifnum0=`{}\fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@argtabularcr[#1]{% + \ifnum0=`{}\fi + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@echunk{% + \crcr\LT@save@row\cr\egroup + \global\setbox\@ne\lastbox + \unskip + \egroup} +\def\LT@entry#1#2{% + \ifhmode\@firstofone{&}\fi\omit + \ifnum#1=\c@LT@chunks + \else + \kern#2\relax + \fi} +\def\LT@entry@chop#1#2{% + \noexpand\LT@entry + {\ifnum#1>\c@LT@chunks + 1}{0pt% + \else + #1}{#2% + \fi}} +\def\LT@entry@write{% + \noexpand\LT@entry^^J% + \@spaces} +\def\LT@kill{% + \LT@echunk + \LT@get@widths + \expandafter\LT@rebox\LT@bchunk} +\def\LT@rebox#1\bgroup{% + #1\bgroup + \unvbox\z@ + \unskip + \setbox\z@\lastbox} +\def\LT@blank@row{% + \xdef\LT@save@row{\expandafter\LT@build@blank + \romannumeral\number\LT@cols 001 }} +\def\LT@build@blank#1{% + \if#1m% + \noexpand\LT@entry{1}{0pt}% + \expandafter\LT@build@blank + \fi} +\def\LT@make@row{% + \global\expandafter\let\expandafter\LT@save@row + \csname LT@\romannumeral\c@LT@tables\endcsname + \ifx\LT@save@row\relax + \LT@blank@row + \else + {\let\LT@entry\or + \if!% + \ifcase\expandafter\expandafter\expandafter\LT@cols + \expandafter\@gobble\LT@save@row + \or + \else + \relax + \fi + !% + \else + \aftergroup\LT@blank@row + \fi}% + \fi} +\let\setlongtables\relax +\def\LT@get@widths{% + \setbox\tw@\hbox{% + \unhbox\@ne + \let\LT@old@row\LT@save@row + \global\let\LT@save@row\@empty + \count@\LT@cols + \loop + \unskip + \setbox\tw@\lastbox + \ifhbox\tw@ + \LT@def@row + \advance\count@\m@ne + \repeat}% + \ifx\LT@@save@row\@undefined + \let\LT@@save@row\LT@save@row + \fi} +\def\LT@def@row{% + \let\LT@entry\or + \edef\@tempa{% + \ifcase\expandafter\count@\LT@old@row + \else + {1}{0pt}% + \fi}% + \let\LT@entry\relax + \xdef\LT@save@row{% + \LT@entry + \expandafter\LT@max@sel\@tempa + \LT@save@row}} +\def\LT@max@sel#1#2{% + {\ifdim#2=\wd\tw@ + #1% + \else + \number\c@LT@chunks + \fi}% + {\the\wd\tw@}} +\def\LT@hline{% + \noalign{\ifnum0=`}\fi + \penalty\@M + \futurelet\@let@token\LT@@hline} +\def\LT@@hline{% + \ifx\@let@token\hline + \global\let\@gtempa\@gobble + \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% + \else + \global\let\@gtempa\@empty + \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\LT@sep}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\penalty\@M}% + \@gtempa} +\def\LT@caption{% + \noalign\bgroup + \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n} +\def\LT@c@ption#1[#2]#3{% + \LT@makecaption#1\fnum@table{#3}% + \def\@tempa{#2}% + \ifx\@tempa\@empty\else + {\let\\\space + \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}% + \fi} +\def\LT@capti@n{% + \@ifstar + {\egroup\LT@c@ption\@gobble[]}% + {\egroup\@xdblarg{\LT@c@ption\@firstofone}}} +\def\LT@makecaption#1#2#3{% + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{% + \sbox\@tempboxa{#1{#2: }#3}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3% + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf\vskip\baselineskip}% + \hss}}} +\def\LT@output{% + \ifnum\outputpenalty <-\@Mi + \ifnum\outputpenalty > -\LT@end@pen + \LT@err{floats and marginpars not allowed in a longtable}\@ehc + \else + \setbox\z@\vbox{\unvbox\@cclv}% + \ifdim \ht\LT@lastfoot>\ht\LT@foot + \dimen@\pagegoal + \advance\dimen@-\ht\LT@lastfoot + \ifdim\dimen@<\ht\z@ + \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% + \@makecol + \@outputpage + \setbox\z@\vbox{\box\LT@head}% + \fi + \fi + \global\@colroom\@colht + \global\vsize\@colht + \vbox + {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% + \fi + \else + \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% + \@makecol + \@outputpage + \global\vsize\@colroom + \copy\LT@head\nobreak + \fi} +\def\LT@end@hd@ft#1{% + \LT@echunk + \ifx\LT@start\endgraf + \LT@err + {Longtable head or foot not at start of table}% + {Increase LTchunksize}% + \fi + \setbox#1\box\z@ + \LT@get@widths + \LT@bchunk} +\def\endfirsthead{\LT@end@hd@ft\LT@firsthead} +\def\endhead{\LT@end@hd@ft\LT@head} +\def\endfoot{\LT@end@hd@ft\LT@foot} +\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot} +\def\LT@startpbox#1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \vrule \@height \ht\@arstrutbox \@width \z@} +\def\LT@endpbox{% + \@finalstrut\@arstrutbox + \egroup + \the\LT@p@ftn + \global\LT@p@ftn{}% + \hfil} +\def\LT@p@ftntext#1{% + \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}% + \global\LT@p@ftn\expandafter{\@tempa{#1}}}% + +\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen} +\endinput +%% +%% End of file `longtable.sty'. diff --git a/PySpice/Spice/OpenSPICE/latex/refman.aux b/PySpice/Spice/OpenSPICE/latex/refman.aux new file mode 100644 index 00000000..ea90bb00 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/refman.aux @@ -0,0 +1,407 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand \oddpage@label [2]{} +\@writefile{toc}{\@ifundefined {etoctocstyle}{\let \etoc@startlocaltoc \@gobble \let \etoc@settocdepth \@gobble \let \etoc@depthtag \@gobble \let \etoc@setlocaltop \@gobble }{}} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Hierarchical Index}{1}{chapter.1}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {1.1}Class Hierarchy}{1}{section.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Class Index}{3}{chapter.2}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}Class List}{3}{section.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Class Documentation}{5}{chapter.3}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {3.1}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Behav\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{5}{section.3.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt}{{3.1}{5}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+ISource\+Text\+Fmt Class Reference}{section.3.1}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a414b6241d1f30e7fe3e1ed67a8838d5a}{{3.1}{5}{Public Member Functions}{section*.2}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a782440f28193bc1b20bbf6710aa6db21}{{3.1}{5}{Public Attributes}{section*.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Detailed Description}{5}{subsection.3.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.2}Member Function Documentation}{5}{subsection.3.1.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt_a0f1c467846d3338bb5f769ba9f1343e6}{{3.1.2}{5}{Member Function Documentation}{subsection.3.1.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.2.1}gen\_txt\_str()}{6}{subsubsection.3.1.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.2}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Behav\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{6}{section.3.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt}{{3.2}{6}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Behav\+VSource\+Text\+Fmt Class Reference}{section.3.2}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt_aa03acca538ccbe94dfbab27053911333}{{3.2}{6}{Public Member Functions}{section*.5}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt_a0be100f351f8c52c9e9721da67b11ea5}{{3.2}{6}{Public Attributes}{section*.6}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.1}Detailed Description}{6}{subsection.3.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2.2}Member Function Documentation}{6}{subsection.3.2.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt_acd7115fa1041bcb82b596cbe89d9292e}{{3.2.2}{6}{Member Function Documentation}{subsection.3.2.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2.1}gen\_txt\_str()}{7}{subsubsection.3.2.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.3}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Capacitor Class Reference}{7}{section.3.3}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor}{{3.3}{7}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Capacitor Class Reference}{section.3.3}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.1}Detailed Description}{7}{subsection.3.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3.2}Member Function Documentation}{7}{subsection.3.3.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_aaf9b507f017790399af275a3cf19d2c6}{{3.3.2}{7}{Member Function Documentation}{subsection.3.3.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.2.1}op\_pt\_eqn()}{7}{subsubsection.3.3.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor_a64077c9e67f757235858299bd3d97c0e}{{3.3.2.1}{7}{\texorpdfstring {op\_pt\_eqn()}{op\_pt\_eqn()}}{subsubsection.3.3.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.3.2.2}trans\_eqn()}{8}{subsubsection.3.3.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.4}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Capacitor\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{8}{section.3.4}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt}{{3.4}{8}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Capacitor\+Text\+Fmt Class Reference}{section.3.4}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt_a1bd7b33d55bc595fae2841f0f5c58227}{{3.4}{8}{Public Member Functions}{section*.9}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt_ad81d127acf62a30fcde6bc65b6f8fae2}{{3.4}{8}{Public Attributes}{section*.10}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.1}Detailed Description}{9}{subsection.3.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.2}Member Function Documentation}{9}{subsection.3.4.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt_a809dcee0f8dbcc600ee29878b57fb5c9}{{3.4.2}{9}{Member Function Documentation}{subsection.3.4.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.2.1}gen\_txt\_str()}{9}{subsubsection.3.4.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.5}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}CCCSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{9}{section.3.5}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt}{{3.5}{9}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+CCCSSource\+Text\+Fmt Class Reference}{section.3.5}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt_a6b461db0a9f35c35e50874ea9245947c}{{3.5}{9}{Public Member Functions}{section*.12}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt_ac82ce98b9ef9efe505533431de02d078}{{3.5}{9}{Public Attributes}{section*.13}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt_a063b6b5da530ac0bea7dc1556a76586f}{{3.5}{9}{Public Attributes}{section*.13}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt_a66659cc3536322f36845698e3f717950}{{3.5}{9}{Public Attributes}{section*.13}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.1}Detailed Description}{10}{subsection.3.5.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5.2}Member Function Documentation}{10}{subsection.3.5.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt_a3dc82309536fd0478148818da021af98}{{3.5.2}{10}{Member Function Documentation}{subsection.3.5.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.2.1}gen\_txt\_str()}{10}{subsubsection.3.5.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.6}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}CCVSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{10}{section.3.6}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt}{{3.6}{10}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+CCVSSource\+Text\+Fmt Class Reference}{section.3.6}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt_aadaf1be18040a70a7eee200bb5305da2}{{3.6}{10}{Public Member Functions}{section*.15}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt_ab40c0ad3062699a750002cc6feff45dc}{{3.6}{10}{Public Attributes}{section*.16}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt_ab4732200c29f5c205edda133baccfbd6}{{3.6}{10}{Public Attributes}{section*.16}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt_a7330c01099c70a30565514a7b93ae204}{{3.6}{10}{Public Attributes}{section*.16}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.6.1}Detailed Description}{11}{subsection.3.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.6.2}Member Function Documentation}{11}{subsection.3.6.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt_aeffc88eb6eae5c426a3a828b9d502001}{{3.6.2}{11}{Member Function Documentation}{subsection.3.6.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.2.1}gen\_txt\_str()}{11}{subsubsection.3.6.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.7}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Component Class Reference}{11}{section.3.7}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component}{{3.7}{11}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Component Class Reference}{section.3.7}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.7.1}Detailed Description}{11}{subsection.3.7.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.7.2}Member Function Documentation}{12}{subsection.3.7.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a39d990fbc97e25fd5d6ee640b4479bdb}{{3.7.2}{12}{Member Function Documentation}{subsection.3.7.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2.1}op\_pt\_eqn()}{12}{subsubsection.3.7.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component_a48e5b75381d3291d5ebda2cd2c817f4c}{{3.7.2.1}{12}{\texorpdfstring {op\_pt\_eqn()}{op\_pt\_eqn()}}{subsubsection.3.7.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2.2}trans\_eqn()}{12}{subsubsection.3.7.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.8}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}eqnstr.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Eqn\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Str\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Op\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Pt\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{13}{section.3.8}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy}{{3.8}{13}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Op\+Pt\+Strategy Class Reference}{section.3.8}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.8.1}Detailed Description}{13}{subsection.3.8.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.8.2}Constructor \& Destructor Documentation}{13}{subsection.3.8.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy_a45bcab4a9eb6e701b0ba87c8dd2bd3e1}{{3.8.2}{13}{Constructor \& Destructor Documentation}{subsection.3.8.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.2.1}\_\_init\_\_()}{13}{subsubsection.3.8.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.8.3}Member Function Documentation}{13}{subsection.3.8.3}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy_a8ffcd2311ae2eb7d682d229d4ab1b8a3}{{3.8.3}{13}{Member Function Documentation}{subsection.3.8.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.3.1}gen\_eqn\_from\_branch()}{14}{subsubsection.3.8.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.9}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}eqnstr.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Eqn\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Str\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{14}{section.3.9}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy}{{3.9}{14}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Strategy Class Reference}{section.3.9}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.9.1}Detailed Description}{14}{subsection.3.9.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.9.2}Member Function Documentation}{14}{subsection.3.9.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_aa758bb531654f0ecde1a7ac354093f83}{{3.9.2}{14}{Member Function Documentation}{subsection.3.9.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.2.1}gen\_eqn\_from\_branch()}{15}{subsubsection.3.9.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_ad807f82bee170ec992bc45045d370e22}{{3.9.2.1}{15}{\texorpdfstring {gen\_eqn\_from\_branch()}{gen\_eqn\_from\_branch()}}{subsubsection.3.9.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.2.2}gen\_eqns()}{15}{subsubsection.3.9.2.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy_a9825e3b57fefe5948f905bdb7603fc95}{{3.9.2.2}{15}{\texorpdfstring {gen\_eqns()}{gen\_eqns()}}{subsubsection.3.9.2.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.2.3}gen\_kcl\_eqns()}{15}{subsubsection.3.9.2.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.10}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}eqnstr.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Eqn\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Str\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Transient\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{16}{section.3.10}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy}{{3.10}{16}{Py\+Spice.\+Spice.\+Open\+SPICE.\+eqnstr.\+Eqn\+Str\+Transient\+Strategy Class Reference}{section.3.10}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.10.1}Detailed Description}{16}{subsection.3.10.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.10.2}Constructor \& Destructor Documentation}{16}{subsection.3.10.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a988aec6662268a954e850913151b8258}{{3.10.2}{16}{Constructor \& Destructor Documentation}{subsection.3.10.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.2.1}\_\_init\_\_()}{16}{subsubsection.3.10.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.10.3}Member Function Documentation}{16}{subsection.3.10.3}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy_a14658a496eebd4540f74e0fcf7a4c778}{{3.10.3}{16}{Member Function Documentation}{subsection.3.10.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.10.3.1}gen\_eqn\_from\_branch()}{17}{subsubsection.3.10.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.11}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Ext\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{17}{section.3.11}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt}{{3.11}{17}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+ISource\+Text\+Fmt Class Reference}{section.3.11}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ae6f0b97877540bb7d1ff87f7f3f3086b}{{3.11}{17}{Public Member Functions}{section*.26}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.11.1}Detailed Description}{17}{subsection.3.11.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.11.2}Member Function Documentation}{17}{subsection.3.11.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt_ac951e005392e3310cf2eb4d784a1fa53}{{3.11.2}{17}{Member Function Documentation}{subsection.3.11.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.11.2.1}gen\_txt\_str()}{18}{subsubsection.3.11.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.12}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Ext\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{18}{section.3.12}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt}{{3.12}{18}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Ext\+VSource\+Text\+Fmt Class Reference}{section.3.12}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_a5a238dd8e12a9872ba2a550b61a589b7}{{3.12}{18}{Public Member Functions}{section*.28}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.12.1}Detailed Description}{18}{subsection.3.12.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.12.2}Member Function Documentation}{18}{subsection.3.12.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt_af38b1b8666f2f8a65529dcd542df07a6}{{3.12.2}{18}{Member Function Documentation}{subsection.3.12.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.12.2.1}gen\_txt\_str()}{19}{subsubsection.3.12.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.13}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Inductor Class Reference}{19}{section.3.13}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor}{{3.13}{19}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Inductor Class Reference}{section.3.13}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.13.1}Detailed Description}{19}{subsection.3.13.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.13.2}Member Function Documentation}{19}{subsection.3.13.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ad06a129aab82f87f4c3ee9f0ab1b3cbb}{{3.13.2}{19}{Member Function Documentation}{subsection.3.13.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.13.2.1}op\_pt\_eqn()}{19}{subsubsection.3.13.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor_ac341a3ff55622d333f6c98f3882c7845}{{3.13.2.1}{19}{\texorpdfstring {op\_pt\_eqn()}{op\_pt\_eqn()}}{subsubsection.3.13.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.13.2.2}trans\_eqn()}{20}{subsubsection.3.13.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.14}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Inductor\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{20}{section.3.14}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt}{{3.14}{20}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Inductor\+Text\+Fmt Class Reference}{section.3.14}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a664c070ea0172ac12c502376d12d7974}{{3.14}{20}{Public Member Functions}{section*.31}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_affc695d1202a850a100375a211b300b6}{{3.14}{20}{Public Attributes}{section*.32}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.14.1}Detailed Description}{21}{subsection.3.14.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.14.2}Member Function Documentation}{21}{subsection.3.14.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt_a8b26e5c7d5d2237795dd7cfb7cbbfca4}{{3.14.2}{21}{Member Function Documentation}{subsection.3.14.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.14.2.1}gen\_txt\_str()}{21}{subsubsection.3.14.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.15}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource Class Reference}{21}{section.3.15}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource}{{3.15}{21}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+ISource Class Reference}{section.3.15}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.15.1}Detailed Description}{21}{subsection.3.15.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.15.2}Member Function Documentation}{21}{subsection.3.15.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a045e7e1c272fa2f0c1bd873316cb8a55}{{3.15.2}{21}{Member Function Documentation}{subsection.3.15.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.15.2.1}op\_pt\_eqn()}{22}{subsubsection.3.15.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource_a4806826ab24c1ce0971ca6977b00352f}{{3.15.2.1}{22}{\texorpdfstring {op\_pt\_eqn()}{op\_pt\_eqn()}}{subsubsection.3.15.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.15.2.2}trans\_eqn()}{22}{subsubsection.3.15.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.16}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{22}{section.3.16}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt}{{3.16}{22}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+ISource\+Text\+Fmt Class Reference}{section.3.16}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt_a595b7da11052a821ca8282def0cc4b00}{{3.16}{23}{Public Member Functions}{section*.35}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt_a30dd28bf4ed9156706eff59244434d7c}{{3.16}{23}{Public Attributes}{section*.36}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.16.1}Detailed Description}{23}{subsection.3.16.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.16.2}Member Function Documentation}{23}{subsection.3.16.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt_a4ebf00a3da61fb48c0015fe3dd6e2713}{{3.16.2}{23}{Member Function Documentation}{subsection.3.16.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.16.2.1}gen\_txt\_str()}{23}{subsubsection.3.16.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.17}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICECircuit\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Error Class Reference}{23}{section.3.17}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError}{{3.17}{23}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECircuit\+Error Class Reference}{section.3.17}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.18}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Simulation.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICECircuit\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Simulator Class Reference}{24}{section.3.18}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator}{{3.18}{24}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Simulation.\+Open\+SPICECircuit\+Simulator Class Reference}{section.3.18}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_aecf97a60152602696eaaafa443ada617}{{3.18}{24}{Public Member Functions}{section*.39}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_aa60a584f430c8dbf67371102ea9c3167}{{3.18}{24}{Public Member Functions}{section*.39}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator_a389a78a5a2e263e68bd8d7d5cdea203f}{{3.18}{24}{Static Public Attributes}{section*.40}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.19}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICECommand\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Error Class Reference}{24}{section.3.19}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError}{{3.19}{24}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICECommand\+Error Class Reference}{section.3.19}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.20}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Server.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICEServer Class Reference}{24}{section.3.20}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer}{{3.20}{24}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Server.\+Open\+SPICEServer Class Reference}{section.3.20}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_ac6249afc8682cc156b9f47321ae3789d}{{3.20}{24}{Public Member Functions}{section*.42}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a672788a58688ec90b2a61452106fb845}{{3.20}{25}{Static Public Attributes}{section*.43}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.20.1}Detailed Description}{25}{subsection.3.20.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.20.2}Member Function Documentation}{25}{subsection.3.20.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer_a9b32d3efb2d703078900bab456442923}{{3.20.2}{25}{Member Function Documentation}{subsection.3.20.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.20.2.1}\_\_call\_\_()}{25}{subsubsection.3.20.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.21}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICEShared Class Reference}{25}{section.3.21}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared}{{3.21}{25}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Open\+SPICEShared Class Reference}{section.3.21}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab95cb40c65a3f7b47dfb9c4e665d8afd}{{3.21}{25}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a64b03209550da856d82a2b6a3d8caa10}{{3.21}{25}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a6cf8226c47e1c09fb52eab5ca8913998}{{3.21}{25}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a21cf1636cc878b87d75034971dd91845}{{3.21}{25}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a29737774da7de2e0b3c0e831149f430d}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_aa0e6b5d6b67bf2970ceff31127f715b1}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a5f80c968afb70549b0ce20a71f34bb27}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a382f6be352d95e9637089b6c11dd65ec}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ae63ca8ed2cdd3f927dfae32785a3b17d}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a0436de920ae2df65d1c6ea1361b9d8d6}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_af0d55b30fc5fd1301e6ed56604767bc7}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ad1f760b922471e24c7a12e42bb7386cc}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a8cc31d306fbe4cd06502c0d3b1670c62}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ac391f36b0008f624217185e75baf24fd}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a84a45d30b778a2c9c5ec2a6149125eaa}{{3.21}{26}{Public Member Functions}{section*.44}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a80641deecf26b2305a056d02080e8902}{{3.21}{26}{Static Public Attributes}{section*.45}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a82f275641bd315c80160f1535581e9b0}{{3.21}{26}{Static Public Attributes}{section*.45}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab0a620b406cb77f55e7ccdc778799134}{{3.21}{26}{Static Public Attributes}{section*.45}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a08472c8e5e29d1150592033db732a50d}{{3.21}{26}{Static Public Attributes}{section*.45}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.21.1}Constructor \& Destructor Documentation}{26}{subsection.3.21.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a37d68d976f955cb5a279c5c9e25363f0}{{3.21.1}{26}{Constructor \& Destructor Documentation}{subsection.3.21.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.1.1}\_\_init\_\_()}{27}{subsubsection.3.21.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.21.2}Member Function Documentation}{27}{subsection.3.21.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a6f7dab12bd779d95a30bcdacc682555d}{{3.21.2}{27}{Member Function Documentation}{subsection.3.21.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.1}alter\_device()}{27}{subsubsection.3.21.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a2ba787abefd14c1c38cdc7cd3b74e81c}{{3.21.2.1}{27}{\texorpdfstring {alter\_device()}{alter\_device()}}{subsubsection.3.21.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.2}alter\_model()}{27}{subsubsection.3.21.2.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a5bf48a46eabd940a02014f7724e6f9d9}{{3.21.2.2}{27}{\texorpdfstring {alter\_model()}{alter\_model()}}{subsubsection.3.21.2.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.3}delete()}{27}{subsubsection.3.21.2.3}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a467d0b7bf06b099ecb1544ad4dec587e}{{3.21.2.3}{27}{\texorpdfstring {delete()}{delete()}}{subsubsection.3.21.2.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.4}destroy()}{28}{subsubsection.3.21.2.4}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab03f67ba8f07275fd1271266d18021d2}{{3.21.2.4}{28}{\texorpdfstring {destroy()}{destroy()}}{subsubsection.3.21.2.4}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.5}device\_help()}{28}{subsubsection.3.21.2.5}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_aab4ab016f018f9e6fa077297740a17aa}{{3.21.2.5}{28}{\texorpdfstring {device\_help()}{device\_help()}}{subsubsection.3.21.2.5}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.6}exec\_command()}{28}{subsubsection.3.21.2.6}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a810f756e2166d7eb7e03f5fc49720cb8}{{3.21.2.6}{28}{\texorpdfstring {exec\_command()}{exec\_command()}}{subsubsection.3.21.2.6}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.7}get\_isrc\_data()}{28}{subsubsection.3.21.2.7}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_acab2c42d747a063219aa30d29c340095}{{3.21.2.7}{28}{\texorpdfstring {get\_isrc\_data()}{get\_isrc\_data()}}{subsubsection.3.21.2.7}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.8}get\_vsrc\_data()}{29}{subsubsection.3.21.2.8}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_abafd3313bc4e91fc6d62aaeffb9b1368}{{3.21.2.8}{29}{\texorpdfstring {get\_vsrc\_data()}{get\_vsrc\_data()}}{subsubsection.3.21.2.8}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.9}halt()}{29}{subsubsection.3.21.2.9}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a120390a0bc25d269e6a1550ebde19275}{{3.21.2.9}{29}{\texorpdfstring {halt()}{halt()}}{subsubsection.3.21.2.9}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.10}has\_cider()}{29}{subsubsection.3.21.2.10}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_affa0a362f5d1dae4e7c754198f8cb871}{{3.21.2.10}{29}{\texorpdfstring {has\_cider()}{has\_cider()}}{subsubsection.3.21.2.10}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.11}has\_xspice()}{29}{subsubsection.3.21.2.11}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a89441cbcf79f3d495c8378cf8335e691}{{3.21.2.11}{29}{\texorpdfstring {has\_xspice()}{has\_xspice()}}{subsubsection.3.21.2.11}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.12}last\_plot()}{29}{subsubsection.3.21.2.12}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ae6168252554082ee5347a1cc380821ba}{{3.21.2.12}{29}{\texorpdfstring {last\_plot()}{last\_plot()}}{subsubsection.3.21.2.12}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.13}load\_circuit()}{30}{subsubsection.3.21.2.13}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_aaf488b49a2e4a1c27885b62838f953bd}{{3.21.2.13}{30}{\texorpdfstring {load\_circuit()}{load\_circuit()}}{subsubsection.3.21.2.13}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.14}new\_instance()}{30}{subsubsection.3.21.2.14}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a06349026c87fc0c2890ce132bdb0395e}{{3.21.2.14}{30}{\texorpdfstring {new\_instance()}{new\_instance()}}{subsubsection.3.21.2.14}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.15}option()}{30}{subsubsection.3.21.2.15}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a4b742ee2f4befee6aa540f30618374a6}{{3.21.2.15}{30}{\texorpdfstring {option()}{option()}}{subsubsection.3.21.2.15}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.16}plot()}{30}{subsubsection.3.21.2.16}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a02fc26f745fcf8cf9ec84aec4d913810}{{3.21.2.16}{30}{\texorpdfstring {plot()}{plot()}}{subsubsection.3.21.2.16}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.17}plot\_names()}{31}{subsubsection.3.21.2.17}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a95fa7d686a732eaa519d7bf968090e29}{{3.21.2.17}{31}{\texorpdfstring {plot\_names()}{plot\_names()}}{subsubsection.3.21.2.17}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.18}remove\_circuit()}{31}{subsubsection.3.21.2.18}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a2a3974918483857a8d1e8c58c385f9a6}{{3.21.2.18}{31}{\texorpdfstring {remove\_circuit()}{remove\_circuit()}}{subsubsection.3.21.2.18}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.19}reset()}{31}{subsubsection.3.21.2.19}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a2975560396ac271e6e0f2185114575b5}{{3.21.2.19}{31}{\texorpdfstring {reset()}{reset()}}{subsubsection.3.21.2.19}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.20}ressource\_usage()}{31}{subsubsection.3.21.2.20}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a1ddcc31222b376a2ee9f931363020259}{{3.21.2.20}{31}{\texorpdfstring {ressource\_usage()}{ressource\_usage()}}{subsubsection.3.21.2.20}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.21}resume()}{32}{subsubsection.3.21.2.21}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a2f024a8880622974cce0e8d761dc7b35}{{3.21.2.21}{32}{\texorpdfstring {resume()}{resume()}}{subsubsection.3.21.2.21}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.22}run()}{32}{subsubsection.3.21.2.22}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a872f439f711ec7d344f2c0ace268d88e}{{3.21.2.22}{32}{\texorpdfstring {run()}{run()}}{subsubsection.3.21.2.22}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.23}send\_char()}{32}{subsubsection.3.21.2.23}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a73b6fce7ec12ee47a83190b851c137d1}{{3.21.2.23}{32}{\texorpdfstring {send\_char()}{send\_char()}}{subsubsection.3.21.2.23}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.24}send\_data()}{32}{subsubsection.3.21.2.24}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a4ab3fd2b7bfa431354e3323e813e0389}{{3.21.2.24}{32}{\texorpdfstring {send\_data()}{send\_data()}}{subsubsection.3.21.2.24}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.25}send\_init\_data()}{33}{subsubsection.3.21.2.25}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_af54da037bd4cbe7b0c9084b918c29475}{{3.21.2.25}{33}{\texorpdfstring {send\_init\_data()}{send\_init\_data()}}{subsubsection.3.21.2.25}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.26}send\_stat()}{33}{subsubsection.3.21.2.26}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a9fe67a8df71a72fda18d23bda4e06c1c}{{3.21.2.26}{33}{\texorpdfstring {send\_stat()}{send\_stat()}}{subsubsection.3.21.2.26}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.27}set()}{33}{subsubsection.3.21.2.27}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ad3ff148a6bc0d76b456ab5e20c300115}{{3.21.2.27}{33}{\texorpdfstring {set()}{set()}}{subsubsection.3.21.2.27}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.28}set\_circuit()}{33}{subsubsection.3.21.2.28}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a1f4a553731c211663406866339daac54}{{3.21.2.28}{33}{\texorpdfstring {set\_circuit()}{set\_circuit()}}{subsubsection.3.21.2.28}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.29}source()}{34}{subsubsection.3.21.2.29}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a24bb4f5c5c0f823688c0fc7976f6c472}{{3.21.2.29}{34}{\texorpdfstring {source()}{source()}}{subsubsection.3.21.2.29}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.30}status()}{34}{subsubsection.3.21.2.30}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_a982c0d1e975838cbcf688dddeb2ba162}{{3.21.2.30}{34}{\texorpdfstring {status()}{status()}}{subsubsection.3.21.2.30}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.31}step()}{34}{subsubsection.3.21.2.31}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab6e523dc420dacad61780ca6fc176b9e}{{3.21.2.31}{34}{\texorpdfstring {step()}{step()}}{subsubsection.3.21.2.31}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.32}stop()}{34}{subsubsection.3.21.2.32}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ae214794bb54d521a2cf205b069a0db59}{{3.21.2.32}{34}{\texorpdfstring {stop()}{stop()}}{subsubsection.3.21.2.32}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.33}trace()}{35}{subsubsection.3.21.2.33}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ab6945dd05fcf1b3e7e2326660331be82}{{3.21.2.33}{35}{\texorpdfstring {trace()}{trace()}}{subsubsection.3.21.2.33}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.34}unset()}{35}{subsubsection.3.21.2.34}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared_ad6f50f9acb100a118c009d6aceb0a618}{{3.21.2.34}{35}{\texorpdfstring {unset()}{unset()}}{subsubsection.3.21.2.34}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.21.2.35}where()}{35}{subsubsection.3.21.2.35}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.22}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}solve.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Op\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Pt\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Solver\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{35}{section.3.22}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy}{{3.22}{35}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Op\+Pt\+Solver\+Strategy Class Reference}{section.3.22}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a0f519c747f41e6e1a9cbd1370f6248ac}{{3.22}{36}{Public Attributes}{section*.48}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a2b6c73f946853db959352cf13cc6775a}{{3.22}{36}{Public Attributes}{section*.48}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.22.1}Detailed Description}{36}{subsection.3.22.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.22.2}Constructor \& Destructor Documentation}{36}{subsection.3.22.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_acf61620112226d8dd1d6057f1da87ea0}{{3.22.2}{36}{Constructor \& Destructor Documentation}{subsection.3.22.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.22.2.1}\_\_init\_\_()}{36}{subsubsection.3.22.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.22.3}Member Function Documentation}{36}{subsection.3.22.3}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy_a7046e1818f18afb2e7bc32ecf07c664d}{{3.22.3}{36}{Member Function Documentation}{subsection.3.22.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.22.3.1}solve\_eqns()}{36}{subsubsection.3.22.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.23}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Plot Class Reference}{37}{section.3.23}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot}{{3.23}{37}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Plot Class Reference}{section.3.23}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a6aa560820c3f6137c6d2382bc178d44b}{{3.23}{37}{Public Member Functions}{section*.50}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_af2faa6587b7873e82fed3c0fd96fe05d}{{3.23}{37}{Public Member Functions}{section*.50}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a7ec829a77d9a04b08fe3db8d75ec454c}{{3.23}{37}{Public Member Functions}{section*.50}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a08abc7b5e0bed955de5817adcd0f2e7f}{{3.23}{37}{Public Member Functions}{section*.50}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a49a1bb6e60767ef756d2cfcd6566b375}{{3.23}{37}{Public Member Functions}{section*.50}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a24daff7f9c334b655ada4c998d3ab159}{{3.23}{37}{Public Member Functions}{section*.50}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot_a5151dcf3583387f7110c74e011dbd39c}{{3.23}{37}{Public Attributes}{section*.51}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.23.1}Detailed Description}{37}{subsection.3.23.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.24}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Raw\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}File.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Raw\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}File Class Reference}{37}{section.3.24}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile}{{3.24}{37}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Raw\+File Class Reference}{section.3.24}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_a3c9ec352d83678cd19df87ac06bbfa15}{{3.24}{38}{Public Member Functions}{section*.53}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_a2b5b7c5a4d3a600e3ee2f79c5c19af72}{{3.24}{38}{Public Attributes}{section*.54}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_a0f9db91f1981d1bfdaa050e33056ccd7}{{3.24}{38}{Public Attributes}{section*.54}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_a24fb595bb02948ac0f1e5c327660d6be}{{3.24}{38}{Public Attributes}{section*.54}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_adcebf6ac984c52b873ee764884e4b71a}{{3.24}{38}{Public Attributes}{section*.54}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_ad5749f72b27d55c73e39c785aa9642b1}{{3.24}{38}{Public Attributes}{section*.54}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_a7b196e561102156aea1a654b082a134c}{{3.24}{38}{Public Attributes}{section*.54}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.24.1}Detailed Description}{38}{subsection.3.24.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.24.2}Member Function Documentation}{38}{subsection.3.24.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile_a92fae55aefb86094168d1f29a7bb1739}{{3.24.2}{38}{Member Function Documentation}{subsection.3.24.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.24.2.1}fix\_case()}{38}{subsubsection.3.24.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.25}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Resistor Class Reference}{39}{section.3.25}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor}{{3.25}{39}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+Resistor Class Reference}{section.3.25}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.25.1}Detailed Description}{39}{subsection.3.25.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.25.2}Member Function Documentation}{39}{subsection.3.25.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_af2854856cb75351027800ff8fe2b226f}{{3.25.2}{39}{Member Function Documentation}{subsection.3.25.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.25.2.1}op\_pt\_eqn()}{39}{subsubsection.3.25.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor_ae51955bca73419e44e93ca3d0c9ce027}{{3.25.2.1}{39}{\texorpdfstring {op\_pt\_eqn()}{op\_pt\_eqn()}}{subsubsection.3.25.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.25.2.2}trans\_eqn()}{40}{subsubsection.3.25.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.26}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Resistor\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{40}{section.3.26}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt}{{3.26}{40}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Resistor\+Text\+Fmt Class Reference}{section.3.26}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aabd77103416e27d09a3886a05b09216b}{{3.26}{40}{Public Member Functions}{section*.58}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_a79c5b751e10bd433f6b409ecbd45c6c3}{{3.26}{40}{Public Attributes}{section*.59}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.26.1}Detailed Description}{40}{subsection.3.26.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.26.2}Member Function Documentation}{41}{subsection.3.26.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt_aa898c5d718a876f08110033ed156b205}{{3.26.2}{41}{Member Function Documentation}{subsection.3.26.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.26.2.1}gen\_txt\_str()}{41}{subsubsection.3.26.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.27}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}solve.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Solver\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{41}{section.3.27}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy}{{3.27}{41}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Solver\+Strategy Class Reference}{section.3.27}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.27.1}Detailed Description}{41}{subsection.3.27.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.27.2}Member Function Documentation}{41}{subsection.3.27.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy_a1adde88d9b0006e96ce7fcfad14b8be5}{{3.27.2}{41}{Member Function Documentation}{subsection.3.27.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.27.2.1}solve\_eqns()}{42}{subsubsection.3.27.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.28}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{42}{section.3.28}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt}{{3.28}{42}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+Text\+Fmt Class Reference}{section.3.28}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.28.1}Detailed Description}{43}{subsection.3.28.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.28.2}Member Function Documentation}{43}{subsection.3.28.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt_a973dc692c0ca4787ae14d8fbd590e2c9}{{3.28.2}{43}{Member Function Documentation}{subsection.3.28.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.28.2.1}gen\_txt\_str()}{43}{subsubsection.3.28.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.29}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}solve.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Transient\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Solver\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{43}{section.3.29}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy}{{3.29}{43}{Py\+Spice.\+Spice.\+Open\+SPICE.\+solve.\+Transient\+Solver\+Strategy Class Reference}{section.3.29}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a291a6bd276ef841551ceea201bcfdf73}{{3.29}{44}{Public Attributes}{section*.66}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ae90d3563ec4f46915c502c4a5644b3d5}{{3.29}{44}{Public Attributes}{section*.66}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ae4a7470da0001d15f4fccf0e269eef71}{{3.29}{44}{Public Attributes}{section*.66}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.29.1}Detailed Description}{44}{subsection.3.29.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.29.2}Constructor \& Destructor Documentation}{44}{subsection.3.29.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_ad7d38403a82dec88ba02bc10d3a8257f}{{3.29.2}{44}{Constructor \& Destructor Documentation}{subsection.3.29.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.29.2.1}\_\_init\_\_()}{44}{subsubsection.3.29.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.29.3}Member Function Documentation}{44}{subsection.3.29.3}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy_a369e30252265706d3adbfcf91613c963}{{3.29.3}{44}{Member Function Documentation}{subsection.3.29.3}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.29.3.1}solve\_eqns()}{44}{subsubsection.3.29.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.30}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Raw\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}File.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Variable Class Reference}{45}{section.3.30}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable}{{3.30}{45}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Raw\+File.\+Variable Class Reference}{section.3.30}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_a2228a16b928ef40dfa2030aecd787457}{{3.30}{45}{Public Member Functions}{section*.68}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_afdbd329fcc15ec41ff4570d31a088ff9}{{3.30}{45}{Public Member Functions}{section*.68}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_ad58306879a233a6d8f90bbd8fc7d9fb4}{{3.30}{45}{Public Member Functions}{section*.68}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable_ae86c0cc4ad99b894d9d2e8e585f3388e}{{3.30}{45}{Static Public Member Functions}{section*.69}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.31}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VCCSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{45}{section.3.31}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt}{{3.31}{45}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCCSSource\+Text\+Fmt Class Reference}{section.3.31}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a594aea45558abed642c9fe18a76ce2f7}{{3.31}{45}{Public Member Functions}{section*.71}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_ac29c279ae27cdca7a4ecf18973266748}{{3.31}{45}{Public Attributes}{section*.72}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a89c931a7ef213af7f0dfafc21fd4ae0f}{{3.31}{45}{Public Attributes}{section*.72}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a08587bea6edc63bbf62c0b10db7366c2}{{3.31}{45}{Public Attributes}{section*.72}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.31.1}Detailed Description}{46}{subsection.3.31.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.31.2}Member Function Documentation}{46}{subsection.3.31.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt_a7ad533355bdad39c4b8364455d5a6420}{{3.31.2}{46}{Member Function Documentation}{subsection.3.31.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.31.2.1}gen\_txt\_str()}{46}{subsubsection.3.31.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.32}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VCVSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{46}{section.3.32}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt}{{3.32}{46}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VCVSSource\+Text\+Fmt Class Reference}{section.3.32}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a7c180287a7a530f8878f6ab05446a9fa}{{3.32}{46}{Public Member Functions}{section*.74}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a99ea9748ddc620c737d5b6ad95cb85d0}{{3.32}{46}{Public Attributes}{section*.75}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a58fc02fb1a4225634ee78a873a318a77}{{3.32}{46}{Public Attributes}{section*.75}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_aeb075e1891924c5980602d06eae57c8d}{{3.32}{46}{Public Attributes}{section*.75}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.32.1}Detailed Description}{47}{subsection.3.32.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.32.2}Member Function Documentation}{47}{subsection.3.32.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt_a90d68eea5ce0d62c56f998b4a730f900}{{3.32.2}{47}{Member Function Documentation}{subsection.3.32.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.32.2.1}gen\_txt\_str()}{47}{subsubsection.3.32.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.33}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Vector Class Reference}{47}{section.3.33}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector}{{3.33}{47}{Py\+Spice.\+Spice.\+Open\+SPICE.\+Shared.\+Vector Class Reference}{section.3.33}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_ad330afc88a6d62d46ba8809989f4ddf2}{{3.33}{47}{Public Member Functions}{section*.76}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_acba185990e750c258df8edfaf026a6d4}{{3.33}{47}{Public Member Functions}{section*.76}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a4c3e88b20f6f7c6d75e3696fdfc411da}{{3.33}{47}{Public Member Functions}{section*.76}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a53073c514ff8f3442a8a1de27957351e}{{3.33}{47}{Public Member Functions}{section*.76}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a9eb08ad6a8d4032c193ea71e0a5dc5ea}{{3.33}{47}{Public Member Functions}{section*.76}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_acf0baf55206851b9b2e5ea1dc3858c41}{{3.33}{47}{Public Member Functions}{section*.76}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.33.1}Detailed Description}{47}{subsection.3.33.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.33.2}Member Function Documentation}{48}{subsection.3.33.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector_a396d3934c33e9835f58647bfc140d078}{{3.33.2}{48}{Member Function Documentation}{subsection.3.33.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.33.2.1}to\_waveform()}{48}{subsubsection.3.33.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.34}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource Class Reference}{48}{section.3.34}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource}{{3.34}{48}{Py\+Spice.\+Spice.\+Open\+SPICE.\+components.\+VSource Class Reference}{section.3.34}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.34.1}Detailed Description}{48}{subsection.3.34.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.34.2}Member Function Documentation}{48}{subsection.3.34.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_a162e750ddd6488d6b4bbb9742f1a73c5}{{3.34.2}{48}{Member Function Documentation}{subsection.3.34.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.34.2.1}op\_pt\_eqn()}{48}{subsubsection.3.34.2.1}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource_af80cad45c7e98c2138ddee60d9a97456}{{3.34.2.1}{48}{\texorpdfstring {op\_pt\_eqn()}{op\_pt\_eqn()}}{subsubsection.3.34.2.1}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.34.2.2}trans\_eqn()}{49}{subsubsection.3.34.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.35}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{49}{section.3.35}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt}{{3.35}{49}{Py\+Spice.\+Spice.\+Open\+SPICE.\+netlist.\+VSource\+Text\+Fmt Class Reference}{section.3.35}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a218c5fe72f2e74293fee57658e6d08fa}{{3.35}{49}{Public Member Functions}{section*.79}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a91a37c06f2a4b47544eb5a70ef94179c}{{3.35}{49}{Public Attributes}{section*.80}{}} +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a55a9cdb146bf28bcd53513545da0c43b}{{3.35}{49}{Public Attributes}{section*.80}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.35.1}Detailed Description}{49}{subsection.3.35.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.35.2}Member Function Documentation}{50}{subsection.3.35.2}\protected@file@percent } +\newlabel{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt_a1ce38e2bdb46dd3d2ea62d0d09c1b2c2}{{3.35.2}{50}{Member Function Documentation}{subsection.3.35.2}{}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.35.2.1}gen\_txt\_str()}{50}{subsubsection.3.35.2.1}\protected@file@percent } +\gdef \@abspage@last{52} diff --git a/PySpice/Spice/OpenSPICE/latex/refman.idx b/PySpice/Spice/OpenSPICE/latex/refman.idx new file mode 100644 index 00000000..b753750e --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/refman.idx @@ -0,0 +1,189 @@ +\indexentry{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt}|hyperpage}{5} +\indexentry{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{5} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavISourceTextFmt}|hyperpage}{5} +\indexentry{PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt}|hyperpage}{6} +\indexentry{PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{6} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.BehavVSourceTextFmt}|hyperpage}{6} +\indexentry{PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}|hyperpage}{7} +\indexentry{PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}!op\_pt\_eqn@{op\_pt\_eqn}|hyperpage}{7} +\indexentry{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}|hyperpage}{7} +\indexentry{PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}!trans\_eqn@{trans\_eqn}|hyperpage}{7} +\indexentry{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Capacitor@{PySpice.Spice.OpenSPICE.components.Capacitor}|hyperpage}{7} +\indexentry{PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt@{PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt}|hyperpage}{8} +\indexentry{PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt@{PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{9} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt@{PySpice.Spice.OpenSPICE.netlist.CapacitorTextFmt}|hyperpage}{9} +\indexentry{PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt}|hyperpage}{9} +\indexentry{PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{10} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.CCCSSourceTextFmt}|hyperpage}{10} +\indexentry{PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt}|hyperpage}{10} +\indexentry{PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{11} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.CCVSSourceTextFmt}|hyperpage}{11} +\indexentry{PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}|hyperpage}{11} +\indexentry{PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}!op\_pt\_eqn@{op\_pt\_eqn}|hyperpage}{12} +\indexentry{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}|hyperpage}{12} +\indexentry{PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}!trans\_eqn@{trans\_eqn}|hyperpage}{12} +\indexentry{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Component@{PySpice.Spice.OpenSPICE.components.Component}|hyperpage}{12} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy}|hyperpage}{13} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy}!\_\_init\_\_@{\_\_init\_\_}|hyperpage}{13} +\indexentry{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy}|hyperpage}{13} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy}!gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}|hyperpage}{13} +\indexentry{gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrOpPtStrategy}|hyperpage}{13} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}|hyperpage}{14} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}!gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}|hyperpage}{14} +\indexentry{gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}|hyperpage}{14} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}!gen\_eqns@{gen\_eqns}|hyperpage}{15} +\indexentry{gen\_eqns@{gen\_eqns}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}|hyperpage}{15} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}!gen\_kcl\_eqns@{gen\_kcl\_eqns}|hyperpage}{15} +\indexentry{gen\_kcl\_eqns@{gen\_kcl\_eqns}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrStrategy}|hyperpage}{15} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}|hyperpage}{16} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}!\_\_init\_\_@{\_\_init\_\_}|hyperpage}{16} +\indexentry{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}|hyperpage}{16} +\indexentry{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}!gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}|hyperpage}{16} +\indexentry{gen\_eqn\_from\_branch@{gen\_eqn\_from\_branch}!PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy@{PySpice.Spice.OpenSPICE.eqnstr.EqnStrTransientStrategy}|hyperpage}{16} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt}|hyperpage}{17} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{17} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtISourceTextFmt}|hyperpage}{17} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt}|hyperpage}{18} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{18} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ExtVSourceTextFmt}|hyperpage}{18} +\indexentry{PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}|hyperpage}{19} +\indexentry{PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}!op\_pt\_eqn@{op\_pt\_eqn}|hyperpage}{19} +\indexentry{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}|hyperpage}{19} +\indexentry{PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}!trans\_eqn@{trans\_eqn}|hyperpage}{19} +\indexentry{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Inductor@{PySpice.Spice.OpenSPICE.components.Inductor}|hyperpage}{19} +\indexentry{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt@{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt}|hyperpage}{20} +\indexentry{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt@{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{21} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.InductorTextFmt@{PySpice.Spice.OpenSPICE.netlist.InductorTextFmt}|hyperpage}{21} +\indexentry{PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}|hyperpage}{21} +\indexentry{PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}!op\_pt\_eqn@{op\_pt\_eqn}|hyperpage}{21} +\indexentry{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}|hyperpage}{21} +\indexentry{PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}!trans\_eqn@{trans\_eqn}|hyperpage}{22} +\indexentry{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.ISource@{PySpice.Spice.OpenSPICE.components.ISource}|hyperpage}{22} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt}|hyperpage}{22} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{23} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.ISourceTextFmt}|hyperpage}{23} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError@{PySpice.Spice.OpenSPICE.Shared.OpenSPICECircuitError}|hyperpage}{23} +\indexentry{PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator@{PySpice.Spice.OpenSPICE.Simulation.OpenSPICECircuitSimulator}|hyperpage}{24} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError@{PySpice.Spice.OpenSPICE.Shared.OpenSPICECommandError}|hyperpage}{24} +\indexentry{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer@{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer}|hyperpage}{24} +\indexentry{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer@{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer}!\_\_call\_\_@{\_\_call\_\_}|hyperpage}{25} +\indexentry{\_\_call\_\_@{\_\_call\_\_}!PySpice.Spice.OpenSPICE.Server.OpenSPICEServer@{PySpice.Spice.OpenSPICE.Server.OpenSPICEServer}|hyperpage}{25} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{25} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!\_\_init\_\_@{\_\_init\_\_}|hyperpage}{26} +\indexentry{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{26} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!alter\_device@{alter\_device}|hyperpage}{27} +\indexentry{alter\_device@{alter\_device}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{27} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!alter\_model@{alter\_model}|hyperpage}{27} +\indexentry{alter\_model@{alter\_model}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{27} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!delete@{delete}|hyperpage}{27} +\indexentry{delete@{delete}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{27} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!destroy@{destroy}|hyperpage}{27} +\indexentry{destroy@{destroy}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{27} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!device\_help@{device\_help}|hyperpage}{28} +\indexentry{device\_help@{device\_help}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{28} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!exec\_command@{exec\_command}|hyperpage}{28} +\indexentry{exec\_command@{exec\_command}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{28} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!get\_isrc\_data@{get\_isrc\_data}|hyperpage}{28} +\indexentry{get\_isrc\_data@{get\_isrc\_data}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{28} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!get\_vsrc\_data@{get\_vsrc\_data}|hyperpage}{28} +\indexentry{get\_vsrc\_data@{get\_vsrc\_data}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{28} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!halt@{halt}|hyperpage}{29} +\indexentry{halt@{halt}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{29} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!has\_cider@{has\_cider}|hyperpage}{29} +\indexentry{has\_cider@{has\_cider}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{29} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!has\_xspice@{has\_xspice}|hyperpage}{29} +\indexentry{has\_xspice@{has\_xspice}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{29} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!last\_plot@{last\_plot}|hyperpage}{29} +\indexentry{last\_plot@{last\_plot}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{29} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!load\_circuit@{load\_circuit}|hyperpage}{29} +\indexentry{load\_circuit@{load\_circuit}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{29} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!new\_instance@{new\_instance}|hyperpage}{30} +\indexentry{new\_instance@{new\_instance}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{30} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!option@{option}|hyperpage}{30} +\indexentry{option@{option}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{30} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!plot@{plot}|hyperpage}{30} +\indexentry{plot@{plot}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{30} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!plot\_names@{plot\_names}|hyperpage}{30} +\indexentry{plot\_names@{plot\_names}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{30} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!remove\_circuit@{remove\_circuit}|hyperpage}{31} +\indexentry{remove\_circuit@{remove\_circuit}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{31} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!reset@{reset}|hyperpage}{31} +\indexentry{reset@{reset}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{31} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!ressource\_usage@{ressource\_usage}|hyperpage}{31} +\indexentry{ressource\_usage@{ressource\_usage}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{31} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!resume@{resume}|hyperpage}{31} +\indexentry{resume@{resume}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{31} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!run@{run}|hyperpage}{32} +\indexentry{run@{run}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{32} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!send\_char@{send\_char}|hyperpage}{32} +\indexentry{send\_char@{send\_char}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{32} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!send\_data@{send\_data}|hyperpage}{32} +\indexentry{send\_data@{send\_data}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{32} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!send\_init\_data@{send\_init\_data}|hyperpage}{32} +\indexentry{send\_init\_data@{send\_init\_data}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{32} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!send\_stat@{send\_stat}|hyperpage}{33} +\indexentry{send\_stat@{send\_stat}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{33} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!set@{set}|hyperpage}{33} +\indexentry{set@{set}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{33} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!set\_circuit@{set\_circuit}|hyperpage}{33} +\indexentry{set\_circuit@{set\_circuit}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{33} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!source@{source}|hyperpage}{33} +\indexentry{source@{source}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{33} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!status@{status}|hyperpage}{34} +\indexentry{status@{status}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{34} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!step@{step}|hyperpage}{34} +\indexentry{step@{step}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{34} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!stop@{stop}|hyperpage}{34} +\indexentry{stop@{stop}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{34} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!trace@{trace}|hyperpage}{34} +\indexentry{trace@{trace}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{34} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!unset@{unset}|hyperpage}{35} +\indexentry{unset@{unset}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{35} +\indexentry{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}!where@{where}|hyperpage}{35} +\indexentry{where@{where}!PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared@{PySpice.Spice.OpenSPICE.Shared.OpenSPICEShared}|hyperpage}{35} +\indexentry{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}|hyperpage}{35} +\indexentry{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}!\_\_init\_\_@{\_\_init\_\_}|hyperpage}{36} +\indexentry{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}|hyperpage}{36} +\indexentry{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}!solve\_eqns@{solve\_eqns}|hyperpage}{36} +\indexentry{solve\_eqns@{solve\_eqns}!PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy@{PySpice.Spice.OpenSPICE.solve.OpPtSolverStrategy}|hyperpage}{36} +\indexentry{PySpice.Spice.OpenSPICE.Shared.Plot@{PySpice.Spice.OpenSPICE.Shared.Plot}|hyperpage}{37} +\indexentry{PySpice.Spice.OpenSPICE.RawFile.RawFile@{PySpice.Spice.OpenSPICE.RawFile.RawFile}|hyperpage}{37} +\indexentry{PySpice.Spice.OpenSPICE.RawFile.RawFile@{PySpice.Spice.OpenSPICE.RawFile.RawFile}!fix\_case@{fix\_case}|hyperpage}{38} +\indexentry{fix\_case@{fix\_case}!PySpice.Spice.OpenSPICE.RawFile.RawFile@{PySpice.Spice.OpenSPICE.RawFile.RawFile}|hyperpage}{38} +\indexentry{PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}|hyperpage}{39} +\indexentry{PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}!op\_pt\_eqn@{op\_pt\_eqn}|hyperpage}{39} +\indexentry{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}|hyperpage}{39} +\indexentry{PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}!trans\_eqn@{trans\_eqn}|hyperpage}{39} +\indexentry{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.Resistor@{PySpice.Spice.OpenSPICE.components.Resistor}|hyperpage}{39} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt@{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt}|hyperpage}{40} +\indexentry{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt@{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{41} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt@{PySpice.Spice.OpenSPICE.netlist.ResistorTextFmt}|hyperpage}{41} +\indexentry{PySpice.Spice.OpenSPICE.solve.SolverStrategy@{PySpice.Spice.OpenSPICE.solve.SolverStrategy}|hyperpage}{41} +\indexentry{PySpice.Spice.OpenSPICE.solve.SolverStrategy@{PySpice.Spice.OpenSPICE.solve.SolverStrategy}!solve\_eqns@{solve\_eqns}|hyperpage}{41} +\indexentry{solve\_eqns@{solve\_eqns}!PySpice.Spice.OpenSPICE.solve.SolverStrategy@{PySpice.Spice.OpenSPICE.solve.SolverStrategy}|hyperpage}{41} +\indexentry{PySpice.Spice.OpenSPICE.netlist.TextFmt@{PySpice.Spice.OpenSPICE.netlist.TextFmt}|hyperpage}{42} +\indexentry{PySpice.Spice.OpenSPICE.netlist.TextFmt@{PySpice.Spice.OpenSPICE.netlist.TextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{43} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.TextFmt@{PySpice.Spice.OpenSPICE.netlist.TextFmt}|hyperpage}{43} +\indexentry{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}|hyperpage}{43} +\indexentry{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}!\_\_init\_\_@{\_\_init\_\_}|hyperpage}{44} +\indexentry{\_\_init\_\_@{\_\_init\_\_}!PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}|hyperpage}{44} +\indexentry{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}!solve\_eqns@{solve\_eqns}|hyperpage}{44} +\indexentry{solve\_eqns@{solve\_eqns}!PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy@{PySpice.Spice.OpenSPICE.solve.TransientSolverStrategy}|hyperpage}{44} +\indexentry{PySpice.Spice.OpenSPICE.RawFile.Variable@{PySpice.Spice.OpenSPICE.RawFile.Variable}|hyperpage}{45} +\indexentry{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt}|hyperpage}{45} +\indexentry{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{46} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCCSSourceTextFmt}|hyperpage}{46} +\indexentry{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt}|hyperpage}{46} +\indexentry{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{47} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VCVSSourceTextFmt}|hyperpage}{47} +\indexentry{PySpice.Spice.OpenSPICE.Shared.Vector@{PySpice.Spice.OpenSPICE.Shared.Vector}|hyperpage}{47} +\indexentry{PySpice.Spice.OpenSPICE.Shared.Vector@{PySpice.Spice.OpenSPICE.Shared.Vector}!to\_waveform@{to\_waveform}|hyperpage}{48} +\indexentry{to\_waveform@{to\_waveform}!PySpice.Spice.OpenSPICE.Shared.Vector@{PySpice.Spice.OpenSPICE.Shared.Vector}|hyperpage}{48} +\indexentry{PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}|hyperpage}{48} +\indexentry{PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}!op\_pt\_eqn@{op\_pt\_eqn}|hyperpage}{48} +\indexentry{op\_pt\_eqn@{op\_pt\_eqn}!PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}|hyperpage}{48} +\indexentry{PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}!trans\_eqn@{trans\_eqn}|hyperpage}{48} +\indexentry{trans\_eqn@{trans\_eqn}!PySpice.Spice.OpenSPICE.components.VSource@{PySpice.Spice.OpenSPICE.components.VSource}|hyperpage}{48} +\indexentry{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt}|hyperpage}{49} +\indexentry{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt}!gen\_txt\_str@{gen\_txt\_str}|hyperpage}{50} +\indexentry{gen\_txt\_str@{gen\_txt\_str}!PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt@{PySpice.Spice.OpenSPICE.netlist.VSourceTextFmt}|hyperpage}{50} diff --git a/PySpice/Spice/OpenSPICE/latex/refman.log b/PySpice/Spice/OpenSPICE/latex/refman.log new file mode 100644 index 00000000..fc361d9c --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/refman.log @@ -0,0 +1,1611 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.22 (Web2C 2021) (preloaded format=pdflatex 2022.11.8) 18 NOV 2022 15:17 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**refman +(./refman.tex +LaTeX2e <2021-05-01> pre-release-2 (develop 2022-11-8 branch) +L3 programming layer <2021-02-18> +(/usr/local/share/texmf-dist/tex/latex-dev/base/book.cls +Document Class: book 2021/02/12 v1.4n Standard LaTeX document class +(/usr/local/share/texmf-dist/tex/latex-dev/base/bk10.clo +File: bk10.clo 2021/02/12 v1.4n Standard LaTeX file (size option) +) +\c@part=\count179 +\c@chapter=\count180 +\c@section=\count181 +\c@subsection=\count182 +\c@subsubsection=\count183 +\c@paragraph=\count184 +\c@subparagraph=\count185 +\c@figure=\count186 +\c@table=\count187 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/local/share/texmf-dist/tex/latex-dev/base/ifthen.sty +Package: ifthen 2020/11/24 v1.1c Standard LaTeX ifthen package (DPC) +) +(/usr/local/share/texmf-dist/tex/latex/tools/array.sty +Rollback for package 'array' requested -> date 2016-10-06. + Best approximation is the release introduced on 2016-10-06. + +(/usr/local/share/texmf-dist/tex/latex/tools/array-2016-10-06.sty +Package: array 2016/10/06 v2.4d Tabular extension package (FMi) +\col@sep=\dimen139 +\extrarowheight=\dimen140 +\NC@list=\toks16 +\extratabsurround=\skip49 +\backup@length=\skip50 +)) +(/usr/local/share/texmf-dist/tex/latex-dev/base/fixltx2e.sty +Package: fixltx2e 2016/12/29 v2.1a fixes to LaTeX (obsolete) +Applying: [2015/01/01] Old fixltx2e package on input line 46. + + +Package fixltx2e Warning: fixltx2e is not required with releases after 2015 +(fixltx2e) All fixes are now in the LaTeX kernel. +(fixltx2e) See the latexrelease package for details. + +Already applied: [0000/00/00] Old fixltx2e package on input line 53. +) (./doxygen.sty +Package: doxygen + (/usr/local/share/texmf-dist/tex/latex-dev/base/alltt.sty +Package: alltt 2021/01/29 v2.0g defines alltt environment +) +(/usr/local/share/texmf-dist/tex/latex/tools/calc.sty +Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count188 +\calc@Bcount=\count189 +\calc@Adimen=\dimen141 +\calc@Bdimen=\dimen142 +\calc@Askip=\skip51 +\calc@Bskip=\skip52 +LaTeX Info: Redefining \setlength on input line 80. +LaTeX Info: Redefining \addtolength on input line 81. +\calc@Ccount=\count190 +\calc@Cskip=\skip53 +) +(/usr/local/share/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count191 +\float@exts=\toks17 +\float@box=\box50 +\@float@everytoks=\toks18 +\@floatcapt=\box51 +) +(/usr/local/share/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2020-07-07 v1.5u LaTeX2e package for verbatim enhancements +\every@verbatim=\toks19 +\verbatim@line=\toks20 +\verbatim@in@stream=\read2 +) +(/usr/local/share/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/local/share/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 225. + +(/usr/local/share/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +) +(/usr/local/share/texmf-dist/tex/latex/colortbl/colortbl.sty +Package: colortbl 2020/01/04 v1.0e Color table columns (DPC) +\everycr=\toks21 +\minrowclearance=\skip54 +) +\rownum=\count192 +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(./longtable_doxygen.sty +Package: longtable_doxygen 2014/10/28 v4.11 Multi-page Table package (DPC) - fr +ozen version for doxygen +\LTleft=\skip55 +\LTright=\skip56 +\LTpre=\skip57 +\LTpost=\skip58 +\LTchunksize=\count193 +\LTcapwidth=\dimen143 +\LT@head=\box52 +\LT@firsthead=\box53 +\LT@foot=\box54 +\LT@lastfoot=\box55 +\LT@cols=\count194 +\LT@rows=\count195 +\c@LT@tables=\count196 +\c@LT@chunks=\count197 +\LT@p@ftn=\toks22 +) (./tabu_doxygen.sty +Package: tabu_doxygen 2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen ve +rsion for doxygen + +(/usr/local/share/texmf-dist/tex/latex/varwidth/varwidth.sty +Package: varwidth 2009/03/30 ver 0.92; Variable-width minipages +\@vwid@box=\box56 +\sift@deathcycles=\count198 +\@vwid@loff=\dimen144 +\@vwid@roff=\dimen145 +) +\c@taburow=\count199 +\tabu@nbcols=\count266 +\tabu@cnt=\count267 +\tabu@Xcol=\count268 +\tabu@alloc=\count269 +\tabu@nested=\count270 +\tabu@target=\dimen146 +\tabu@spreadtarget=\dimen147 +\tabu@naturalX=\dimen148 +\tabucolX=\dimen149 +\tabu@Xsum=\dimen150 +\extrarowdepth=\dimen151 +\abovetabulinesep=\dimen152 +\belowtabulinesep=\dimen153 +\tabustrutrule=\dimen154 +\tabu@thebody=\toks23 +\tabu@footnotes=\toks24 +\tabu@box=\box57 +\tabu@arstrutbox=\box58 +\tabu@hleads=\box59 +\tabu@vleads=\box60 +\tabu@cellskip=\skip59 +) +(/usr/local/share/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty +Package: fancyvrb 2021/01/20 v3.7 verbatim text (tvz,hv) + +(/usr/local/share/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks25 +) +\FV@CodeLineNo=\count271 +\FV@InFile=\read3 +\FV@TabBox=\box61 +\c@FancyVerbLine=\count272 +\FV@StepNumber=\count273 +\FV@OutFile=\write3 +) +(/usr/local/share/texmf-dist/tex/latex/tools/tabularx.sty +Package: tabularx 2020/01/15 v2.11c `tabularx' package (DPC) +\TX@col@width=\dimen155 +\TX@old@table=\dimen156 +\TX@old@col=\dimen157 +\TX@target=\dimen158 +\TX@delta=\dimen159 +\TX@cols=\count274 +\TX@ftn=\toks26 +) +(/usr/local/share/texmf-dist/tex/latex/tools/multicol.sty +Package: multicol 2019/12/09 v1.8y multicolumn formatting (FMi) +\c@tracingmulticols=\count275 +\mult@box=\box62 +\multicol@leftmargin=\dimen160 +\c@unbalance=\count276 +\c@collectmore=\count277 +\doublecol@number=\count278 +\multicoltolerance=\count279 +\multicolpretolerance=\count280 +\full@width=\dimen161 +\page@free=\dimen162 +\premulticols=\dimen163 +\postmulticols=\dimen164 +\multicolsep=\skip60 +\multicolbaselineskip=\skip61 +\partial@page=\box63 +\last@line=\box64 +\maxbalancingoverflow=\dimen165 +\mult@rightbox=\box65 +\mult@grightbox=\box66 +\mult@gfirstbox=\box67 +\mult@firstbox=\box68 +\@tempa=\box69 +\@tempa=\box70 +\@tempa=\box71 +\@tempa=\box72 +\@tempa=\box73 +\@tempa=\box74 +\@tempa=\box75 +\@tempa=\box76 +\@tempa=\box77 +\@tempa=\box78 +\@tempa=\box79 +\@tempa=\box80 +\@tempa=\box81 +\@tempa=\box82 +\@tempa=\box83 +\@tempa=\box84 +\@tempa=\box85 +\@tempa=\box86 +\@tempa=\box87 +\@tempa=\box88 +\@tempa=\box89 +\@tempa=\box90 +\@tempa=\box91 +\@tempa=\box92 +\@tempa=\box93 +\@tempa=\box94 +\@tempa=\box95 +\@tempa=\box96 +\@tempa=\box97 +\@tempa=\box98 +\@tempa=\box99 +\@tempa=\box100 +\@tempa=\box101 +\@tempa=\box102 +\@tempa=\box103 +\@tempa=\box104 +\@tempa=\box105 +\c@minrows=\count281 +\c@columnbadness=\count282 +\c@finalcolumnbadness=\count283 +\last@try=\dimen166 +\multicolovershoot=\dimen167 +\multicolundershoot=\dimen168 +\mult@nat@firstbox=\box106 +\colbreak@box=\box107 +\mc@col@check@num=\count284 +) +(/usr/local/share/texmf-dist/tex/latex/multirow/multirow.sty +Package: multirow 2021/03/15 v2.8 Span multiple rows of a table +\multirow@colwidth=\skip62 +\multirow@cntb=\count285 +\multirow@dima=\skip63 +\bigstrutjot=\dimen169 +) +(/usr/local/share/texmf-dist/tex/latex/hanging/hanging.sty +Package: hanging 2009/09/02 v1.2b hanging paragraphs and punctuation +\h@ngcommawd=\skip64 +\h@ngfstopwd=\skip65 +\h@ngquotewd=\skip66 +\h@ngdquotewd=\skip67 +\h@ngquerywd=\skip68 +\h@ngexclwd=\skip69 +\h@ngcolonwd=\skip70 +\h@ngscolonwd=\skip71 +) +(/usr/local/share/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/local/share/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +(/usr/local/share/texmf-dist/tex/latex/adjustbox/adjustbox.sty +Package: adjustbox 2020/08/19 v1.3 Adjusting TeX boxes (trim, clip, ...) + +(/usr/local/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/local/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/local/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks27 +\XKV@tempa@toks=\toks28 +) +\XKV@depth=\count286 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/local/share/texmf-dist/tex/latex/adjustbox/adjcalc.sty +Package: adjcalc 2012/05/16 v1.1 Provides advanced setlength with multiple back +-ends (calc, etex, pgfmath) +) +(/usr/local/share/texmf-dist/tex/latex/adjustbox/trimclip.sty +Package: trimclip 2020/08/19 v1.2 Trim and clip general TeX material + +(/usr/local/share/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/local/share/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/local/share/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/local/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 105. +) +\Gin@req@height=\dimen170 +\Gin@req@width=\dimen171 +) +(/usr/local/share/texmf-dist/tex/latex/collectbox/collectbox.sty +Package: collectbox 2012/05/17 v0.4b Collect macro arguments as boxes +\collectedbox=\box108 +) +\tc@llx=\dimen172 +\tc@lly=\dimen173 +\tc@urx=\dimen174 +\tc@ury=\dimen175 +Package trimclip Info: Using driver 'tc-pdftex.def'. + +(/usr/local/share/texmf-dist/tex/latex/adjustbox/tc-pdftex.def +File: tc-pdftex.def 2019/01/04 v2.2 Clipping driver for pdftex +)) +\adjbox@Width=\dimen176 +\adjbox@Height=\dimen177 +\adjbox@Depth=\dimen178 +\adjbox@Totalheight=\dimen179 +\adjbox@pwidth=\dimen180 +\adjbox@pheight=\dimen181 +\adjbox@pdepth=\dimen182 +\adjbox@ptotalheight=\dimen183 + +(/usr/local/share/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty +Package: ifoddpage 2016/04/23 v1.1 Conditionals for odd/even page detection +\c@checkoddpage=\count287 +)) +(/usr/local/share/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks29 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/share/texmf-dist/tex/latex/stackengine/stackengine.sty +Package: stackengine 2017/02/13 v4.01\ Stacking text and objects in convenient +ways + +(/usr/local/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count288 +) +(/usr/local/share/texmf-dist/tex/generic/listofitems/listofitems.sty +(/usr/local/share/texmf-dist/tex/generic/listofitems/listofitems.tex +\loi_cnt_foreach_nest=\count289 +\loi_nestcnt=\count290 +) +Package: listofitems 2019/08/21 v1.63 Grab items in lists using user-specified +sep char (CT) +) +\c@@stackindex=\count291 +\@boxshift=\skip72 +\stack@tmplength=\skip73 +\temp@stkl=\skip74 +\@stackedboxwidth=\skip75 +\@addedbox=\box109 +\@anchorbox=\box110 +\stackedbox=\box111 +\@centerbox=\box112 +\c@ROWcellindex@=\count292 +) +(/usr/local/share/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2019/06/20 v3.9 Customized lists +\labelindent=\skip76 +\enit@outerparindent=\dimen184 +\enit@toks=\toks30 +\enit@inbox=\box113 +\enit@count@id=\count293 +\enitdp@description=\count294 +) +(/usr/local/share/texmf-dist/tex/generic/alphalph/alphalph.sty +Package: alphalph 2019/12/09 v2.6 Convert numbers to letters (HO) + +(/usr/local/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +(/usr/local/share/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +)) +(/usr/local/share/texmf-dist/tex/generic/ulem/ulem.sty +\UL@box=\box114 +\UL@hyphenbox=\box115 +\UL@skip=\skip77 +\UL@hook=\toks31 +\UL@height=\dimen185 +\UL@pe=\count295 +\UL@pixel=\dimen186 +\ULC@box=\box116 +Package: ulem 2019/11/18 +\ULdepth=\dimen187 +) +\xrefbox=\box117 +\xreflength=\skip78 +\CodeWidthChar=\skip79 +\CodeHeightChar=\skip80 +\DoxyCodeWidth=\skip81 +\c@DoxyEnumeratei=\count296 +\c@DoxyEnumerateii=\count297 +\c@DoxyEnumerateiii=\count298 +\c@DoxyEnumerateiv=\count299 +\c@DoxyEnumeratev=\count300 +\c@DoxyEnumeratevi=\count301 +\c@DoxyEnumeratevii=\count302 +\c@DoxyEnumerateviii=\count303 +\c@DoxyEnumerateix=\count304 +\c@DoxyEnumeratex=\count305 +\c@DoxyEnumeratexi=\count306 +\c@DoxyEnumeratexii=\count307 +\enitdp@DoxyEnumerate=\count308 +\enitdp@DoxyItemize=\count309 +) +(/usr/local/share/texmf-dist/tex/latex-dev/base/inputenc.sty +Package: inputenc 2021/02/14 v1.3d Input encoding file +\inpenc@prehook=\toks32 +\inpenc@posthook=\toks33 +) +(/usr/local/share/texmf-dist/tex/latex-dev/base/makeidx.sty +Package: makeidx 2014/09/29 v1.0m Standard LaTeX package +) +(/usr/local/share/texmf-dist/tex/latex-dev/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +(/usr/local/share/texmf-dist/tex/latex/wasysym/wasysym.sty +Package: wasysym 2020/01/19 v2.4 Wasy-2 symbol support package +\symwasy=\mathgroup6 +LaTeX Font Info: Overwriting symbol font `wasy' in version `bold' +(Font) U/wasy/m/n --> U/wasy/b/n on input line 93. +) +(/usr/local/share/texmf-dist/tex/generic/iftex/ifxetex.sty +Package: ifxetex 2019/10/25 v0.7 ifxetex legacy package. Use iftex instead. +) +(/usr/local/share/texmf-dist/tex/latex-dev/base/fontenc.sty +Package: fontenc 2021/02/19 v2.0u Standard LaTeX package +) +(/usr/local/share/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2020/03/25 PSNFSS-v9.3 (WaS) +) +(/usr/local/share/texmf-dist/tex/latex/psnfss/courier.sty +Package: courier 2020/03/25 PSNFSS-v9.3 (WaS) +) +(/usr/local/share/texmf-dist/tex/latex/sectsty/sectsty.sty +Package: sectsty 2002/02/25 v2.0.2 Commands to change all sectional heading sty +les + + +LaTeX Warning: Command \underbar has changed. + Check if current package is valid. + + +LaTeX Warning: Command \underline has changed. + Check if current package is valid. + +) (/usr/local/share/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/local/share/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count310 +\Gm@cntv=\count311 +\c@Gm@tempcnt=\count312 +\Gm@bindingoffset=\dimen188 +\Gm@wd@mp=\dimen189 +\Gm@odd@mp=\dimen190 +\Gm@even@mp=\dimen191 +\Gm@layoutwidth=\dimen192 +\Gm@layoutheight=\dimen193 +\Gm@layouthoffset=\dimen194 +\Gm@layoutvoffset=\dimen195 +\Gm@dimlist=\toks34 +) +(/usr/local/share/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +Package: fancyhdr 2021/01/28 v4.0.1 Extensive control of page headers and foote +rs +\f@nch@headwidth=\skip82 +\f@nch@O@elh=\skip83 +\f@nch@O@erh=\skip84 +\f@nch@O@olh=\skip85 +\f@nch@O@orh=\skip86 +\f@nch@O@elf=\skip87 +\f@nch@O@erf=\skip88 +\f@nch@O@olf=\skip89 +\f@nch@O@orf=\skip90 +) +(/usr/local/share/texmf-dist/tex/latex/natbib/natbib.sty +Package: natbib 2010/09/13 8.31b (PWD, AO) +\bibhang=\skip91 +\bibsep=\skip92 +LaTeX Info: Redefining \cite on input line 694. +\c@NAT@ctr=\count313 +) +(/usr/local/share/texmf-dist/tex/latex/tocloft/tocloft.sty +Package: tocloft 2017/08/31 v2.3i parameterised ToC, etc., typesetting +Package tocloft Info: The document has chapter divisions on input line 51. +\cftparskip=\skip93 +\cftbeforetoctitleskip=\skip94 +\cftaftertoctitleskip=\skip95 +\cftbeforepartskip=\skip96 +\cftpartnumwidth=\skip97 +\cftpartindent=\skip98 +\cftbeforechapskip=\skip99 +\cftchapindent=\skip100 +\cftchapnumwidth=\skip101 +\cftbeforesecskip=\skip102 +\cftsecindent=\skip103 +\cftsecnumwidth=\skip104 +\cftbeforesubsecskip=\skip105 +\cftsubsecindent=\skip106 +\cftsubsecnumwidth=\skip107 +\cftbeforesubsubsecskip=\skip108 +\cftsubsubsecindent=\skip109 +\cftsubsubsecnumwidth=\skip110 +\cftbeforeparaskip=\skip111 +\cftparaindent=\skip112 +\cftparanumwidth=\skip113 +\cftbeforesubparaskip=\skip114 +\cftsubparaindent=\skip115 +\cftsubparanumwidth=\skip116 +\cftbeforeloftitleskip=\skip117 +\cftafterloftitleskip=\skip118 +\cftbeforefigskip=\skip119 +\cftfigindent=\skip120 +\cftfignumwidth=\skip121 +\c@lofdepth=\count314 +\c@lotdepth=\count315 +\cftbeforelottitleskip=\skip122 +\cftafterlottitleskip=\skip123 +\cftbeforetabskip=\skip124 +\cfttabindent=\skip125 +\cfttabnumwidth=\skip126 +) +\@indexfile=\write4 +\openout4 = `refman.idx'. + + +Writing index file refman.idx +(/usr/local/share/texmf-dist/tex/latex/newunicodechar/newunicodechar.sty +Package: newunicodechar 2018/04/08 v1.2 Defining Unicode characters +) + +Package newunicodechar Warning: Redefining Unicode character on input line 116. + + + +Package newunicodechar Warning: Redefining Unicode character on input line 117. + + +(/usr/local/share/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2021-02-27 v7.00k Hypertext links for LaTeX + +(/usr/local/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/local/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/local/share/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/local/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/local/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/local/share/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/local/share/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/local/share/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/local/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) +) +\@linkdim=\dimen196 +\Hy@linkcounter=\count316 +\Hy@pagecounter=\count317 + +(/usr/local/share/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2021-02-27 v7.00k Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/local/share/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def +File: hyperref-langpatches.def 2021-02-27 v7.00k Hyperref: patches for babel la +nguages +) +(/usr/local/share/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count318 + +(/usr/local/share/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2021-02-27 v7.00k Hyperref: PDF Unicode definition (HO) +Now handling font encoding PU ... +... no UTF-8 mapping file for font encoding PU +) +Package hyperref Info: Hyper figures OFF on input line 4192. +Package hyperref Info: Link nesting OFF on input line 4197. +Package hyperref Info: Hyper index ON on input line 4200. +Package hyperref Info: Plain pages OFF on input line 4207. +Package hyperref Info: Backreferencing ON on input line 4210. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4445. + +(/usr/local/share/texmf-dist/tex/latex/hyperref/backref.sty +Package: backref 2021/02/04 v1.41 Bibliographical back referencing + +(/usr/local/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/local/share/texmf-dist/tex/latex-dev/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery packag +e +with kernel methods +) +(/usr/local/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) + +(/usr/local/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +86. +)) +\c@Hy@tempcnt=\count319 + +(/usr/local/share/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip16 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4804. +\XeTeXLinkMargin=\dimen197 + +(/usr/local/share/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) +) +\Fld@menulength=\count320 +\Field@Width=\dimen198 +\Fld@charsize=\dimen199 +Package hyperref Info: Hyper figures OFF on input line 6075. +Package hyperref Info: Link nesting OFF on input line 6080. +Package hyperref Info: Hyper index ON on input line 6083. +Package hyperref Info: backreferencing ON on input line 6088. +Package hyperref Info: Link coloring OFF on input line 6095. +Package hyperref Info: Link coloring with OCG OFF on input line 6100. +Package hyperref Info: PDF/A mode OFF on input line 6105. +LaTeX Info: Redefining \ref on input line 6145. +LaTeX Info: Redefining \pageref on input line 6149. + +(/usr/local/share/texmf-dist/tex/latex-dev/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count321 +\c@Item=\count322 +\c@Hfootnote=\count323 +) +Package hyperref Info: Driver: hpdftex. + +(/usr/local/share/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2021-02-27 v7.00k Hyperref driver for pdfTeX +\Fld@listcount=\count324 +\c@bookmark@seq@number=\count325 +\Hy@SectionHShift=\skip127 +) +Package hyperref Info: Option `colorlinks' set `true' on input line 136. +Package hyperref Info: Option `unicode' set `true' on input line 136. + +(/usr/local/share/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/local/share/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen256 +\captionmargin@=\dimen257 +\captionwidth=\dimen258 +\caption@tempdima=\dimen259 +\caption@indent=\dimen260 +\caption@parindent=\dimen261 +\caption@hangindent=\dimen262 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count326 +\c@continuedfloat=\count327 +Package caption Info: float package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/local/share/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +)) +(/usr/local/share/texmf-dist/tex/latex/etoc/etoc.sty +Package: etoc 2020/05/15 v1.09c Completely customisable TOCs (JFB) +\Etoc@toctoks=\toks35 +\c@etoc@tocid=\count328 +\c@etoc@tocdepth=\count329 +\etoc@framed@titlebox=\box118 +\etoc@framed@contentsbox=\box119 +) +LaTeX Font Info: Trying to load font information for T1+phv on input line 15 +2. + +(/usr/local/share/texmf-dist/tex/latex/psnfss/t1phv.fd +File: t1phv.fd 2020/03/25 scalable font definitions for T1/phv. +) +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 8.99994pt on input line 152. + +(/usr/local/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2021-03-18 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count330 +\l__pdf_internal_box=\box120 +) +No file refman.aux. +\openout1 = `refman.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 152. +LaTeX Font Info: ... okay on input line 152. +(/usr/local/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count331 +\scratchdimen=\dimen263 +\scratchbox=\box121 +\nofMPsegments=\count332 +\nofMParguments=\count333 +\everyMPshowfont=\toks36 +\MPscratchCnt=\count334 +\MPscratchDim=\dimen264 +\MPnumerator=\count335 +\makeMPintoPDFobject=\count336 +\everyMPtoPDFconversion=\toks37 +) (/usr/local/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/local/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: twoside +* h-part:(L,W,R)=(71.13188pt, 455.24411pt, 71.13188pt) +* v-part:(T,H,B)=(71.13188pt, 702.78308pt, 71.13188pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=455.24411pt +* \textheight=702.78308pt +* \oddsidemargin=-1.1381pt +* \evensidemargin=-1.1381pt +* \topmargin=-31.2056pt +* \headheight=12.0pt +* \headsep=18.06749pt +* \topskip=10.0pt +* \footskip=25.29494pt +* \marginparwidth=125.0pt +* \marginparsep=7.0pt +* \columnsep=10.0pt +* \skip\footins=9.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidetrue +* \@mparswitchtrue +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +Package hyperref Info: Link coloring ON on input line 152. +(/usr/local/share/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2021-04-02 v2.47 Cross-referencing by name of section + +(/usr/local/share/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/local/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count337 +) +LaTeX Info: Redefining \ref on input line 152. +LaTeX Info: Redefining \pageref on input line 152. +LaTeX Info: Redefining \nameref on input line 152. +\@outlinefile=\write5 +\openout5 = `refman.out'. + +Package backref Info: ** backref set up for natbib ** on input line 152. +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: End \AtBeginDocument code. + +No file refman.toc. +Package hyperref Info: Option `pageanchor' set `false' on input line 160. +Package hyperref Info: Option `bookmarksnumbered' set `true' on input line 160. + +Package hyperref Info: Option `unicode' set `true' on input line 160. +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 12.9599pt on input line 165. +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 6.29996pt on input line 165. +LaTeX Font Info: Trying to load font information for U+msa on input line 165 +. +(/usr/local/share/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 165 +. + +(/usr/local/share/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Trying to load font information for U+wasy on input line 16 +5. + +(/usr/local/share/texmf-dist/tex/latex/wasysym/uwasy.fd +File: uwasy.fd 2020/01/19 v2.4 Wasy-2 symbol font definitions +) +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 10.79993pt on input line 167. + [1 + + +{/usr/local/share/texmf-dist/fonts/map/pdftex/updmap/pdftex.map}] [2 + +] +\tf@toc=\write6 +\openout6 = `refman.toc'. + +Package hyperref Info: Option `pageanchor' set `true' on input line 176. + +Chapter 1. +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 18.66588pt on input line 178. +LaTeX Font Info: Font shape `T1/phv/b/n' will be +(Font) scaled to size 18.66588pt on input line 178. +LaTeX Font Info: Font shape `T1/phv/bc/n' will be +(Font) scaled to size 18.66588pt on input line 178. +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 22.39185pt on input line 178. +LaTeX Font Info: Font shape `T1/phv/b/n' will be +(Font) scaled to size 22.39185pt on input line 178. +LaTeX Font Info: Font shape `T1/phv/bc/n' will be +(Font) scaled to size 22.39185pt on input line 178. +(./hierarchy.tex +LaTeX Font Info: Font shape `T1/phv/b/n' will be +(Font) scaled to size 12.9599pt on input line 1. +LaTeX Font Info: Font shape `T1/phv/b/n' will be +(Font) scaled to size 8.99994pt on input line 3. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1C +apacitor' on page 1 undefined on input line 3. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot' + on page 1 undefined on input line 5. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1I +nductor' on page 1 undefined on input line 7. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1I +Source' on page 1 undefined on input line 8. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenS +PICECircuitError' on page 1 undefined on input line 10. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenS +PICECommandError' on page 1 undefined on input line 11. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenS +PICEServer' on page 1 undefined on input line 13. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenS +PICEShared' on page 1 undefined on input line 14. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vecto +r' on page 1 undefined on input line 15. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1V +Source' on page 1 undefined on input line 16. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1C +omponent' on page 1 undefined on input line 18. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1R +esistor' on page 1 undefined on input line 20. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnSt +rStrategy' on page 1 undefined on input line 22. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnSt +rOpPtStrategy' on page 1 undefined on input line 24. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnSt +rTransientStrategy' on page 1 undefined on input line 25. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Text +Fmt' on page 1 undefined on input line 27. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Beha +vISourceTextFmt' on page 1 undefined on input line 29. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Beha +vVSourceTextFmt' on page 1 undefined on input line 30. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCS +SourceTextFmt' on page 1 undefined on input line 31. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVS +SourceTextFmt' on page 1 undefined on input line 32. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Capa +citorTextFmt' on page 1 undefined on input line 33. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtI +SourceTextFmt' on page 1 undefined on input line 34. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtV +SourceTextFmt' on page 1 undefined on input line 35. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISou +rceTextFmt' on page 1 undefined on input line 36. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Indu +ctorTextFmt' on page 1 undefined on input line 37. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Resi +storTextFmt' on page 1 undefined on input line 38. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCS +SourceTextFmt' on page 1 undefined on input line 39. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVS +SourceTextFmt' on page 1 undefined on input line 40. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSou +rceTextFmt' on page 1 undefined on input line 41. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1Solver +Strategy' on page 1 undefined on input line 43. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSo +lverStrategy' on page 1 undefined on input line 45. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1Transi +entSolverStrategy' on page 1 undefined on input line 46. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1O +penSPICECircuitSimulator' on page 1 undefined on input line 50. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawF +ile' on page 1 undefined on input line 53. + +LaTeX Font Info: Font shape `T1/phv/b/n' will be +(Font) scaled to size 6.29996pt on input line 54. +[1 + + +] + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Vari +able' on page 2 undefined on input line 56. + +) [2] +Chapter 2. +(./annotated.tex + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Beha +vISourceTextFmt' on page 3 undefined on input line 3. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Beha +vVSourceTextFmt' on page 3 undefined on input line 4. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1C +apacitor' on page 3 undefined on input line 5. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Capa +citorTextFmt' on page 3 undefined on input line 6. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCS +SourceTextFmt' on page 3 undefined on input line 7. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVS +SourceTextFmt' on page 3 undefined on input line 8. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1C +omponent' on page 3 undefined on input line 9. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnSt +rOpPtStrategy' on page 3 undefined on input line 10. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnSt +rStrategy' on page 3 undefined on input line 11. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnSt +rTransientStrategy' on page 3 undefined on input line 12. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtI +SourceTextFmt' on page 3 undefined on input line 13. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtV +SourceTextFmt' on page 3 undefined on input line 14. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1I +nductor' on page 3 undefined on input line 15. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Indu +ctorTextFmt' on page 3 undefined on input line 16. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1I +Source' on page 3 undefined on input line 17. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISou +rceTextFmt' on page 3 undefined on input line 18. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenS +PICECircuitError' on page 3 undefined on input line 19. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1O +penSPICECircuitSimulator' on page 3 undefined on input line 20. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenS +PICECommandError' on page 3 undefined on input line 21. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenS +PICEServer' on page 3 undefined on input line 22. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenS +PICEShared' on page 3 undefined on input line 23. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSo +lverStrategy' on page 3 undefined on input line 24. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot' + on page 3 undefined on input line 25. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawF +ile' on page 3 undefined on input line 26. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1R +esistor' on page 3 undefined on input line 27. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Resi +storTextFmt' on page 3 undefined on input line 28. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1Solver +Strategy' on page 3 undefined on input line 29. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Text +Fmt' on page 3 undefined on input line 30. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1Transi +entSolverStrategy' on page 3 undefined on input line 31. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Vari +able' on page 3 undefined on input line 32. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCS +SourceTextFmt' on page 3 undefined on input line 33. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVS +SourceTextFmt' on page 3 undefined on input line 34. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vecto +r' on page 3 undefined on input line 35. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1V +Source' on page 3 undefined on input line 36. + + +LaTeX Warning: Reference `classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSou +rceTextFmt' on page 3 undefined on input line 37. + +) [3 + +] [4 + +] +Chapter 3. +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.tex <./ +classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt.pdf +Graphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Behav +ISourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 239.71793pt x 85.35826pt. +LaTeX Font Info: Font shape `T1/phv/b/n' will be +(Font) scaled to size 10.79993pt on input line 9. +LaTeX Font Info: Trying to load font information for TS1+phv on input line 1 +2. + +(/usr/local/share/texmf-dist/tex/latex/psnfss/ts1phv.fd +File: ts1phv.fd 2020/03/25 scalable font definitions for TS1/phv. +) +LaTeX Font Info: Font shape `TS1/phv/m/n' will be +(Font) scaled to size 8.99994pt on input line 12. +LaTeX Font Info: Font shape `T1/phv/m/n' will be +(Font) scaled to size 7.19995pt on input line 26. +LaTeX Font Info: Trying to load font information for T1+pcr on input line 26 +. + +(/usr/local/share/texmf-dist/tex/latex/psnfss/t1pcr.fd +File: t1pcr.fd 2001/06/04 font definitions for T1/pcr. +) +LaTeX Font Info: Font shape `T1/pcr/m/it' in size <8> not available +(Font) Font shape `T1/pcr/m/sl' tried instead on input line 35. + [5]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.tex <./ +classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt.pdf +Graphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Behav +VSourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 243.98343pt x 85.35826pt. + +[6]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor.tex +[7]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.tex < +./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt.pdf Gra +phic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Capac +itorTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 221.93608pt x 85.35826pt. + +[8]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.tex +<./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSS +ourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 236.86916pt x 85.35826pt. + +[9]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.tex +<./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSS +ourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 236.86916pt x 85.35826pt. + +[10]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.tex <./c +lassPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component.pdf Graphic + file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Co +mponent.pdf used on input line 6. +(pdftex.def) Requested size: 221.93608pt x 85.35826pt. + [11]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.tex <./cl +assPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStr +OpPtStrategy.pdf used on input line 6. +(pdftex.def) Requested size: 233.31584pt x 85.35826pt. + [12] +LaTeX Font Info: Font shape `T1/pcr/m/it' in size <7> not available +(Font) Font shape `T1/pcr/m/sl' tried instead on input line 39. +) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.tex <./classP +ySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.pdf Graphi +c file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStr +Strategy.pdf used on input line 6. +(pdftex.def) Requested size: 398.33778pt x 67.89873pt. + [13] +Overfull \hbox (98.94888pt too wide) in paragraph at lines 42--43 +[]\T1/phv/m/n/10 Reimplemented in [], and []. + [] + +[14]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.tex +<./classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy.p +df Graphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStr +TransientStrategy.pdf used on input line 6. +(pdftex.def) Requested size: 250.39316pt x 85.35826pt. +[15]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.tex + <./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtIS +ourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 226.20158pt x 85.35826pt. + +[16] [17]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.tex <./cl +assPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVS +ourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 230.45943pt x 85.35826pt. +) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor.tex [18] +[19]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.tex < +./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt.pdf Grap +hic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Induc +torTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 215.53401pt x 85.35826pt. + +[20]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource.tex +[21]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.tex <. +/classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf Graph +ic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISour +ceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 214.10196pt x 85.35826pt. + [22]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.tex <. +/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError.pdf + Graphic file (type pdf) + + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSP +ICECircuitError.pdf used on input line 6. +(pdftex.def) Requested size: 253.95412pt x 56.9055pt. +) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulato +r.tex <./classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSi +mulator.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimul +ator.pdf Graphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1Op +enSPICECircuitSimulator.pdf used on input line 6. +(pdftex.def) Requested size: 280.95618pt x 56.9055pt. + [23]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.tex <. +/classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError.pdf + Graphic file (type pdf) + + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSP +ICECommandError.pdf used on input line 6. +(pdftex.def) Requested size: 266.74295pt x 56.9055pt. +) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer.tex [24]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared.tex [25] +[26] +LaTeX Font Info: Trying to load font information for TS1+pcr on input line 1 +79. + (/usr/local/share/texmf-dist/tex/latex/psnfss/ts1pcr.fd +File: ts1pcr.fd 2001/06/04 font definitions for TS1/pcr. +) +LaTeX Font Info: Font shape `TS1/pcr/m/it' in size <8> not available +(Font) Font shape `TS1/pcr/m/sl' tried instead on input line 179. + [27] [28] +[29] [30] +Overfull \hbox (19.95619pt too wide) in paragraph at lines 295--295 +[]\T1/pcr/m/n/8 Print resource usage statistics. If any resources are given, ju +st print the usage of that resource. + [] + +[31] [32] [33] [34]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.tex <./cla +ssPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy.pdf Gra +phic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSol +verStrategy.pdf used on input line 6. +(pdftex.def) Requested size: 230.45943pt x 85.35826pt. + [35]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.tex <./classPySpice_1_1 +Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf Graphic file (ty +pe pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.p +df used on input line 6. +(pdftex.def) Requested size: 173.56058pt x 56.9055pt. + [36]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.tex <./classPySpice +_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf Graphic file + (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFi +le.pdf used on input line 6. +(pdftex.def) Requested size: 193.479pt x 56.9055pt. + [37]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.tex <./classPyS +pice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor.pdf Graphic +file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Re +sistor.pdf used on input line 6. +(pdftex.def) Requested size: 221.93608pt x 85.35826pt. + [38] [39]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.tex <./clas +sPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt.pdf Grap +hic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1Resis +torTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 214.81415pt x 85.35826pt. + [40]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.tex <./classPy +Spice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy.pdf Graphic + file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverS +trategy.pdf used on input line 6. +(pdftex.def) Requested size: 398.33012pt x 68.67891pt. + +Overfull \hbox (86.65573pt too wide) in paragraph at lines 36--37 +[]\T1/phv/m/n/10 Reimplemented in [], and []. + [] + +[41]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.tex <./classP +ySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf Graphic file + (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextF +mt.pdf used on input line 6. +(pdftex.def) Requested size: 390.3888pt x 341.43306pt. + [42] +Overfull \hbox (36.0137pt too wide) in paragraph at lines 34--35 +[]\T1/phv/m/n/10 Reimplemented in [], [], + [] + + +Overfull \hbox (162.67892pt too wide) in paragraph at lines 34--35 +[]\T1/phv/m/n/10 , [], [], + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 34--35 +[]\T1/phv/m/n/10 , [], + [] + + +Overfull \hbox (23.78296pt too wide) in paragraph at lines 34--35 +[]\T1/phv/m/n/10 , and []. + [] + +) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.tex + <./classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy.pd +f Graphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1Transie +ntSolverStrategy.pdf used on input line 6. +(pdftex.def) Requested size: 247.54439pt x 85.35826pt. +[43]) (./classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.tex <./class +PySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable.pdf Graphic fil +e (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Varia +ble.pdf used on input line 6. +(pdftex.def) Requested size: 195.61559pt x 56.9055pt. + [44]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.tex <./cl +assPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSS +ourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 236.86916pt x 85.35826pt. + [45]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.tex <./cl +assPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf Gr +aphic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSS +ourceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 236.86916pt x 85.35826pt. + [46]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector.tex [47]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource.tex [48]) +(./classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.tex <./class +PySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf> + +File: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf Graph +ic file (type pdf) + +Package pdftex.def Info: classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSour +ceTextFmt.pdf used on input line 6. +(pdftex.def) Requested size: 218.37512pt x 85.35826pt. + [49]) [50] +No file refman.ind. +(./refman.aux) + +LaTeX Warning: There were undefined references. + + +LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. + + +Package rerunfilecheck Warning: File `refman.out' has changed. +(rerunfilecheck) Rerun to get outlines right +(rerunfilecheck) or use package `bookmark'. + +Package rerunfilecheck Info: Checksums for `refman.out': +(rerunfilecheck) Before: +(rerunfilecheck) After: 2D62F6FF92E43DBD8648DC92ABDC9746;44600. + ) +Here is how much of TeX's memory you used: + 17682 strings out of 478911 + 308106 string characters out of 5860792 + 614927 words of memory out of 5000000 + 34355 multiletter control sequences out of 15000+600000 + 448136 words of font info for 86 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 112i,15n,117p,2551b,526s stack positions out of 5000i,2500n,10000p,300000b,80000s + +!pdfTeX error: pdflatex (file 8r.enc): cannot open encoding file for reading + ==> Fatal error occurred, no output PDF file produced! diff --git a/PySpice/Spice/OpenSPICE/latex/refman.out b/PySpice/Spice/OpenSPICE/latex/refman.out new file mode 100644 index 00000000..08ed28ba --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/refman.out @@ -0,0 +1,182 @@ +\BOOKMARK [0][-]{chapter.1}{\376\377\0001\000\040\000H\000i\000e\000r\000a\000r\000c\000h\000i\000c\000a\000l\000\040\000I\000n\000d\000e\000x}{}% 1 +\BOOKMARK [1][-]{section.1.1}{\376\377\0001\000.\0001\000\040\000C\000l\000a\000s\000s\000\040\000H\000i\000e\000r\000a\000r\000c\000h\000y}{chapter.1}% 2 +\BOOKMARK [0][-]{chapter.2}{\376\377\0002\000\040\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x}{}% 3 +\BOOKMARK [1][-]{section.2.1}{\376\377\0002\000.\0001\000\040\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t}{chapter.2}% 4 +\BOOKMARK [0][-]{chapter.3}{\376\377\0003\000\040\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 5 +\BOOKMARK [1][-]{section.3.1}{\376\377\0003\000.\0001\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000B\000e\000h\000a\000v\000I\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 6 +\BOOKMARK [2][-]{subsection.3.1.1}{\376\377\0003\000.\0001\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.1}% 7 +\BOOKMARK [2][-]{subsection.3.1.2}{\376\377\0003\000.\0001\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.1}% 8 +\BOOKMARK [3][-]{subsubsection.3.1.2.1}{\376\377\0003\000.\0001\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.1.2}% 9 +\BOOKMARK [1][-]{section.3.2}{\376\377\0003\000.\0002\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000B\000e\000h\000a\000v\000V\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 10 +\BOOKMARK [2][-]{subsection.3.2.1}{\376\377\0003\000.\0002\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.2}% 11 +\BOOKMARK [2][-]{subsection.3.2.2}{\376\377\0003\000.\0002\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.2}% 12 +\BOOKMARK [3][-]{subsubsection.3.2.2.1}{\376\377\0003\000.\0002\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.2.2}% 13 +\BOOKMARK [1][-]{section.3.3}{\376\377\0003\000.\0003\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s\000.\000C\000a\000p\000a\000c\000i\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 14 +\BOOKMARK [2][-]{subsection.3.3.1}{\376\377\0003\000.\0003\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.3}% 15 +\BOOKMARK [2][-]{subsection.3.3.2}{\376\377\0003\000.\0003\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.3}% 16 +\BOOKMARK [3][-]{subsubsection.3.3.2.1}{\376\377\0003\000.\0003\000.\0002\000.\0001\000\040\000o\000p\000\137\000p\000t\000\137\000e\000q\000n\000\050\000\051}{subsection.3.3.2}% 17 +\BOOKMARK [3][-]{subsubsection.3.3.2.2}{\376\377\0003\000.\0003\000.\0002\000.\0002\000\040\000t\000r\000a\000n\000s\000\137\000e\000q\000n\000\050\000\051}{subsection.3.3.2}% 18 +\BOOKMARK [1][-]{section.3.4}{\376\377\0003\000.\0004\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000C\000a\000p\000a\000c\000i\000t\000o\000r\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 19 +\BOOKMARK [2][-]{subsection.3.4.1}{\376\377\0003\000.\0004\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.4}% 20 +\BOOKMARK [2][-]{subsection.3.4.2}{\376\377\0003\000.\0004\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.4}% 21 +\BOOKMARK [3][-]{subsubsection.3.4.2.1}{\376\377\0003\000.\0004\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.4.2}% 22 +\BOOKMARK [1][-]{section.3.5}{\376\377\0003\000.\0005\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000C\000C\000C\000S\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 23 +\BOOKMARK [2][-]{subsection.3.5.1}{\376\377\0003\000.\0005\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.5}% 24 +\BOOKMARK [2][-]{subsection.3.5.2}{\376\377\0003\000.\0005\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.5}% 25 +\BOOKMARK [3][-]{subsubsection.3.5.2.1}{\376\377\0003\000.\0005\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.5.2}% 26 +\BOOKMARK [1][-]{section.3.6}{\376\377\0003\000.\0006\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000C\000C\000V\000S\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 27 +\BOOKMARK [2][-]{subsection.3.6.1}{\376\377\0003\000.\0006\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.6}% 28 +\BOOKMARK [2][-]{subsection.3.6.2}{\376\377\0003\000.\0006\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.6}% 29 +\BOOKMARK [3][-]{subsubsection.3.6.2.1}{\376\377\0003\000.\0006\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.6.2}% 30 +\BOOKMARK [1][-]{section.3.7}{\376\377\0003\000.\0007\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s\000.\000C\000o\000m\000p\000o\000n\000e\000n\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 31 +\BOOKMARK [2][-]{subsection.3.7.1}{\376\377\0003\000.\0007\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.7}% 32 +\BOOKMARK [2][-]{subsection.3.7.2}{\376\377\0003\000.\0007\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.7}% 33 +\BOOKMARK [3][-]{subsubsection.3.7.2.1}{\376\377\0003\000.\0007\000.\0002\000.\0001\000\040\000o\000p\000\137\000p\000t\000\137\000e\000q\000n\000\050\000\051}{subsection.3.7.2}% 34 +\BOOKMARK [3][-]{subsubsection.3.7.2.2}{\376\377\0003\000.\0007\000.\0002\000.\0002\000\040\000t\000r\000a\000n\000s\000\137\000e\000q\000n\000\050\000\051}{subsection.3.7.2}% 35 +\BOOKMARK [1][-]{section.3.8}{\376\377\0003\000.\0008\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000e\000q\000n\000s\000t\000r\000.\000E\000q\000n\000S\000t\000r\000O\000p\000P\000t\000S\000t\000r\000a\000t\000e\000g\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 36 +\BOOKMARK [2][-]{subsection.3.8.1}{\376\377\0003\000.\0008\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.8}% 37 +\BOOKMARK [2][-]{subsection.3.8.2}{\376\377\0003\000.\0008\000.\0002\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000\046\000\040\000D\000e\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.8}% 38 +\BOOKMARK [3][-]{subsubsection.3.8.2.1}{\376\377\0003\000.\0008\000.\0002\000.\0001\000\040\000\137\000\137\000i\000n\000i\000t\000\137\000\137\000\050\000\051}{subsection.3.8.2}% 39 +\BOOKMARK [2][-]{subsection.3.8.3}{\376\377\0003\000.\0008\000.\0003\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.8}% 40 +\BOOKMARK [3][-]{subsubsection.3.8.3.1}{\376\377\0003\000.\0008\000.\0003\000.\0001\000\040\000g\000e\000n\000\137\000e\000q\000n\000\137\000f\000r\000o\000m\000\137\000b\000r\000a\000n\000c\000h\000\050\000\051}{subsection.3.8.3}% 41 +\BOOKMARK [1][-]{section.3.9}{\376\377\0003\000.\0009\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000e\000q\000n\000s\000t\000r\000.\000E\000q\000n\000S\000t\000r\000S\000t\000r\000a\000t\000e\000g\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 42 +\BOOKMARK [2][-]{subsection.3.9.1}{\376\377\0003\000.\0009\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.9}% 43 +\BOOKMARK [2][-]{subsection.3.9.2}{\376\377\0003\000.\0009\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.9}% 44 +\BOOKMARK [3][-]{subsubsection.3.9.2.1}{\376\377\0003\000.\0009\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000e\000q\000n\000\137\000f\000r\000o\000m\000\137\000b\000r\000a\000n\000c\000h\000\050\000\051}{subsection.3.9.2}% 45 +\BOOKMARK [3][-]{subsubsection.3.9.2.2}{\376\377\0003\000.\0009\000.\0002\000.\0002\000\040\000g\000e\000n\000\137\000e\000q\000n\000s\000\050\000\051}{subsection.3.9.2}% 46 +\BOOKMARK [3][-]{subsubsection.3.9.2.3}{\376\377\0003\000.\0009\000.\0002\000.\0003\000\040\000g\000e\000n\000\137\000k\000c\000l\000\137\000e\000q\000n\000s\000\050\000\051}{subsection.3.9.2}% 47 +\BOOKMARK [1][-]{section.3.10}{\376\377\0003\000.\0001\0000\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000e\000q\000n\000s\000t\000r\000.\000E\000q\000n\000S\000t\000r\000T\000r\000a\000n\000s\000i\000e\000n\000t\000S\000t\000r\000a\000t\000e\000g\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 48 +\BOOKMARK [2][-]{subsection.3.10.1}{\376\377\0003\000.\0001\0000\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.10}% 49 +\BOOKMARK [2][-]{subsection.3.10.2}{\376\377\0003\000.\0001\0000\000.\0002\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000\046\000\040\000D\000e\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.10}% 50 +\BOOKMARK [3][-]{subsubsection.3.10.2.1}{\376\377\0003\000.\0001\0000\000.\0002\000.\0001\000\040\000\137\000\137\000i\000n\000i\000t\000\137\000\137\000\050\000\051}{subsection.3.10.2}% 51 +\BOOKMARK [2][-]{subsection.3.10.3}{\376\377\0003\000.\0001\0000\000.\0003\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.10}% 52 +\BOOKMARK [3][-]{subsubsection.3.10.3.1}{\376\377\0003\000.\0001\0000\000.\0003\000.\0001\000\040\000g\000e\000n\000\137\000e\000q\000n\000\137\000f\000r\000o\000m\000\137\000b\000r\000a\000n\000c\000h\000\050\000\051}{subsection.3.10.3}% 53 +\BOOKMARK [1][-]{section.3.11}{\376\377\0003\000.\0001\0001\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000E\000x\000t\000I\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 54 +\BOOKMARK [2][-]{subsection.3.11.1}{\376\377\0003\000.\0001\0001\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.11}% 55 +\BOOKMARK [2][-]{subsection.3.11.2}{\376\377\0003\000.\0001\0001\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.11}% 56 +\BOOKMARK [3][-]{subsubsection.3.11.2.1}{\376\377\0003\000.\0001\0001\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.11.2}% 57 +\BOOKMARK [1][-]{section.3.12}{\376\377\0003\000.\0001\0002\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000E\000x\000t\000V\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 58 +\BOOKMARK [2][-]{subsection.3.12.1}{\376\377\0003\000.\0001\0002\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.12}% 59 +\BOOKMARK [2][-]{subsection.3.12.2}{\376\377\0003\000.\0001\0002\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.12}% 60 +\BOOKMARK [3][-]{subsubsection.3.12.2.1}{\376\377\0003\000.\0001\0002\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.12.2}% 61 +\BOOKMARK [1][-]{section.3.13}{\376\377\0003\000.\0001\0003\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s\000.\000I\000n\000d\000u\000c\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 62 +\BOOKMARK [2][-]{subsection.3.13.1}{\376\377\0003\000.\0001\0003\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.13}% 63 +\BOOKMARK [2][-]{subsection.3.13.2}{\376\377\0003\000.\0001\0003\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.13}% 64 +\BOOKMARK [3][-]{subsubsection.3.13.2.1}{\376\377\0003\000.\0001\0003\000.\0002\000.\0001\000\040\000o\000p\000\137\000p\000t\000\137\000e\000q\000n\000\050\000\051}{subsection.3.13.2}% 65 +\BOOKMARK [3][-]{subsubsection.3.13.2.2}{\376\377\0003\000.\0001\0003\000.\0002\000.\0002\000\040\000t\000r\000a\000n\000s\000\137\000e\000q\000n\000\050\000\051}{subsection.3.13.2}% 66 +\BOOKMARK [1][-]{section.3.14}{\376\377\0003\000.\0001\0004\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000I\000n\000d\000u\000c\000t\000o\000r\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 67 +\BOOKMARK [2][-]{subsection.3.14.1}{\376\377\0003\000.\0001\0004\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.14}% 68 +\BOOKMARK [2][-]{subsection.3.14.2}{\376\377\0003\000.\0001\0004\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.14}% 69 +\BOOKMARK [3][-]{subsubsection.3.14.2.1}{\376\377\0003\000.\0001\0004\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.14.2}% 70 +\BOOKMARK [1][-]{section.3.15}{\376\377\0003\000.\0001\0005\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s\000.\000I\000S\000o\000u\000r\000c\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 71 +\BOOKMARK [2][-]{subsection.3.15.1}{\376\377\0003\000.\0001\0005\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.15}% 72 +\BOOKMARK [2][-]{subsection.3.15.2}{\376\377\0003\000.\0001\0005\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.15}% 73 +\BOOKMARK [3][-]{subsubsection.3.15.2.1}{\376\377\0003\000.\0001\0005\000.\0002\000.\0001\000\040\000o\000p\000\137\000p\000t\000\137\000e\000q\000n\000\050\000\051}{subsection.3.15.2}% 74 +\BOOKMARK [3][-]{subsubsection.3.15.2.2}{\376\377\0003\000.\0001\0005\000.\0002\000.\0002\000\040\000t\000r\000a\000n\000s\000\137\000e\000q\000n\000\050\000\051}{subsection.3.15.2}% 75 +\BOOKMARK [1][-]{section.3.16}{\376\377\0003\000.\0001\0006\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000I\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 76 +\BOOKMARK [2][-]{subsection.3.16.1}{\376\377\0003\000.\0001\0006\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.16}% 77 +\BOOKMARK [2][-]{subsection.3.16.2}{\376\377\0003\000.\0001\0006\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.16}% 78 +\BOOKMARK [3][-]{subsubsection.3.16.2.1}{\376\377\0003\000.\0001\0006\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.16.2}% 79 +\BOOKMARK [1][-]{section.3.17}{\376\377\0003\000.\0001\0007\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000h\000a\000r\000e\000d\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000C\000i\000r\000c\000u\000i\000t\000E\000r\000r\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 80 +\BOOKMARK [1][-]{section.3.18}{\376\377\0003\000.\0001\0008\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000i\000m\000u\000l\000a\000t\000i\000o\000n\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000C\000i\000r\000c\000u\000i\000t\000S\000i\000m\000u\000l\000a\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 81 +\BOOKMARK [1][-]{section.3.19}{\376\377\0003\000.\0001\0009\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000h\000a\000r\000e\000d\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000C\000o\000m\000m\000a\000n\000d\000E\000r\000r\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 82 +\BOOKMARK [1][-]{section.3.20}{\376\377\0003\000.\0002\0000\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000e\000r\000v\000e\000r\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000S\000e\000r\000v\000e\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 83 +\BOOKMARK [2][-]{subsection.3.20.1}{\376\377\0003\000.\0002\0000\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.20}% 84 +\BOOKMARK [2][-]{subsection.3.20.2}{\376\377\0003\000.\0002\0000\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.20}% 85 +\BOOKMARK [3][-]{subsubsection.3.20.2.1}{\376\377\0003\000.\0002\0000\000.\0002\000.\0001\000\040\000\137\000\137\000c\000a\000l\000l\000\137\000\137\000\050\000\051}{subsection.3.20.2}% 86 +\BOOKMARK [1][-]{section.3.21}{\376\377\0003\000.\0002\0001\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000h\000a\000r\000e\000d\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000S\000h\000a\000r\000e\000d\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 87 +\BOOKMARK [2][-]{subsection.3.21.1}{\376\377\0003\000.\0002\0001\000.\0001\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000\046\000\040\000D\000e\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.21}% 88 +\BOOKMARK [3][-]{subsubsection.3.21.1.1}{\376\377\0003\000.\0002\0001\000.\0001\000.\0001\000\040\000\137\000\137\000i\000n\000i\000t\000\137\000\137\000\050\000\051}{subsection.3.21.1}% 89 +\BOOKMARK [2][-]{subsection.3.21.2}{\376\377\0003\000.\0002\0001\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.21}% 90 +\BOOKMARK [3][-]{subsubsection.3.21.2.1}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\000\040\000a\000l\000t\000e\000r\000\137\000d\000e\000v\000i\000c\000e\000\050\000\051}{subsection.3.21.2}% 91 +\BOOKMARK [3][-]{subsubsection.3.21.2.2}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\000\040\000a\000l\000t\000e\000r\000\137\000m\000o\000d\000e\000l\000\050\000\051}{subsection.3.21.2}% 92 +\BOOKMARK [3][-]{subsubsection.3.21.2.3}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\000\040\000d\000e\000l\000e\000t\000e\000\050\000\051}{subsection.3.21.2}% 93 +\BOOKMARK [3][-]{subsubsection.3.21.2.4}{\376\377\0003\000.\0002\0001\000.\0002\000.\0004\000\040\000d\000e\000s\000t\000r\000o\000y\000\050\000\051}{subsection.3.21.2}% 94 +\BOOKMARK [3][-]{subsubsection.3.21.2.5}{\376\377\0003\000.\0002\0001\000.\0002\000.\0005\000\040\000d\000e\000v\000i\000c\000e\000\137\000h\000e\000l\000p\000\050\000\051}{subsection.3.21.2}% 95 +\BOOKMARK [3][-]{subsubsection.3.21.2.6}{\376\377\0003\000.\0002\0001\000.\0002\000.\0006\000\040\000e\000x\000e\000c\000\137\000c\000o\000m\000m\000a\000n\000d\000\050\000\051}{subsection.3.21.2}% 96 +\BOOKMARK [3][-]{subsubsection.3.21.2.7}{\376\377\0003\000.\0002\0001\000.\0002\000.\0007\000\040\000g\000e\000t\000\137\000i\000s\000r\000c\000\137\000d\000a\000t\000a\000\050\000\051}{subsection.3.21.2}% 97 +\BOOKMARK [3][-]{subsubsection.3.21.2.8}{\376\377\0003\000.\0002\0001\000.\0002\000.\0008\000\040\000g\000e\000t\000\137\000v\000s\000r\000c\000\137\000d\000a\000t\000a\000\050\000\051}{subsection.3.21.2}% 98 +\BOOKMARK [3][-]{subsubsection.3.21.2.9}{\376\377\0003\000.\0002\0001\000.\0002\000.\0009\000\040\000h\000a\000l\000t\000\050\000\051}{subsection.3.21.2}% 99 +\BOOKMARK [3][-]{subsubsection.3.21.2.10}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0000\000\040\000h\000a\000s\000\137\000c\000i\000d\000e\000r\000\050\000\051}{subsection.3.21.2}% 100 +\BOOKMARK [3][-]{subsubsection.3.21.2.11}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0001\000\040\000h\000a\000s\000\137\000x\000s\000p\000i\000c\000e\000\050\000\051}{subsection.3.21.2}% 101 +\BOOKMARK [3][-]{subsubsection.3.21.2.12}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0002\000\040\000l\000a\000s\000t\000\137\000p\000l\000o\000t\000\050\000\051}{subsection.3.21.2}% 102 +\BOOKMARK [3][-]{subsubsection.3.21.2.13}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0003\000\040\000l\000o\000a\000d\000\137\000c\000i\000r\000c\000u\000i\000t\000\050\000\051}{subsection.3.21.2}% 103 +\BOOKMARK [3][-]{subsubsection.3.21.2.14}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0004\000\040\000n\000e\000w\000\137\000i\000n\000s\000t\000a\000n\000c\000e\000\050\000\051}{subsection.3.21.2}% 104 +\BOOKMARK [3][-]{subsubsection.3.21.2.15}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0005\000\040\000o\000p\000t\000i\000o\000n\000\050\000\051}{subsection.3.21.2}% 105 +\BOOKMARK [3][-]{subsubsection.3.21.2.16}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0006\000\040\000p\000l\000o\000t\000\050\000\051}{subsection.3.21.2}% 106 +\BOOKMARK [3][-]{subsubsection.3.21.2.17}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0007\000\040\000p\000l\000o\000t\000\137\000n\000a\000m\000e\000s\000\050\000\051}{subsection.3.21.2}% 107 +\BOOKMARK [3][-]{subsubsection.3.21.2.18}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0008\000\040\000r\000e\000m\000o\000v\000e\000\137\000c\000i\000r\000c\000u\000i\000t\000\050\000\051}{subsection.3.21.2}% 108 +\BOOKMARK [3][-]{subsubsection.3.21.2.19}{\376\377\0003\000.\0002\0001\000.\0002\000.\0001\0009\000\040\000r\000e\000s\000e\000t\000\050\000\051}{subsection.3.21.2}% 109 +\BOOKMARK [3][-]{subsubsection.3.21.2.20}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0000\000\040\000r\000e\000s\000s\000o\000u\000r\000c\000e\000\137\000u\000s\000a\000g\000e\000\050\000\051}{subsection.3.21.2}% 110 +\BOOKMARK [3][-]{subsubsection.3.21.2.21}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0001\000\040\000r\000e\000s\000u\000m\000e\000\050\000\051}{subsection.3.21.2}% 111 +\BOOKMARK [3][-]{subsubsection.3.21.2.22}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0002\000\040\000r\000u\000n\000\050\000\051}{subsection.3.21.2}% 112 +\BOOKMARK [3][-]{subsubsection.3.21.2.23}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0003\000\040\000s\000e\000n\000d\000\137\000c\000h\000a\000r\000\050\000\051}{subsection.3.21.2}% 113 +\BOOKMARK [3][-]{subsubsection.3.21.2.24}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0004\000\040\000s\000e\000n\000d\000\137\000d\000a\000t\000a\000\050\000\051}{subsection.3.21.2}% 114 +\BOOKMARK [3][-]{subsubsection.3.21.2.25}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0005\000\040\000s\000e\000n\000d\000\137\000i\000n\000i\000t\000\137\000d\000a\000t\000a\000\050\000\051}{subsection.3.21.2}% 115 +\BOOKMARK [3][-]{subsubsection.3.21.2.26}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0006\000\040\000s\000e\000n\000d\000\137\000s\000t\000a\000t\000\050\000\051}{subsection.3.21.2}% 116 +\BOOKMARK [3][-]{subsubsection.3.21.2.27}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0007\000\040\000s\000e\000t\000\050\000\051}{subsection.3.21.2}% 117 +\BOOKMARK [3][-]{subsubsection.3.21.2.28}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0008\000\040\000s\000e\000t\000\137\000c\000i\000r\000c\000u\000i\000t\000\050\000\051}{subsection.3.21.2}% 118 +\BOOKMARK [3][-]{subsubsection.3.21.2.29}{\376\377\0003\000.\0002\0001\000.\0002\000.\0002\0009\000\040\000s\000o\000u\000r\000c\000e\000\050\000\051}{subsection.3.21.2}% 119 +\BOOKMARK [3][-]{subsubsection.3.21.2.30}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\0000\000\040\000s\000t\000a\000t\000u\000s\000\050\000\051}{subsection.3.21.2}% 120 +\BOOKMARK [3][-]{subsubsection.3.21.2.31}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\0001\000\040\000s\000t\000e\000p\000\050\000\051}{subsection.3.21.2}% 121 +\BOOKMARK [3][-]{subsubsection.3.21.2.32}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\0002\000\040\000s\000t\000o\000p\000\050\000\051}{subsection.3.21.2}% 122 +\BOOKMARK [3][-]{subsubsection.3.21.2.33}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\0003\000\040\000t\000r\000a\000c\000e\000\050\000\051}{subsection.3.21.2}% 123 +\BOOKMARK [3][-]{subsubsection.3.21.2.34}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\0004\000\040\000u\000n\000s\000e\000t\000\050\000\051}{subsection.3.21.2}% 124 +\BOOKMARK [3][-]{subsubsection.3.21.2.35}{\376\377\0003\000.\0002\0001\000.\0002\000.\0003\0005\000\040\000w\000h\000e\000r\000e\000\050\000\051}{subsection.3.21.2}% 125 +\BOOKMARK [1][-]{section.3.22}{\376\377\0003\000.\0002\0002\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000s\000o\000l\000v\000e\000.\000O\000p\000P\000t\000S\000o\000l\000v\000e\000r\000S\000t\000r\000a\000t\000e\000g\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 126 +\BOOKMARK [2][-]{subsection.3.22.1}{\376\377\0003\000.\0002\0002\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.22}% 127 +\BOOKMARK [2][-]{subsection.3.22.2}{\376\377\0003\000.\0002\0002\000.\0002\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000\046\000\040\000D\000e\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.22}% 128 +\BOOKMARK [3][-]{subsubsection.3.22.2.1}{\376\377\0003\000.\0002\0002\000.\0002\000.\0001\000\040\000\137\000\137\000i\000n\000i\000t\000\137\000\137\000\050\000\051}{subsection.3.22.2}% 129 +\BOOKMARK [2][-]{subsection.3.22.3}{\376\377\0003\000.\0002\0002\000.\0003\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.22}% 130 +\BOOKMARK [3][-]{subsubsection.3.22.3.1}{\376\377\0003\000.\0002\0002\000.\0003\000.\0001\000\040\000s\000o\000l\000v\000e\000\137\000e\000q\000n\000s\000\050\000\051}{subsection.3.22.3}% 131 +\BOOKMARK [1][-]{section.3.23}{\376\377\0003\000.\0002\0003\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000h\000a\000r\000e\000d\000.\000P\000l\000o\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 132 +\BOOKMARK [2][-]{subsection.3.23.1}{\376\377\0003\000.\0002\0003\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.23}% 133 +\BOOKMARK [1][-]{section.3.24}{\376\377\0003\000.\0002\0004\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000R\000a\000w\000F\000i\000l\000e\000.\000R\000a\000w\000F\000i\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 134 +\BOOKMARK [2][-]{subsection.3.24.1}{\376\377\0003\000.\0002\0004\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.24}% 135 +\BOOKMARK [2][-]{subsection.3.24.2}{\376\377\0003\000.\0002\0004\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.24}% 136 +\BOOKMARK [3][-]{subsubsection.3.24.2.1}{\376\377\0003\000.\0002\0004\000.\0002\000.\0001\000\040\000f\000i\000x\000\137\000c\000a\000s\000e\000\050\000\051}{subsection.3.24.2}% 137 +\BOOKMARK [1][-]{section.3.25}{\376\377\0003\000.\0002\0005\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s\000.\000R\000e\000s\000i\000s\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 138 +\BOOKMARK [2][-]{subsection.3.25.1}{\376\377\0003\000.\0002\0005\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.25}% 139 +\BOOKMARK [2][-]{subsection.3.25.2}{\376\377\0003\000.\0002\0005\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.25}% 140 +\BOOKMARK [3][-]{subsubsection.3.25.2.1}{\376\377\0003\000.\0002\0005\000.\0002\000.\0001\000\040\000o\000p\000\137\000p\000t\000\137\000e\000q\000n\000\050\000\051}{subsection.3.25.2}% 141 +\BOOKMARK [3][-]{subsubsection.3.25.2.2}{\376\377\0003\000.\0002\0005\000.\0002\000.\0002\000\040\000t\000r\000a\000n\000s\000\137\000e\000q\000n\000\050\000\051}{subsection.3.25.2}% 142 +\BOOKMARK [1][-]{section.3.26}{\376\377\0003\000.\0002\0006\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000R\000e\000s\000i\000s\000t\000o\000r\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 143 +\BOOKMARK [2][-]{subsection.3.26.1}{\376\377\0003\000.\0002\0006\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.26}% 144 +\BOOKMARK [2][-]{subsection.3.26.2}{\376\377\0003\000.\0002\0006\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.26}% 145 +\BOOKMARK [3][-]{subsubsection.3.26.2.1}{\376\377\0003\000.\0002\0006\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.26.2}% 146 +\BOOKMARK [1][-]{section.3.27}{\376\377\0003\000.\0002\0007\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000s\000o\000l\000v\000e\000.\000S\000o\000l\000v\000e\000r\000S\000t\000r\000a\000t\000e\000g\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 147 +\BOOKMARK [2][-]{subsection.3.27.1}{\376\377\0003\000.\0002\0007\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.27}% 148 +\BOOKMARK [2][-]{subsection.3.27.2}{\376\377\0003\000.\0002\0007\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.27}% 149 +\BOOKMARK [3][-]{subsubsection.3.27.2.1}{\376\377\0003\000.\0002\0007\000.\0002\000.\0001\000\040\000s\000o\000l\000v\000e\000\137\000e\000q\000n\000s\000\050\000\051}{subsection.3.27.2}% 150 +\BOOKMARK [1][-]{section.3.28}{\376\377\0003\000.\0002\0008\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 151 +\BOOKMARK [2][-]{subsection.3.28.1}{\376\377\0003\000.\0002\0008\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.28}% 152 +\BOOKMARK [2][-]{subsection.3.28.2}{\376\377\0003\000.\0002\0008\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.28}% 153 +\BOOKMARK [3][-]{subsubsection.3.28.2.1}{\376\377\0003\000.\0002\0008\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.28.2}% 154 +\BOOKMARK [1][-]{section.3.29}{\376\377\0003\000.\0002\0009\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000s\000o\000l\000v\000e\000.\000T\000r\000a\000n\000s\000i\000e\000n\000t\000S\000o\000l\000v\000e\000r\000S\000t\000r\000a\000t\000e\000g\000y\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 155 +\BOOKMARK [2][-]{subsection.3.29.1}{\376\377\0003\000.\0002\0009\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.29}% 156 +\BOOKMARK [2][-]{subsection.3.29.2}{\376\377\0003\000.\0002\0009\000.\0002\000\040\000C\000o\000n\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000\046\000\040\000D\000e\000s\000t\000r\000u\000c\000t\000o\000r\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.29}% 157 +\BOOKMARK [3][-]{subsubsection.3.29.2.1}{\376\377\0003\000.\0002\0009\000.\0002\000.\0001\000\040\000\137\000\137\000i\000n\000i\000t\000\137\000\137\000\050\000\051}{subsection.3.29.2}% 158 +\BOOKMARK [2][-]{subsection.3.29.3}{\376\377\0003\000.\0002\0009\000.\0003\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.29}% 159 +\BOOKMARK [3][-]{subsubsection.3.29.3.1}{\376\377\0003\000.\0002\0009\000.\0003\000.\0001\000\040\000s\000o\000l\000v\000e\000\137\000e\000q\000n\000s\000\050\000\051}{subsection.3.29.3}% 160 +\BOOKMARK [1][-]{section.3.30}{\376\377\0003\000.\0003\0000\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000R\000a\000w\000F\000i\000l\000e\000.\000V\000a\000r\000i\000a\000b\000l\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 161 +\BOOKMARK [1][-]{section.3.31}{\376\377\0003\000.\0003\0001\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000V\000C\000C\000S\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 162 +\BOOKMARK [2][-]{subsection.3.31.1}{\376\377\0003\000.\0003\0001\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.31}% 163 +\BOOKMARK [2][-]{subsection.3.31.2}{\376\377\0003\000.\0003\0001\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.31}% 164 +\BOOKMARK [3][-]{subsubsection.3.31.2.1}{\376\377\0003\000.\0003\0001\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.31.2}% 165 +\BOOKMARK [1][-]{section.3.32}{\376\377\0003\000.\0003\0002\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000V\000C\000V\000S\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 166 +\BOOKMARK [2][-]{subsection.3.32.1}{\376\377\0003\000.\0003\0002\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.32}% 167 +\BOOKMARK [2][-]{subsection.3.32.2}{\376\377\0003\000.\0003\0002\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.32}% 168 +\BOOKMARK [3][-]{subsubsection.3.32.2.1}{\376\377\0003\000.\0003\0002\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.32.2}% 169 +\BOOKMARK [1][-]{section.3.33}{\376\377\0003\000.\0003\0003\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000S\000h\000a\000r\000e\000d\000.\000V\000e\000c\000t\000o\000r\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 170 +\BOOKMARK [2][-]{subsection.3.33.1}{\376\377\0003\000.\0003\0003\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.33}% 171 +\BOOKMARK [2][-]{subsection.3.33.2}{\376\377\0003\000.\0003\0003\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.33}% 172 +\BOOKMARK [3][-]{subsubsection.3.33.2.1}{\376\377\0003\000.\0003\0003\000.\0002\000.\0001\000\040\000t\000o\000\137\000w\000a\000v\000e\000f\000o\000r\000m\000\050\000\051}{subsection.3.33.2}% 173 +\BOOKMARK [1][-]{section.3.34}{\376\377\0003\000.\0003\0004\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000c\000o\000m\000p\000o\000n\000e\000n\000t\000s\000.\000V\000S\000o\000u\000r\000c\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 174 +\BOOKMARK [2][-]{subsection.3.34.1}{\376\377\0003\000.\0003\0004\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.34}% 175 +\BOOKMARK [2][-]{subsection.3.34.2}{\376\377\0003\000.\0003\0004\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.34}% 176 +\BOOKMARK [3][-]{subsubsection.3.34.2.1}{\376\377\0003\000.\0003\0004\000.\0002\000.\0001\000\040\000o\000p\000\137\000p\000t\000\137\000e\000q\000n\000\050\000\051}{subsection.3.34.2}% 177 +\BOOKMARK [3][-]{subsubsection.3.34.2.2}{\376\377\0003\000.\0003\0004\000.\0002\000.\0002\000\040\000t\000r\000a\000n\000s\000\137\000e\000q\000n\000\050\000\051}{subsection.3.34.2}% 178 +\BOOKMARK [1][-]{section.3.35}{\376\377\0003\000.\0003\0005\000\040\000P\000y\000S\000p\000i\000c\000e\000.\000S\000p\000i\000c\000e\000.\000O\000p\000e\000n\000S\000P\000I\000C\000E\000.\000n\000e\000t\000l\000i\000s\000t\000.\000V\000S\000o\000u\000r\000c\000e\000T\000e\000x\000t\000F\000m\000t\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e}{chapter.3}% 179 +\BOOKMARK [2][-]{subsection.3.35.1}{\376\377\0003\000.\0003\0005\000.\0001\000\040\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n}{section.3.35}% 180 +\BOOKMARK [2][-]{subsection.3.35.2}{\376\377\0003\000.\0003\0005\000.\0002\000\040\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n}{section.3.35}% 181 +\BOOKMARK [3][-]{subsubsection.3.35.2.1}{\376\377\0003\000.\0003\0005\000.\0002\000.\0001\000\040\000g\000e\000n\000\137\000t\000x\000t\000\137\000s\000t\000r\000\050\000\051}{subsection.3.35.2}% 182 diff --git a/PySpice/Spice/OpenSPICE/latex/refman.tex b/PySpice/Spice/OpenSPICE/latex/refman.tex new file mode 100644 index 00000000..71720ef2 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/refman.tex @@ -0,0 +1,227 @@ + % Handle batch mode + % to overcome problems with too many open files + \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} + % Set document class depending on configuration + \documentclass[twoside]{book} + %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package + \usepackage{ifthen} + \ifx\requestedLaTeXdate\undefined + \usepackage{array} + \else + \usepackage{array}[=2016-10-06] + \fi + %% + % Packages required by doxygen + \usepackage{fixltx2e} % for \textsubscript + \usepackage{doxygen} + \usepackage{graphicx} + \usepackage[utf8]{inputenc} + \usepackage{makeidx} + \PassOptionsToPackage{warn}{textcomp} + \usepackage{textcomp} + \usepackage[nointegrals]{wasysym} + \usepackage{ifxetex} + % NLS support packages + % Define default fonts + % Font selection + \usepackage[T1]{fontenc} + % set main and monospaced font + \usepackage[scaled=.90]{helvet} +\usepackage{courier} +\renewcommand{\familydefault}{\sfdefault} + \usepackage{sectsty} + \allsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + % Arguments of doxygenemoji: + % 1) '::' form of the emoji, already LaTeX-escaped + % 2) file with the name of the emoji without the .png extension + % in case image exist use this otherwise use the '::' form + \newcommand{\doxygenemoji}[2]{% + \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}% + } + % Page & text layout + \usepackage{geometry} + \geometry{% + a4paper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% + } + % Allow a bit of overflow to go unnoticed by other means + \tolerance=750 + \hfuzz=15pt + \hbadness=750 + \setlength{\emergencystretch}{15pt} + \setlength{\parindent}{0cm} + \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}} + \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}} + \doxynormalparskip + % Redefine paragraph/subparagraph environments, using sectsty fonts + \makeatletter + \renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% + } + \renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% + } + \makeatother + \makeatletter + \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@} + \makeatother + % Headers & footers + \usepackage{fancyhdr} + \pagestyle{fancyplain} + \renewcommand{\footrulewidth}{0.4pt} + \fancypagestyle{fancyplain}{ + \fancyhf{} + \fancyhead[LE, RO]{\bfseries\thepage} + \fancyhead[LO]{\bfseries\rightmark} + \fancyhead[RE]{\bfseries\leftmark} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + } + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + \renewcommand{\headrulewidth}{0pt} + } + \pagestyle{fancyplain} + \renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% + } + \renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% + } + % ToC, LoF, LoT, bibliography, and index + % Indices & bibliography + \usepackage{natbib} + \usepackage[titles]{tocloft} + \setcounter{tocdepth}{3} + \setcounter{secnumdepth}{5} + % creating indexes + \makeindex + \usepackage{newunicodechar} + \newunicodechar{⁻}{${}^{-}$}% Superscript minus + \newunicodechar{²}{${}^{2}$}% Superscript two + \newunicodechar{³}{${}^{3}$}% Superscript three + % Hyperlinks + % Hyperlinks (required, but should be loaded last) + \ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} + \else + \ifxetex + \usepackage[pagebackref=true]{hyperref} + \else + \usepackage[ps2pdf,pagebackref=true]{hyperref} + \fi + \fi + \hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode,% + pdftitle={Open\+SPICE},% + pdfsubject={Lightweight, Python-\/native electronic circuit simulator}% + } + % Custom commands used by the header + % Custom commands + \newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% + } + % caption style definition + \usepackage{caption} + \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} + % in page table of contents + \usepackage{etoc} + \etocsettocstyle{\doxytocparskip}{\doxynormalparskip} + % prevent numbers overlap the titles in toc + \renewcommand{\numberline}[1]{#1~} +% End of preamble, now comes the document contents +%===== C O N T E N T S ===== +\begin{document} + \raggedbottom + % Titlepage & ToC + % To avoid duplicate page anchors due to reuse of same numbers for + % the index (be it as roman numbers) + \hypersetup{pageanchor=false, + bookmarksnumbered=true, + pdfencoding=unicode + } + \pagenumbering{alph} + \begin{titlepage} + \vspace*{7cm} + \begin{center}% + {\Large Open\+SPICE}\\ + \vspace*{1cm} + {\large Generated by Doxygen 1.9.5}\\ + \end{center} + \end{titlepage} + \clearemptydoublepage + \pagenumbering{roman} + \tableofcontents + \clearemptydoublepage + \pagenumbering{arabic} + % re-enable anchors again + \hypersetup{pageanchor=true} +%--- Begin generated contents --- +\chapter{Hierarchical Index} +\input{hierarchy} +\chapter{Class Index} +\input{annotated} +\chapter{Class Documentation} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavISourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1BehavVSourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Capacitor} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CapacitorTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCCSSourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1CCVSSourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Component} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1eqnstr_1_1EqnStrTransientStrategy} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtISourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ExtVSourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Inductor} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1InductorTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1ISource} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ISourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECircuitError} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Simulation_1_1OpenSPICECircuitSimulator} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICECommandError} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Server_1_1OpenSPICEServer} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1OpenSPICEShared} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1OpPtSolverStrategy} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Plot} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1RawFile} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1Resistor} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1ResistorTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1SolverStrategy} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1TextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1solve_1_1TransientSolverStrategy} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1RawFile_1_1Variable} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCCSSourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VCVSSourceTextFmt} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1Shared_1_1Vector} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1components_1_1VSource} +\input{classPySpice_1_1Spice_1_1OpenSPICE_1_1netlist_1_1VSourceTextFmt} +%--- End generated contents --- +% Index + \backmatter + \newpage + \phantomsection + \clearemptydoublepage + \addcontentsline{toc}{chapter}{\indexname} + \printindex +% Required for some languages (in combination with latexdocumentpre from the header) +\end{document} diff --git a/PySpice/Spice/OpenSPICE/latex/refman.toc b/PySpice/Spice/OpenSPICE/latex/refman.toc new file mode 100644 index 00000000..f3dc13ff --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/refman.toc @@ -0,0 +1,183 @@ +\@ifundefined {etoctocstyle}{\let \etoc@startlocaltoc \@gobble \let \etoc@settocdepth \@gobble \let \etoc@depthtag \@gobble \let \etoc@setlocaltop \@gobble }{} +\contentsline {chapter}{\numberline {1}Hierarchical Index}{1}{chapter.1}% +\contentsline {section}{\numberline {1.1}Class Hierarchy}{1}{section.1.1}% +\contentsline {chapter}{\numberline {2}Class Index}{3}{chapter.2}% +\contentsline {section}{\numberline {2.1}Class List}{3}{section.2.1}% +\contentsline {chapter}{\numberline {3}Class Documentation}{5}{chapter.3}% +\contentsline {section}{\numberline {3.1}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Behav\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{5}{section.3.1}% +\contentsline {subsection}{\numberline {3.1.1}Detailed Description}{5}{subsection.3.1.1}% +\contentsline {subsection}{\numberline {3.1.2}Member Function Documentation}{5}{subsection.3.1.2}% +\contentsline {subsubsection}{\numberline {3.1.2.1}gen\_txt\_str()}{6}{subsubsection.3.1.2.1}% +\contentsline {section}{\numberline {3.2}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Behav\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{6}{section.3.2}% +\contentsline {subsection}{\numberline {3.2.1}Detailed Description}{6}{subsection.3.2.1}% +\contentsline {subsection}{\numberline {3.2.2}Member Function Documentation}{6}{subsection.3.2.2}% +\contentsline {subsubsection}{\numberline {3.2.2.1}gen\_txt\_str()}{7}{subsubsection.3.2.2.1}% +\contentsline {section}{\numberline {3.3}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Capacitor Class Reference}{7}{section.3.3}% +\contentsline {subsection}{\numberline {3.3.1}Detailed Description}{7}{subsection.3.3.1}% +\contentsline {subsection}{\numberline {3.3.2}Member Function Documentation}{7}{subsection.3.3.2}% +\contentsline {subsubsection}{\numberline {3.3.2.1}op\_pt\_eqn()}{7}{subsubsection.3.3.2.1}% +\contentsline {subsubsection}{\numberline {3.3.2.2}trans\_eqn()}{8}{subsubsection.3.3.2.2}% +\contentsline {section}{\numberline {3.4}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Capacitor\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{8}{section.3.4}% +\contentsline {subsection}{\numberline {3.4.1}Detailed Description}{9}{subsection.3.4.1}% +\contentsline {subsection}{\numberline {3.4.2}Member Function Documentation}{9}{subsection.3.4.2}% +\contentsline {subsubsection}{\numberline {3.4.2.1}gen\_txt\_str()}{9}{subsubsection.3.4.2.1}% +\contentsline {section}{\numberline {3.5}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}CCCSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{9}{section.3.5}% +\contentsline {subsection}{\numberline {3.5.1}Detailed Description}{10}{subsection.3.5.1}% +\contentsline {subsection}{\numberline {3.5.2}Member Function Documentation}{10}{subsection.3.5.2}% +\contentsline {subsubsection}{\numberline {3.5.2.1}gen\_txt\_str()}{10}{subsubsection.3.5.2.1}% +\contentsline {section}{\numberline {3.6}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}CCVSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{10}{section.3.6}% +\contentsline {subsection}{\numberline {3.6.1}Detailed Description}{11}{subsection.3.6.1}% +\contentsline {subsection}{\numberline {3.6.2}Member Function Documentation}{11}{subsection.3.6.2}% +\contentsline {subsubsection}{\numberline {3.6.2.1}gen\_txt\_str()}{11}{subsubsection.3.6.2.1}% +\contentsline {section}{\numberline {3.7}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Component Class Reference}{11}{section.3.7}% +\contentsline {subsection}{\numberline {3.7.1}Detailed Description}{11}{subsection.3.7.1}% +\contentsline {subsection}{\numberline {3.7.2}Member Function Documentation}{12}{subsection.3.7.2}% +\contentsline {subsubsection}{\numberline {3.7.2.1}op\_pt\_eqn()}{12}{subsubsection.3.7.2.1}% +\contentsline {subsubsection}{\numberline {3.7.2.2}trans\_eqn()}{12}{subsubsection.3.7.2.2}% +\contentsline {section}{\numberline {3.8}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}eqnstr.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Eqn\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Str\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Op\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Pt\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{13}{section.3.8}% +\contentsline {subsection}{\numberline {3.8.1}Detailed Description}{13}{subsection.3.8.1}% +\contentsline {subsection}{\numberline {3.8.2}Constructor \& Destructor Documentation}{13}{subsection.3.8.2}% +\contentsline {subsubsection}{\numberline {3.8.2.1}\_\_init\_\_()}{13}{subsubsection.3.8.2.1}% +\contentsline {subsection}{\numberline {3.8.3}Member Function Documentation}{13}{subsection.3.8.3}% +\contentsline {subsubsection}{\numberline {3.8.3.1}gen\_eqn\_from\_branch()}{14}{subsubsection.3.8.3.1}% +\contentsline {section}{\numberline {3.9}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}eqnstr.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Eqn\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Str\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{14}{section.3.9}% +\contentsline {subsection}{\numberline {3.9.1}Detailed Description}{14}{subsection.3.9.1}% +\contentsline {subsection}{\numberline {3.9.2}Member Function Documentation}{14}{subsection.3.9.2}% +\contentsline {subsubsection}{\numberline {3.9.2.1}gen\_eqn\_from\_branch()}{15}{subsubsection.3.9.2.1}% +\contentsline {subsubsection}{\numberline {3.9.2.2}gen\_eqns()}{15}{subsubsection.3.9.2.2}% +\contentsline {subsubsection}{\numberline {3.9.2.3}gen\_kcl\_eqns()}{15}{subsubsection.3.9.2.3}% +\contentsline {section}{\numberline {3.10}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}eqnstr.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Eqn\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Str\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Transient\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{16}{section.3.10}% +\contentsline {subsection}{\numberline {3.10.1}Detailed Description}{16}{subsection.3.10.1}% +\contentsline {subsection}{\numberline {3.10.2}Constructor \& Destructor Documentation}{16}{subsection.3.10.2}% +\contentsline {subsubsection}{\numberline {3.10.2.1}\_\_init\_\_()}{16}{subsubsection.3.10.2.1}% +\contentsline {subsection}{\numberline {3.10.3}Member Function Documentation}{16}{subsection.3.10.3}% +\contentsline {subsubsection}{\numberline {3.10.3.1}gen\_eqn\_from\_branch()}{17}{subsubsection.3.10.3.1}% +\contentsline {section}{\numberline {3.11}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Ext\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{17}{section.3.11}% +\contentsline {subsection}{\numberline {3.11.1}Detailed Description}{17}{subsection.3.11.1}% +\contentsline {subsection}{\numberline {3.11.2}Member Function Documentation}{17}{subsection.3.11.2}% +\contentsline {subsubsection}{\numberline {3.11.2.1}gen\_txt\_str()}{18}{subsubsection.3.11.2.1}% +\contentsline {section}{\numberline {3.12}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Ext\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{18}{section.3.12}% +\contentsline {subsection}{\numberline {3.12.1}Detailed Description}{18}{subsection.3.12.1}% +\contentsline {subsection}{\numberline {3.12.2}Member Function Documentation}{18}{subsection.3.12.2}% +\contentsline {subsubsection}{\numberline {3.12.2.1}gen\_txt\_str()}{19}{subsubsection.3.12.2.1}% +\contentsline {section}{\numberline {3.13}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Inductor Class Reference}{19}{section.3.13}% +\contentsline {subsection}{\numberline {3.13.1}Detailed Description}{19}{subsection.3.13.1}% +\contentsline {subsection}{\numberline {3.13.2}Member Function Documentation}{19}{subsection.3.13.2}% +\contentsline {subsubsection}{\numberline {3.13.2.1}op\_pt\_eqn()}{19}{subsubsection.3.13.2.1}% +\contentsline {subsubsection}{\numberline {3.13.2.2}trans\_eqn()}{20}{subsubsection.3.13.2.2}% +\contentsline {section}{\numberline {3.14}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Inductor\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{20}{section.3.14}% +\contentsline {subsection}{\numberline {3.14.1}Detailed Description}{21}{subsection.3.14.1}% +\contentsline {subsection}{\numberline {3.14.2}Member Function Documentation}{21}{subsection.3.14.2}% +\contentsline {subsubsection}{\numberline {3.14.2.1}gen\_txt\_str()}{21}{subsubsection.3.14.2.1}% +\contentsline {section}{\numberline {3.15}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource Class Reference}{21}{section.3.15}% +\contentsline {subsection}{\numberline {3.15.1}Detailed Description}{21}{subsection.3.15.1}% +\contentsline {subsection}{\numberline {3.15.2}Member Function Documentation}{21}{subsection.3.15.2}% +\contentsline {subsubsection}{\numberline {3.15.2.1}op\_pt\_eqn()}{22}{subsubsection.3.15.2.1}% +\contentsline {subsubsection}{\numberline {3.15.2.2}trans\_eqn()}{22}{subsubsection.3.15.2.2}% +\contentsline {section}{\numberline {3.16}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}ISource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{22}{section.3.16}% +\contentsline {subsection}{\numberline {3.16.1}Detailed Description}{23}{subsection.3.16.1}% +\contentsline {subsection}{\numberline {3.16.2}Member Function Documentation}{23}{subsection.3.16.2}% +\contentsline {subsubsection}{\numberline {3.16.2.1}gen\_txt\_str()}{23}{subsubsection.3.16.2.1}% +\contentsline {section}{\numberline {3.17}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICECircuit\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Error Class Reference}{23}{section.3.17}% +\contentsline {section}{\numberline {3.18}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Simulation.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICECircuit\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Simulator Class Reference}{24}{section.3.18}% +\contentsline {section}{\numberline {3.19}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICECommand\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Error Class Reference}{24}{section.3.19}% +\contentsline {section}{\numberline {3.20}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Server.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICEServer Class Reference}{24}{section.3.20}% +\contentsline {subsection}{\numberline {3.20.1}Detailed Description}{25}{subsection.3.20.1}% +\contentsline {subsection}{\numberline {3.20.2}Member Function Documentation}{25}{subsection.3.20.2}% +\contentsline {subsubsection}{\numberline {3.20.2.1}\_\_call\_\_()}{25}{subsubsection.3.20.2.1}% +\contentsline {section}{\numberline {3.21}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICEShared Class Reference}{25}{section.3.21}% +\contentsline {subsection}{\numberline {3.21.1}Constructor \& Destructor Documentation}{26}{subsection.3.21.1}% +\contentsline {subsubsection}{\numberline {3.21.1.1}\_\_init\_\_()}{27}{subsubsection.3.21.1.1}% +\contentsline {subsection}{\numberline {3.21.2}Member Function Documentation}{27}{subsection.3.21.2}% +\contentsline {subsubsection}{\numberline {3.21.2.1}alter\_device()}{27}{subsubsection.3.21.2.1}% +\contentsline {subsubsection}{\numberline {3.21.2.2}alter\_model()}{27}{subsubsection.3.21.2.2}% +\contentsline {subsubsection}{\numberline {3.21.2.3}delete()}{27}{subsubsection.3.21.2.3}% +\contentsline {subsubsection}{\numberline {3.21.2.4}destroy()}{28}{subsubsection.3.21.2.4}% +\contentsline {subsubsection}{\numberline {3.21.2.5}device\_help()}{28}{subsubsection.3.21.2.5}% +\contentsline {subsubsection}{\numberline {3.21.2.6}exec\_command()}{28}{subsubsection.3.21.2.6}% +\contentsline {subsubsection}{\numberline {3.21.2.7}get\_isrc\_data()}{28}{subsubsection.3.21.2.7}% +\contentsline {subsubsection}{\numberline {3.21.2.8}get\_vsrc\_data()}{29}{subsubsection.3.21.2.8}% +\contentsline {subsubsection}{\numberline {3.21.2.9}halt()}{29}{subsubsection.3.21.2.9}% +\contentsline {subsubsection}{\numberline {3.21.2.10}has\_cider()}{29}{subsubsection.3.21.2.10}% +\contentsline {subsubsection}{\numberline {3.21.2.11}has\_xspice()}{29}{subsubsection.3.21.2.11}% +\contentsline {subsubsection}{\numberline {3.21.2.12}last\_plot()}{29}{subsubsection.3.21.2.12}% +\contentsline {subsubsection}{\numberline {3.21.2.13}load\_circuit()}{30}{subsubsection.3.21.2.13}% +\contentsline {subsubsection}{\numberline {3.21.2.14}new\_instance()}{30}{subsubsection.3.21.2.14}% +\contentsline {subsubsection}{\numberline {3.21.2.15}option()}{30}{subsubsection.3.21.2.15}% +\contentsline {subsubsection}{\numberline {3.21.2.16}plot()}{30}{subsubsection.3.21.2.16}% +\contentsline {subsubsection}{\numberline {3.21.2.17}plot\_names()}{31}{subsubsection.3.21.2.17}% +\contentsline {subsubsection}{\numberline {3.21.2.18}remove\_circuit()}{31}{subsubsection.3.21.2.18}% +\contentsline {subsubsection}{\numberline {3.21.2.19}reset()}{31}{subsubsection.3.21.2.19}% +\contentsline {subsubsection}{\numberline {3.21.2.20}ressource\_usage()}{31}{subsubsection.3.21.2.20}% +\contentsline {subsubsection}{\numberline {3.21.2.21}resume()}{32}{subsubsection.3.21.2.21}% +\contentsline {subsubsection}{\numberline {3.21.2.22}run()}{32}{subsubsection.3.21.2.22}% +\contentsline {subsubsection}{\numberline {3.21.2.23}send\_char()}{32}{subsubsection.3.21.2.23}% +\contentsline {subsubsection}{\numberline {3.21.2.24}send\_data()}{32}{subsubsection.3.21.2.24}% +\contentsline {subsubsection}{\numberline {3.21.2.25}send\_init\_data()}{33}{subsubsection.3.21.2.25}% +\contentsline {subsubsection}{\numberline {3.21.2.26}send\_stat()}{33}{subsubsection.3.21.2.26}% +\contentsline {subsubsection}{\numberline {3.21.2.27}set()}{33}{subsubsection.3.21.2.27}% +\contentsline {subsubsection}{\numberline {3.21.2.28}set\_circuit()}{33}{subsubsection.3.21.2.28}% +\contentsline {subsubsection}{\numberline {3.21.2.29}source()}{34}{subsubsection.3.21.2.29}% +\contentsline {subsubsection}{\numberline {3.21.2.30}status()}{34}{subsubsection.3.21.2.30}% +\contentsline {subsubsection}{\numberline {3.21.2.31}step()}{34}{subsubsection.3.21.2.31}% +\contentsline {subsubsection}{\numberline {3.21.2.32}stop()}{34}{subsubsection.3.21.2.32}% +\contentsline {subsubsection}{\numberline {3.21.2.33}trace()}{35}{subsubsection.3.21.2.33}% +\contentsline {subsubsection}{\numberline {3.21.2.34}unset()}{35}{subsubsection.3.21.2.34}% +\contentsline {subsubsection}{\numberline {3.21.2.35}where()}{35}{subsubsection.3.21.2.35}% +\contentsline {section}{\numberline {3.22}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}solve.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Op\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Pt\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Solver\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{35}{section.3.22}% +\contentsline {subsection}{\numberline {3.22.1}Detailed Description}{36}{subsection.3.22.1}% +\contentsline {subsection}{\numberline {3.22.2}Constructor \& Destructor Documentation}{36}{subsection.3.22.2}% +\contentsline {subsubsection}{\numberline {3.22.2.1}\_\_init\_\_()}{36}{subsubsection.3.22.2.1}% +\contentsline {subsection}{\numberline {3.22.3}Member Function Documentation}{36}{subsection.3.22.3}% +\contentsline {subsubsection}{\numberline {3.22.3.1}solve\_eqns()}{36}{subsubsection.3.22.3.1}% +\contentsline {section}{\numberline {3.23}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Plot Class Reference}{37}{section.3.23}% +\contentsline {subsection}{\numberline {3.23.1}Detailed Description}{37}{subsection.3.23.1}% +\contentsline {section}{\numberline {3.24}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Raw\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}File.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Raw\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}File Class Reference}{37}{section.3.24}% +\contentsline {subsection}{\numberline {3.24.1}Detailed Description}{38}{subsection.3.24.1}% +\contentsline {subsection}{\numberline {3.24.2}Member Function Documentation}{38}{subsection.3.24.2}% +\contentsline {subsubsection}{\numberline {3.24.2.1}fix\_case()}{38}{subsubsection.3.24.2.1}% +\contentsline {section}{\numberline {3.25}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Resistor Class Reference}{39}{section.3.25}% +\contentsline {subsection}{\numberline {3.25.1}Detailed Description}{39}{subsection.3.25.1}% +\contentsline {subsection}{\numberline {3.25.2}Member Function Documentation}{39}{subsection.3.25.2}% +\contentsline {subsubsection}{\numberline {3.25.2.1}op\_pt\_eqn()}{39}{subsubsection.3.25.2.1}% +\contentsline {subsubsection}{\numberline {3.25.2.2}trans\_eqn()}{40}{subsubsection.3.25.2.2}% +\contentsline {section}{\numberline {3.26}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Resistor\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{40}{section.3.26}% +\contentsline {subsection}{\numberline {3.26.1}Detailed Description}{40}{subsection.3.26.1}% +\contentsline {subsection}{\numberline {3.26.2}Member Function Documentation}{41}{subsection.3.26.2}% +\contentsline {subsubsection}{\numberline {3.26.2.1}gen\_txt\_str()}{41}{subsubsection.3.26.2.1}% +\contentsline {section}{\numberline {3.27}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}solve.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Solver\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{41}{section.3.27}% +\contentsline {subsection}{\numberline {3.27.1}Detailed Description}{41}{subsection.3.27.1}% +\contentsline {subsection}{\numberline {3.27.2}Member Function Documentation}{41}{subsection.3.27.2}% +\contentsline {subsubsection}{\numberline {3.27.2.1}solve\_eqns()}{42}{subsubsection.3.27.2.1}% +\contentsline {section}{\numberline {3.28}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{42}{section.3.28}% +\contentsline {subsection}{\numberline {3.28.1}Detailed Description}{43}{subsection.3.28.1}% +\contentsline {subsection}{\numberline {3.28.2}Member Function Documentation}{43}{subsection.3.28.2}% +\contentsline {subsubsection}{\numberline {3.28.2.1}gen\_txt\_str()}{43}{subsubsection.3.28.2.1}% +\contentsline {section}{\numberline {3.29}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}solve.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Transient\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Solver\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Strategy Class Reference}{43}{section.3.29}% +\contentsline {subsection}{\numberline {3.29.1}Detailed Description}{44}{subsection.3.29.1}% +\contentsline {subsection}{\numberline {3.29.2}Constructor \& Destructor Documentation}{44}{subsection.3.29.2}% +\contentsline {subsubsection}{\numberline {3.29.2.1}\_\_init\_\_()}{44}{subsubsection.3.29.2.1}% +\contentsline {subsection}{\numberline {3.29.3}Member Function Documentation}{44}{subsection.3.29.3}% +\contentsline {subsubsection}{\numberline {3.29.3.1}solve\_eqns()}{44}{subsubsection.3.29.3.1}% +\contentsline {section}{\numberline {3.30}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Raw\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}File.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Variable Class Reference}{45}{section.3.30}% +\contentsline {section}{\numberline {3.31}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VCCSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{45}{section.3.31}% +\contentsline {subsection}{\numberline {3.31.1}Detailed Description}{46}{subsection.3.31.1}% +\contentsline {subsection}{\numberline {3.31.2}Member Function Documentation}{46}{subsection.3.31.2}% +\contentsline {subsubsection}{\numberline {3.31.2.1}gen\_txt\_str()}{46}{subsubsection.3.31.2.1}% +\contentsline {section}{\numberline {3.32}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VCVSSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{46}{section.3.32}% +\contentsline {subsection}{\numberline {3.32.1}Detailed Description}{47}{subsection.3.32.1}% +\contentsline {subsection}{\numberline {3.32.2}Member Function Documentation}{47}{subsection.3.32.2}% +\contentsline {subsubsection}{\numberline {3.32.2.1}gen\_txt\_str()}{47}{subsubsection.3.32.2.1}% +\contentsline {section}{\numberline {3.33}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Shared.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Vector Class Reference}{47}{section.3.33}% +\contentsline {subsection}{\numberline {3.33.1}Detailed Description}{47}{subsection.3.33.1}% +\contentsline {subsection}{\numberline {3.33.2}Member Function Documentation}{48}{subsection.3.33.2}% +\contentsline {subsubsection}{\numberline {3.33.2.1}to\_waveform()}{48}{subsubsection.3.33.2.1}% +\contentsline {section}{\numberline {3.34}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}components.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource Class Reference}{48}{section.3.34}% +\contentsline {subsection}{\numberline {3.34.1}Detailed Description}{48}{subsection.3.34.1}% +\contentsline {subsection}{\numberline {3.34.2}Member Function Documentation}{48}{subsection.3.34.2}% +\contentsline {subsubsection}{\numberline {3.34.2.1}op\_pt\_eqn()}{48}{subsubsection.3.34.2.1}% +\contentsline {subsubsection}{\numberline {3.34.2.2}trans\_eqn()}{49}{subsubsection.3.34.2.2}% +\contentsline {section}{\numberline {3.35}Py\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Spice.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Open\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}SPICE.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}netlist.\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}VSource\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Text\discretionary {\mbox {\scriptsize $\hookleftarrow $}}{}{}Fmt Class Reference}{49}{section.3.35}% +\contentsline {subsection}{\numberline {3.35.1}Detailed Description}{49}{subsection.3.35.1}% +\contentsline {subsection}{\numberline {3.35.2}Member Function Documentation}{50}{subsection.3.35.2}% +\contentsline {subsubsection}{\numberline {3.35.2.1}gen\_txt\_str()}{50}{subsubsection.3.35.2.1}% diff --git a/PySpice/Spice/OpenSPICE/latex/tabu_doxygen.sty b/PySpice/Spice/OpenSPICE/latex/tabu_doxygen.sty new file mode 100644 index 00000000..3f17d1d0 --- /dev/null +++ b/PySpice/Spice/OpenSPICE/latex/tabu_doxygen.sty @@ -0,0 +1,2557 @@ +%% +%% This is file `tabu.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tabu.dtx (with options: `package') +%% +%% This is a generated file. +%% Copyright (FC) 2010-2011 - lppl +%% +%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars +%% +%% ********************************************************************************************** +%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal +%% \begin{tabu} to { preamble } => target specified +%% \begin{tabu} spread { preamble } => target relative to the ``natural width'' +%% +%% tabu works in text and in math modes. +%% +%% X columns: automatic width adjustment + horizontal and vertical alignment +%% \begin{tabu} { X[4c] X[1c] X[-2ml] } +%% +%% Horizontal lines and / or leaders: +%% \hline\hline => double horizontal line +%% \firsthline\hline => for nested tabulars +%% \lasthline\hline => for nested tabulars +%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) +%% Automatic lines / leaders : +%% \everyrow{\hline\hline} +%% +%% Vertical lines and / or leaders: +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } +%% +%% Fixed vertical spacing adjustment: +%% \extrarowheight= \extrarowdepth= +%% or: \extrarowsep= => may be prefixed by \global +%% +%% Dynamic vertical spacing adjustment: +%% \abovetabulinesep= \belowtabulinesep= +%% or: \tabulinesep= => may be prefixed by \global +%% +%% delarray.sty shortcuts: in math and text modes +%% \begin{tabu} .... \({ preamble }\) +%% +%% Algorithms reports: +%% \tracingtabu=1 \tracingtabu=2 +%% +%% ********************************************************************************************** +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file tabu.dtx +%% and the derived files +%% tabu.sty, tabu.pdf, tabu.ins +%% +%% tabu : Flexible LaTeX tabulars +%% lppl copyright 2010-2011 by FC +%% + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen] +\RequirePackage{array}[2008/09/09] +\RequirePackage{varwidth}[2009/03/30] +\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} +\let\tabu@AtEnd\@empty +\def\TMP@EnsureCode#1={% + \edef\tabu@AtEnd{\tabu@AtEnd + \catcode#1 \the\catcode#1}% + \catcode#1=% +}% \TMP@EnsureCode +\TMP@EnsureCode 33 = 12 % ! +\TMP@EnsureCode 58 = 12 % : (for siunitx) +\TMP@EnsureCode124 = 12 % | +\TMP@EnsureCode 36 = 3 % $ = math shift +\TMP@EnsureCode 38 = 4 % & = tab alignment character +\TMP@EnsureCode 32 = 10 % space +\TMP@EnsureCode 94 = 7 % ^ +\TMP@EnsureCode 95 = 8 % _ +%% Constants -------------------------------------------------------- +\newcount \c@taburow \def\thetaburow {\number\c@taburow} +\newcount \tabu@nbcols +\newcount \tabu@cnt +\newcount \tabu@Xcol +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcount \tabu@alloc \tabu@alloc=\m@ne +\newcount \tabu@nested +\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} +\newdimen \tabu@target +\newdimen \tabu@spreadtarget +\newdimen \tabu@naturalX +\newdimen \tabucolX +\let\tabu@DELTA \@tempdimc +\let\tabu@thick \@tempdima +\let\tabu@on \@tempdimb +\let\tabu@off \@tempdimc +\newdimen \tabu@Xsum +\newdimen \extrarowdepth +\newdimen \abovetabulinesep +\newdimen \belowtabulinesep +\newdimen \tabustrutrule \tabustrutrule \z@ +\newtoks \tabu@thebody +\newtoks \tabu@footnotes +\newsavebox \tabu@box +\newsavebox \tabu@arstrutbox +\newsavebox \tabu@hleads +\newsavebox \tabu@vleads +\newif \iftabu@colortbl +\newif \iftabu@siunitx +\newif \iftabu@measuring +\newif \iftabu@spread +\newif \iftabu@negcoef +\newif \iftabu@everyrow +\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} +\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} +\newif \iftabu@long +\newif \iftabuscantokens +\def\tabu@rescan {\tabu@verbatim \scantokens } +%% Utilities (for internal usage) ----------------------------------- +\def\tabu@gobblespace #1 {#1} +\def\tabu@gobbletoken #1#2{#1} +\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} +\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble + \else\ifx \@sptoken\@let@token + \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX + \fi\fi +}% \tabu@gobblex +\def\tabu@X{^^J} +{\obeyspaces +\global\let\tabu@spxiii= % saves an active space (for \ifx) +\gdef\tabu@@spxiii{ }} +\def\tabu@ifenvir {% only for \multicolumn + \expandafter\tabu@if@nvir\csname\@currenvir\endcsname +}% \tabu@ifenvir +\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else + \ifx\longtabu#1first\else + second\fi\fi oftwo\endcsname +}% \tabu@ifenvir +\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} +{\catcode`\&=3 +\gdef\tabu@strtrim #1{% #1 = control sequence to trim + \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi + \let\tabu@c@l@r \@empty \let#1\@empty + \else \expandafter \tabu@trimspaces #1\@nnil + \fi +}% \tabu@strtrim +\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% +\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} +\gdef\tabu@lastspace #1{\def #3{#1}% + \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi + \tabu@trimspaces #1\@nnil} +}% \catcode +\def\tabu@sanitizearg #1#2{{% + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% + \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% +}% \tabu@sanitizearg +\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}% + \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!! +}% \tabu@textbar +\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} +\def\tabu@everyrow@egroup{% + \iftabu@everyrow \expandafter \endgroup \the\toks@ + \else \ifnum0=`{\fi}% + \fi +}% \tabu@everyrow@egroup +\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \z@}% +}% \tabu@arstrut +\def\tabu@rearstrut {% + \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax + \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax + \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima + \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi + \tabu@mkarstrut + \fi +}% \tabu@rearstrut +\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} +\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox + \hbox to\z@{\hbox to\z@{\hss + {\tabu@DBG{cyan}\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \z@ + width \tabustrutrule}\kern-\tabustrutrule + {\tabu@DBG{pink}\vrule + height \z@ + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \tabustrutrule}}}% +}% \tabu@DBG@arstrut +\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ + \@nextchar}}% +\def\tabu@savedecl{\ifcat$\d@llarend\else + \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode +}% \tabu@savedecl +\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} +\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } +\let\tabu@trialh@@k \@empty +\def\tabu@nowrite #1#{{\afterassignment}\toks@} +\let\tabu@write\write +\let\tabu@immediate\immediate +\def\tabu@WRITE{\begingroup + \def\immediate\write{\aftergroup\endgroup + \tabu@immediate\tabu@write}% +}% \tabu@WRITE +\expandafter\def\expandafter\tabu@GenericError\expandafter{% + \expandafter\tabu@WRITE\GenericError} +\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} +\def\tabu@noxfootnote [#1]{\@gobble} +\def\tabu@nocolor #1#{\@gobble} +\newcommand*\tabu@norowcolor[2][]{} +\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% + \futurelet\@let@token \tabu@m@ybesiunitx} +\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% + \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi + \tabu@temp}% \tabu@m@ybesiunitx +}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname +\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% +%% Fixed vertical spacing adjustment: \extrarowsep ------------------ +\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% + \iftabu@everyrow \aftergroup\tabu@Gextra + \else \aftergroup\tabu@n@Gextra + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra +}% \extrarowsep +\def\tabu@extra {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setextrasep \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extra +\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} +\def\tabu@extr@ #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extr@ +\def\tabu@setextrasep {\extrarowheight=\extrarowdepth + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth +}% \tabu@setextrasep +\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} +\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} +\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} +\let\tabu@C@extra \z@ +\let\tabu@G@extra \@empty +%% Dynamic vertical spacing adjustment: \tabulinesep ---------------- +\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% + \iftabu@everyrow \aftergroup\tabu@Glinesep + \else \aftergroup\tabu@n@Glinesep + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep +}% \tabulinesep +\def\tabu@linesep {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setlinesep \abovetabulinesep + \fi \tabu@temp}% +}% \tabu@linesep +\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} +\def\tabu@sets@p #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep + \fi \tabu@temp}% +}% \tabu@sets@p +\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep +}% \tabu@setlinesep +\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} +\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} +\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} +\let\tabu@C@linesep \z@ +\let\tabu@G@linesep \@empty +%% \global\extrarowsep and \global\tabulinesep ------------------- +\def\tabu@Gsave #1#2#3#4{\xdef#1{#1% + \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% +}% \tabu@Gsave +\def\tabu@Grestore#1#2{% + \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax + \ifcat$\the\toks\currentgrouplevel$\else + \global\let#1\@empty \global\let#2\z@ + \the\toks\currentgrouplevel + \fi +}% \tabu@Grestore +%% Setting code for every row --------------------------------------- +\newcommand*\everyrow{\tabu@everyrow@bgroup + \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop +}% \everyrow +\def\tabu@evrstartstop {\@ifnextchar^% + {\afterassignment \tabu@evrstartstop \tabu@stop=}% + {\ifx ^\@let@token + \afterassignment\tabu@evrstartstop \tabu@start=% + \else \afterassignment\tabu@everyr@w \toks@ + \fi}% +}% \tabu@evrstartstop +\def\tabu@everyr@w {% + \xdef\tabu@everyrow{% + \noexpand\tabu@everyrowfalse + \let\noalign \relax + \noexpand\tabu@rowfontreset + \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors + \let\noexpand\tabu@docline \noexpand\tabu@docline@evr + \the\toks@ + \noexpand\tabu@evrh@@k + \noexpand\tabu@rearstrut + \global\advance\c@taburow \@ne}% + \iftabu@everyrow \toks@\expandafter + {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% + \else \xdef\tabu@evr@G{\the\toks@}% + \fi + \tabu@everyrow@egroup +}% \tabu@everyr@w +\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only +\tabu@evr{} +%% line style and leaders ------------------------------------------- +\newcommand*\newtabulinestyle [1]{% + {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% +}% \newtabulinestyle +\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% + \tabu@sanitizearg {#1}\@tempa + \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi + \global\expandafter\let + \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi +}% \tabu@newlinestyle +\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% + \iftabu@everyrow + \toks@\expandafter{\expandafter \def \expandafter + \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% + \gdef\tabu@ls@{\tabu@ls@L}% + \else + \global\let\tabu@ls@G \tabu@thestyle + \gdef\tabu@ls@{\tabu@ls@G}% + \fi + \tabu@everyrow@egroup +}% \tabulinestyle +\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} +\def\tabu@rulecolor #1{\toks@{}% + \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% + \tabu@temp + \tabu@rulearc +}% \tabu@rulecolor +\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp + \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% + \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% + \fi + \tabu@temp +}% \tabu@ruledrsc@ +\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} +\def\tabu@rule@drsc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% + \else \toks@{\def\CT@drsc@{\color #1{#2}}}% + \fi + \else + \ifx \\#1#2\\\global\let\CT@drsc@ \relax + \else \gdef\CT@drsc@{\color #1{#2}}% + \fi + \fi + \tabu@rulearc +}% \tabu@rule@drsc@ +\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} +\def\tabu@rule@arc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% + \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% + \fi + \toks@\expandafter{\the\toks@ + \let\tabu@arc@L \CT@arc@ + \let\tabu@drsc@L \CT@drsc@ + \ignorespaces}% + \else + \ifx \\#1#2\\\gdef\CT@arc@{}% + \else \gdef\CT@arc@{\color #1{#2}}% + \fi + \global\let\tabu@arc@G \CT@arc@ + \global\let\tabu@drsc@G \CT@drsc@ + \fi + \tabu@everyrow@egroup +}% \tabu@rule@arc@ +\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} +\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} +\def\tabu@rowc@lors #1#2#3{% + \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil + \@defaultunits \tabu@start =\number0#1\relax \@nnil + \ifnum \count@<\tw@ \count@=\tw@ \fi + \advance\tabu@start \m@ne + \ifnum \tabu@start<\z@ \tabu@start \z@ \fi + \tabu@rowcolorseries #3\in@..\in@ \@nnil +}% \tabu@rowcolors +\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% + \ifx \in@#1\relax + \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% + \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ + \fi + \else + \ifx \\#2\\\tabu@rowcolorserieserror \fi + \tabu@sanitizearg{#1}\tabu@temp + \tabu@sanitizearg{#2}\@tempa + \advance\count@ \m@ne + \iftabu@everyrow + \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% + \ifnum ##2=\c@taburow + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi + \ifnum \c@taburow<##2 \else + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}\fi}% + }\edef\x{\noexpand\tabu@rc@ {\the\count@} + {\the\tabu@start} + {\tabu@temp} + {\@tempa}% + }\x + \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% + \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% + \else % inside \noalign + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% + \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% + \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}}% + }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x + \global\let\tabu@rc@G \tabu@rc@ + \fi + \fi + \tabu@everyrow@egroup +}% \tabu@rowcolorseries +\tabuDisableCommands {\let\tabu@rc@ \@empty } +\def\tabu@rowcolorserieserror {\PackageError{tabu} + {Invalid syntax for \string\taburowcolors + \MessageBreak Please look at the documentation!}\@ehd +}% \tabu@rowcolorserieserror +\newcommand*\tabureset {% + \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ + \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% +}% \tabureset +%% Parsing the line styles ------------------------------------------ +\def\tabu@getline #1{\begingroup + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa + \let\tabu@thestyle \relax + \ifcsname tabu@linestyle@\@tempa \endcsname + \edef\tabu@thestyle{\endgroup + \def\tabu@thestyle{\expandafter\noexpand + \csname tabu@linestyle@\@tempa\endcsname}% + }\tabu@thestyle + \else \expandafter\tabu@definestyle \tabu@temp \@nil + \fi +}% \tabu@getline +\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter + \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen + \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined + \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs + \def\tabu@temp{\tabu@getparam{thick}}% + \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% + \fi + {% + \let\tabu@ \relax + \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) + \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% + \expandafter}\expandafter + \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) + \def\;{\def\:}% + \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) + \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) + \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi + \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi + \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi + \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen + \tabu@on \tabulineon \fi\fi + \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen + \tabu@off \tabulineoff \fi\fi + \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi + \in@true % + \else \in@false % + \fi + \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% + \else \edef\tabu@thick{\the\tabu@thick}% + \fi + \edef \tabu@thestyle ##1##2{\endgroup + \def\tabu@thestyle{% + \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} + {\the\tabu@on}{##1} + {\the\tabu@off}{##2}% + \else \noexpand\tabu@rulesstyle + {##1\vrule width \tabu@thick}% + {##1\leaders \hrule height \tabu@thick \hfil}% + \fi}% + }\expandafter \expandafter + \expandafter \tabu@thestyle \expandafter + \expandafter \expandafter + {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% +}% \tabu@definestyle +{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active + \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} + \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} +}% \catcode +\def\tabu@oxiii #1{% + \ifcase \ifx n#1\z@ \else + \ifx f#1\@ne\else + \tw@ \fi\fi + \expandafter\tabu@onxiii + \or \expandafter\tabu@ofxiii + \else o% + \fi#1}% +\def\tabu@onxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx \tabu@spxiii#2\@ne\else + \tw@ \fi\fi\fi + \tabu@getparam{on}#2\expandafter\@gobble + \or \expandafter\tabu@onxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}}% +\def\tabu@ofxiii #1#2{% + \ifx #2f\expandafter\tabu@offxiii + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@offxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx\tabu@spxiii#2\@ne \else + \tw@ \fi\fi\fi + \tabu@getparam{off}#2\expandafter\@gobble + \or \expandafter\tabu@offxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} +\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef + \ifx \tabu@#1\else % no more spec + \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi +}% \tabu@getcolor +\def\tabu@getc@l@r #1\tabu@ {% + \def\tabu@temp{#1}\tabu@strtrim \tabu@temp + \ifx \tabu@temp\@empty + \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists + \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r + \else \let\tabu@c@lon \tabu@c@l@r + \fi + %\else \tabu@warncolour{\tabu@temp}% + \fi%\fi + \tabu@ % next spec +}% \tabu@getc@l@r +\def\tabu@warncolour #1{\PackageWarning{tabu} + {Color #1 is not defined. Default color used}% +}% \tabu@warncolour +\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% + \ifx \tabu@leaders\tabu@leaders@G \else + \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi +}% \tabu@leadersstyle +\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined + \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% +}% \tabu@rulesstyle +%% The leaders boxes ------------------------------------------------ +\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color + {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor + {% % but the leaders boxes should have colors ! + \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% + \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% + \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thehleaders \tabu@theleaders + }% + {% + \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% + \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% + \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thevleaders \tabu@theleaders + }% + \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% + }% +}% \tabu@LEADERS +\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} +\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color + \global\setbox \tabu@leads=\@box{% + {#3\tabu@therule{#1}{#2}}% + \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi + {#3\tabu@therule{#1}{#2}}}% + \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss + {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% + \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% + {##1\tabu@therule{#1}{#2}}% + \xleaders \copy\tabu@leads \@ss + \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% + }\tabu@theleaders{#3}% +}% \tabu@l@@d@rs +%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- +\newcommand*\tabu {\tabu@longfalse + \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% + \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endtabu*\endcsname{\endtabu}% + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {tabu} +\let\tabu@tabular \tabular % +\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} +\newcommand*\longtabu {\tabu@longtrue + \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi + \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% + \LTchunksize=\@M + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% + \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {longtabu} +\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} +\def\tabu@nolongtabu{\PackageError{tabu} + {longtabu requires the longtable package}\@ehd} +%% Read the target and then : \tabular or \@array ------------------ +\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } +\def\tabu@sett@rget {\tabu@target \z@ + \ifcase \ifx \bgroup\@let@token \z@ \else + \ifx \@sptoken\@let@token \@ne \else + \if t\@let@token \tw@ \else + \if s\@let@token \thr@@\else + \z@\fi\fi\fi\fi + \expandafter\tabu@begin + \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget + \or \expandafter\tabu@to + \or \expandafter\tabu@spread + \fi +}% \tabu@sett@rget +\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} +\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} +\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } +\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } +\def\tabu@linegoalt@rget {% + \ifx \tabu@temp\LNGL@setlinegoal + \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal + \tabu@begin +}% \tabu@linegoalt@rget +\def\tabu@begin #1#{% + \iftabu@measuring \expandafter\tabu@nestedmeasure \fi + \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty + \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% + \fi + \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil +}% \tabu@begin +\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup + \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% + \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% +}% \tabu@tabu@ +\def\tabu@nestedmeasure {% + \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax + \tabu@spreadtrue + \else \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}% + \expandafter\tabu@collectbody\expandafter\tabu@quickrule + \expandafter\endgroup + \fi +}% \tabu@nestedmeasure +\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} +%% \tabu@setup \tabu@init \tabu@indent +\def\tabu@setup{\tabu@alloc@ + \ifcase \tabu@nested + \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ + \let\tabu@afterendpar \par + \fi\fi\fi + \def\tabu@aligndefault{c}\tabu@init \tabu@indent + \else % + \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth + \fi + \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined + \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% + \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... + \let\@endpbox \tabu@endpbox % idem " " " " " " + \let\@tabarray \tabu@tabarray % idem " " " " " " + \tabu@setcleanup \tabu@setreset +}% \tabu@setup +\def\tabu@init{\tabu@starttimer \tabu@measuringfalse + \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% + \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline + \let\firstline \tabu@firstline \let\lastline \tabu@lastline + \let\hline \tabu@hline \let\@xhline \tabu@xhline + \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox + \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi + \tabu@trivlist % + \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext + \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering + \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft + \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering + \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft + \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont + \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x + \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar + \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok + \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn + \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! + \let\tabu@endpbox \@endpbox % idem " " " " " " " + \let\tabu@tabarray \@tabarray % idem " " " " " " " + \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) + \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi +}% \tabu@init +\def\tabu@indent{% correction for indentation + \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget + \everypar\expandafter{% + \the\everypar\everypar\expandafter{\the\everypar}% + \setbox\z@=\lastbox + \ifdim\wd\z@>\z@ \edef\tabu@thetarget + {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi + \box\z@}% + \fi\fi +}% \tabu@indent +\def\tabu@setcleanup {% saves last global assignments + \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax + \def\tabu@aftergroupcleanup{% + \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% + \else + \def\tabu@aftergroupcleanup{% + \aftergroup\aftergroup\aftergroup\tabu@cleanup + \let\tabu@aftergroupcleanup \relax}% + \fi + \let\tabu@arc@Gsave \tabu@arc@G + \let\tabu@arc@G \tabu@arc@L % + \let\tabu@drsc@Gsave \tabu@drsc@G + \let\tabu@drsc@G \tabu@drsc@L % + \let\tabu@ls@Gsave \tabu@ls@G + \let\tabu@ls@G \tabu@ls@L % + \let\tabu@rc@Gsave \tabu@rc@G + \let\tabu@rc@G \tabu@rc@L % + \let\tabu@evr@Gsave \tabu@evr@G + \let\tabu@evr@G \tabu@evr@L % + \let\tabu@celllalign@save \tabu@celllalign + \let\tabu@cellralign@save \tabu@cellralign + \let\tabu@cellleft@save \tabu@cellleft + \let\tabu@cellright@save \tabu@cellright + \let\tabu@@celllalign@save \tabu@@celllalign + \let\tabu@@cellralign@save \tabu@@cellralign + \let\tabu@@cellleft@save \tabu@@cellleft + \let\tabu@@cellright@save \tabu@@cellright + \let\tabu@rowfontreset@save \tabu@rowfontreset + \let\tabu@@rowfontreset@save\tabu@@rowfontreset + \let\tabu@rowfontreset \@empty + \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset + \edef\c@taburow@save {\the\c@taburow}% + \edef\tabu@naturalX@save {\the\tabu@naturalX}% + \let\tabu@naturalXmin@save \tabu@naturalXmin + \let\tabu@naturalXmax@save \tabu@naturalXmax + \let\tabu@mkarstrut@save \tabu@mkarstrut + \edef\tabu@clarstrut{% + \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax + \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax + \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% +}% \tabu@setcleanup +\def\tabu@cleanup {\begingroup + \globaldefs\@ne \tabu@everyrowtrue + \let\tabu@arc@G \tabu@arc@Gsave + \let\CT@arc@ \tabu@arc@G + \let\tabu@drsc@G \tabu@drsc@Gsave + \let\CT@drsc@ \tabu@drsc@G + \let\tabu@ls@G \tabu@ls@Gsave + \let\tabu@ls@ \tabu@ls@G + \let\tabu@rc@G \tabu@rc@Gsave + \let\tabu@rc@ \tabu@rc@G + \let\CT@do@color \relax + \let\tabu@evr@G \tabu@evr@Gsave + \let\tabu@celllalign \tabu@celllalign@save + \let\tabu@cellralign \tabu@cellralign@save + \let\tabu@cellleft \tabu@cellleft@save + \let\tabu@cellright \tabu@cellright@save + \let\tabu@@celllalign \tabu@@celllalign@save + \let\tabu@@cellralign \tabu@@cellralign@save + \let\tabu@@cellleft \tabu@@cellleft@save + \let\tabu@@cellright \tabu@@cellright@save + \let\tabu@rowfontreset \tabu@rowfontreset@save + \let\tabu@@rowfontreset \tabu@@rowfontreset@save + \tabu@naturalX =\tabu@naturalX@save + \let\tabu@naturalXmax \tabu@naturalXmax@save + \let\tabu@naturalXmin \tabu@naturalXmin@save + \let\tabu@mkarstrut \tabu@mkarstrut@save + \c@taburow =\c@taburow@save + \ifcase \tabu@nested \tabu@alloc \m@ne\fi + \endgroup % + \ifcase \tabu@nested + \the\tabu@footnotes \global\tabu@footnotes{}% + \tabu@afterendpar \tabu@elapsedtime + \fi + \tabu@clarstrut + \everyrow\expandafter {\tabu@evr@G}% +}% \tabu@cleanup +\let\tabu@afterendpar \relax +\def\tabu@setreset {% + \edef\tabu@savedparams {% \relax for \tabu@message@save + \ifmmode \col@sep \the\arraycolsep + \else \col@sep \the\tabcolsep \fi \relax + \arrayrulewidth \the\arrayrulewidth \relax + \doublerulesep \the\doublerulesep \relax + \extratabsurround \the\extratabsurround \relax + \extrarowheight \the\extrarowheight \relax + \extrarowdepth \the\extrarowdepth \relax + \abovetabulinesep \the\abovetabulinesep \relax + \belowtabulinesep \the\belowtabulinesep \relax + \def\noexpand\arraystretch{\arraystretch}% + \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% + \begingroup + \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu + \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi + \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi + \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L + \expandafter \endgroup \expandafter + \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena + \let\tabu@arc@G \tabu@arc@L + \let\tabu@drsc@G \tabu@drsc@L + \let\tabu@ls@G \tabu@ls@L + \let\tabu@rc@G \tabu@rc@L + \let\tabu@evr@G \tabu@evr@L}% + \def\tabu@reset{\tabu@savedparams + \tabu@everyrowtrue \c@taburow \z@ + \let\CT@arc@ \tabu@arc@L + \let\CT@drsc@ \tabu@drsc@L + \let\tabu@ls@ \tabu@ls@L + \let\tabu@rc@ \tabu@rc@L + \global\tabu@alloc \tabu@alloc@save + \everyrow\expandafter{\tabu@evr@L}}% +}% \tabu@reset +\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} +\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} +%% The Rewriting Process ------------------------------------------- +\def\tabu@newcolumntype #1{% + \expandafter\tabu@new@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@newcolumntype +\def\tabu@new@columntype #1#2#3{% + \def#1##1#3{\NC@{##1}}% + \let#2\relax \newcommand*#2% +}% \tabu@new@columntype +\def\tabu@privatecolumntype #1{% + \expandafter\tabu@private@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\expandafter\endcsname + \csname tabu@NC@find@\string#1\expandafter\endcsname + \csname tabu@NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@privatecolumntype +\def\tabu@private@columntype#1#2#3#4{% + \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% + \tabu@new@columntype#3#4% +}% \tabu@private@columntype +\let\tabu@privatecolumns \@empty +\newcommand*\tabucolumn [1]{\expandafter \def \expandafter + \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns + \NC@do #1}}% +\let\tabu@highprioritycolumns \@empty +%% The | ``column'' : rewriting process -------------------------- +\tabu@privatecolumntype |{\tabu@rewritevline} +\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% + \expandafter \NC@find \tabu@rewritten} +\def\tabu@lines #1{% + \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi + \NC@list\expandafter{\the\NC@list \NC@do #1}% +}% \tabu@lines@ +\def\tabu@vlinearg #1{% + \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% + \else\tabu@getline {#1}% + \fi + \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% + }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% + \expandafter \tabu@keepls \tabu@thestyle \@nil +}% \tabu@vlinearg +\def\tabu@keepls #1\@nil{% + \ifcat $\@cdr #1\@nil $% + \ifx \relax#1\else + \ifx \tabu@ls@#1\else + \let#1\relax + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@savels\noexpand#1}\fi\fi\fi +}% \tabu@keepls +\def\tabu@thevline {\begingroup + \ifdefined\tabu@leaders + \setbox\@tempboxa=\vtop to\dimexpr + \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% + \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox + \box\@tempboxa + \else + \tabu@thevrule + \fi \endgroup +}% \tabu@thevline +\def\tabu@savels #1{% + \expandafter\let\csname\string#1\endcsname #1% + \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset + \tabu@resetls#1}}% +\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% +%% \multicolumn inside tabu environment ----------------------------- +\tabu@newcolumntype \tabu@rewritemulticolumn{% + \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \tabu@savedecl + \tabu@privatecolumns + \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% + \let\tabu@savels \relax + \NC@find +}% \tabu@rewritemulticolumn +\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} +\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} +\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup + \tabu@everyrowtrue + \NC@list{\NC@do \tabu@rewritemulticolumn}% + \expandafter\@gobbletwo % gobbles \multispan{#1} + \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% + {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi + {#3}}% +}% \tabu@multic@lumn +%% The X column(s): rewriting process ----------------------------- +\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} +\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } +\def\tabu@siunitx #1{\@ifnextchar \bgroup + {\tabu@rewriteX@Ss{#1}} + {\tabu@nosiunitx{#1}}} +\def\tabu@rewriteX@Ss #1#2{\@temptokena{}% + \@defaultunits \let\tabu@temp =#2\relax\@nnil + \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi + \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% + }\expandafter\NC@find \the\@temptokena \relax + }\expandafter\NC@rewrite@S \@gobble #2\relax + \else \tabu@siunitxerror + \fi + \expandafter \NC@find \tabu@rewritten +}% \tabu@rewriteX@Ss +\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! + \MessageBreak X column can only embed siunitx S or s columns}\@ehd +}% \tabu@siunitxerror +\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% + \iftabu@measuring + \else \tabu@measuringtrue % first X column found in the preamble + \let\@halignto \relax \let\tabu@halignto \relax + \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ + \else \tabu@spreadtarget \z@ \fi + \ifdim \tabu@target=\z@ + \setlength\tabu@target \tabu@thetarget + \tabu@message{\tabu@message@defaulttarget}% + \else \tabu@message{\tabu@message@target}\fi + \fi +}% \tabu@rewriteX +\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax + \def\tabu@rewritten{l}} +\def\tabu@Xarg #1#2#3{% + \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty + \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty + \ifx\\#1\\% + \def\tabu@rewritten{p}\tabucolX \p@ % + \else + \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ + \tabu@Xparse {}#1\relax + \fi + \tabu@Xrewritten{#2}{#3}% +}% \tabu@Xarg +\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} +\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} +\def\tabu@Xtest{% + \ifcase \ifx \relax\@let@token \z@ \else + \if ,\@let@token \m@ne\else + \if p\@let@token 1\else + \if m\@let@token 2\else + \if b\@let@token 3\else + \if l\@let@token 4\else + \if c\@let@token 5\else + \if r\@let@token 6\else + \if j\@let@token 7\else + \if L\@let@token 8\else + \if C\@let@token 9\else + \if R\@let@token 10\else + \if J\@let@token 11\else + \ifx \@sptoken\@let@token 12\else + \if .\@let@token 13\else + \if -\@let@token 13\else + \ifcat $\@let@token 14\else + 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \or \tabu@Xtype {p}% + \or \tabu@Xtype {m}% + \or \tabu@Xtype {b}% + \or \tabu@Xalign \raggedright\relax + \or \tabu@Xalign \centering\relax + \or \tabu@Xalign \raggedleft\relax + \or \tabu@Xalign \tabu@justify\relax + \or \tabu@Xalign \RaggedRight\raggedright + \or \tabu@Xalign \Centering\centering + \or \tabu@Xalign \RaggedLeft\raggedleft + \or \tabu@Xalign \justifying\tabu@justify + \or \expandafter \tabu@Xparsespace + \or \expandafter \tabu@Xcoef + \or \expandafter \tabu@Xm@th + \or \tabu@Xcoef{}% + \else\expandafter \tabu@Xparse + \fi +}% \tabu@Xtest +\def\tabu@Xalign #1#2{% + \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} + {Duplicate horizontal alignment specification}\fi + \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax + \else \def\tabu@Xlcr{#2}\let#2\relax\fi + \expandafter\tabu@Xparse +}% \tabu@Xalign +\def\tabu@Xtype #1{% + \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} + {Duplicate vertical alignment specification}\fi + \def\tabu@rewritten{#1}\expandafter\tabu@Xparse +}% \tabu@Xtype +\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% + \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi +}% \tabu@Xcoef +\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ + \tabu@Xparse{}% +}% \tabu@Xc@ef +\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} +\def\tabu@Xd@sp{\let\tabu@Xmath=$% + \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% + \expandafter\tabu@Xparse + \else \expandafter\tabu@Xparse\expandafter{\expandafter}% + \fi +}% \tabu@Xd@sp +\def\tabu@Xrewritten {% + \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi + \ifdim \tabucolX<\z@ \tabu@negcoeftrue + \else\ifdim \tabucolX=\z@ \tabucolX \p@ + \fi\fi + \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% + \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% + \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% + >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% + \tabu@rewritten {\tabu@hsize \tabu@temp}% + <{##2\ifx$\tabu@Xmath$\fi}}% + }\tabu@rewritten +}% \tabu@Xrewritten +\def\tabu@hsize #1#2{% + \ifdim #2\p@<\z@ + \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else + \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi + \fi + \else #2\tabucolX + \fi +}% \tabu@hsize +%% \usetabu and \preamble: rewriting process --------------------- +\tabu@privatecolumntype \usetabu [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\let\tabu@rewriteX \tabu@rewriteXrestore + \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% + \fi +}% \NC@rewrite@\usetabu +\tabu@privatecolumntype \preamble [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% + \fi +}% \NC@rewrite@\preamble +%% Controlling the rewriting process ------------------------------- +\tabu@newcolumntype \tabu@rewritefirst{% + \iftabu@long \aftergroup \tabu@longpream % + \else \aftergroup \tabu@pream + \fi + \let\tabu@ \relax \let\tabu@hsize \relax + \let\tabu@Xcoefs \@empty \let\tabu@savels \relax + \tabu@Xcol \z@ \tabu@cnt \tw@ + \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse + \global\setbox\@arstrutbox \box\@arstrutbox + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \NC@list\expandafter{\the\NC@list \NC@do X}% + \iftabu@siunitx % + \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi + \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% + \expandafter\def\expandafter\tabu@NC@list\expandafter{% + \the\expandafter\NC@list \tabu@NC@list}% % * | X S + \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu + \expandafter \NC@do \expandafter\preamble + \the\NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \tabu@savedecl + \tabu@privatecolumns + \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle +}% NC@rewrite@\tabu@rewritefirst +\tabu@newcolumntype \tabu@rewritemiddle{% + \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast +}% \NC@rewrite@\tabu@rewritemiddle +\tabu@newcolumntype \tabu@rewritelast{% + \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne + \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \else \let\tabu@prev\tabu@temp + \fi + \ifcase \tabu@cnt \expandafter\tabu@endrewrite + \else \expandafter\NC@find \expandafter\tabu@rewritemiddle + \fi +}% \NC@rewrite@\tabu@rewritelast +%% Choosing the strategy -------------------------------------------- +\def\tabu@endrewrite {% + \let\tabu@temp \NC@find + \ifx \@arrayright\relax \let\@arrayright \@empty \fi + \count@=% + \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print + \iftabu@measuring + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@target \csname tabu@\the\tabu@nested.T\endcsname + \tabucolX \csname tabu@\the\tabu@nested.X\endcsname + \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% + \fi + \else\iftabu@measuring 4 % X columns + \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer + \tabu@target \the\tabu@target + \tabu@spreadtarget \the\tabu@spreadtarget}% + \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% + \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% + \let\tabu@Xcoefs \relax + \else\ifcase\tabu@nested \thr@@ % outer, no X + \global\let\tabu@afterendpar \relax + \else \@ne % inner, no X, outer in mode 1 or 2 + \fi + \ifdefined\tabu@usetabu + \else \ifdim\tabu@target=\z@ + \else \let\tabu@temp \tabu@extracolsep + \fi\fi + \fi + \fi + \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% + \tabu@temp +}% \tabu@endrewrite +\def\tabu@extracolsep{\@defaultunits \expandafter\let + \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil + \ifx \tabu@temp\@sptoken + \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep + \else + \edef\tabu@temp{\noexpand\NC@find + \if |\noexpand\tabu@temp @% + \else\if !\noexpand\tabu@temp @% + \else !% + \fi\fi + {\noexpand\extracolsep\noexpand\@flushglue}}% + \fi + \tabu@temp +}% \tabu@extrac@lsep +%% Implementing the strategy ---------------------------------------- +\long\def\tabu@pream #1\@preamble {% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\tabu@aftergroupcleanup}% + \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody + \@preamble}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@pream +\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@longpream +\def\tabu@select {% + \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi + \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi + \ifcase \count@ + \global\let\tabu@elapsedtime \relax + \tabu@seteverycr + \expandafter \tabuthepreamble % vertical adjustment (inherited from outer) + \or % exit in vertical measure + struts per cell because no X and outer in mode 3 + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \tabu@seteverycr + \expandafter \tabuthepreamble + \or % exit without measure because no X and outer in mode 4 + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@seteverycr + \expandafter \tabuthepreamble + \else % needs trials + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@savecounters + \expandafter \tabu@setstrategy + \fi +}% \tabu@select +\def\tabu@@ {\gdef\tabu@mkpreambuffer} +%% Protections to set up before trials ------------------------------ +\def\tabu@setstrategy {\begingroup % + \tabu@trialh@@k \tabu@cnt \z@ % number of trials + \hbadness \@M \let\hbadness \@tempcnta + \hfuzz \maxdimen \let\hfuzz \@tempdima + \let\write \tabu@nowrite\let\GenericError \tabu@GenericError + \let\savetabu \@gobble \let\tabudefaulttarget \linewidth + \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote + \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor + \let\tabu@aftergroupcleanup \relax % only after the last trial + \tabu@mkpreambuffer + \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init + \def\tabu@lasttry{\m@ne\p@}\fi + \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % + \tabu@collectbody \tabu@strategy % +}% \tabu@setstrategy +\def\tabu@savecounters{% + \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% + \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax +}% \tabu@savecounters +\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) + \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs + \ifdim \dimen@>\z@ + \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \fi +}% \tabucolX@init +\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum + \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ + \else -#2\p@ \tabu@negcoeftrue + \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \tabu@wddef{#1}{0pt}% + \fi +}% \tabu@Xinit +%% Collecting the environment body ---------------------------------- +\long\def\tabu@collectbody #1#2\end #3{% + \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% + \ifx \tabu@stack\@empty + \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% + \def\tabu@end@envir{\end{#3}}% + \iftabuscantokens + \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% + \else \def\tabu@endenvir {\let\endarray \@empty + \end{#3}\tabu@gobbleX}% + \fi + \else \def\tabu@endenvir {\end{#3}}\fi}% + \let\tabu@collectbody \tabu@endofcollect + \else\def\tabu@temp{#3}% + \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% + \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% + \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% + \else \toks@\expandafter{\the\toks@ #2\end{#3}}% + \fi\fi\fi + \fi + \tabu@collectbody{#1}% +}% \tabu@collectbody +\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% +\def\tabu@endofcollect #1{\ifnum0=`{}\fi + \expandafter\endgroup \the\toks@ #1% +}% \tabu@endofcollect +%% The trials: switching between strategies ------------------------- +\def\tabu@strategy {\relax % stops \count@ assignment ! + \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) + \expandafter \tabu@endoftrials + \or % case 1 = exit in vertical measure (outer in mode 3) + \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% + \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% + \expandafter \tabu@endoftrials + \or % case 2 = exit with a rule replacing the table (outer in mode 4) + \expandafter \tabu@quickend + \or % case 3 = outer is in mode 3 because of no X + \begingroup + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \expandafter \tabu@measuring + \else % case 4 = horizontal measure + \begingroup + \global\let\tabu@elapsedtime \tabu@message@etime + \long\def\multicolumn##1##2##3{\multispan{##1}}% + \let\tabu@startpboxORI \@startpbox + \iftabu@spread + \def\tabu@naturalXmax {\z@}% + \let\tabu@naturalXmin \tabu@naturalXmax + \tabu@evr{\global\tabu@naturalX \z@}% + \let\@startpbox \tabu@startpboxmeasure + \else\iftabu@negcoef + \let\@startpbox \tabu@startpboxmeasure + \else \let\@startpbox \tabu@startpboxquick + \fi\fi + \expandafter \tabu@measuring + \fi +}% \tabu@strategy +\def\tabu@measuring{\expandafter \tabu@trial \expandafter + \count@ \the\count@ \tabu@endtrial +}% \tabu@measuring +\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} +\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \csname tabu@adl@endtrial\endcsname + \endarray}$\egroup % got \tabu@box +}% \tabu@shorttrial +\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \tabuendlongtrial}\egroup % got \tabu@box +}% \tabu@longtrial +\def\tabuendlongtrial{% no @ allowed for \scantokens + \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne + \LT@get@widths +}% \tabuendlongtrial +\def\tabu@adl@endtrial{% + \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! +\def\tabu@seteverycr {\tabu@reset + \everycr \expandafter{\the\everycr \tabu@everycr}% + \let\everycr \tabu@noeverycr % +}% \tabu@seteverycr +\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} +\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} +\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} +\def\tabu@endoftrials {% + \iftabuscantokens \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\expandafter \tabu@closetrialsgroup \expandafter + \tabu@rescan \expandafter{% + \expandafter\tabuthepreamble + \the\expandafter\tabu@thebody + \iftabu@long \else \endarray \fi}} + {\expandafter\tabu@closetrialsgroup \expandafter + \tabuthepreamble + \the\tabu@thebody}% + \tabu@endenvir % Finish ! +}% \tabu@endoftrials +\def\tabu@closetrialsgroup {% + \toks@\expandafter{\tabu@endenvir}% + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target + \tabu@cnt \the\tabu@cnt + \def\noexpand\tabu@endenvir{\the\toks@}% + %Quid de \@halignto = \tabu@halignto ?? + }% \tabu@bufferX + \tabu@bufferX + \ifcase\tabu@nested % print out (outer in mode 0) + \global\tabu@cnt \tabu@cnt + \tabu@evr{\tabu@verticaldynamicadjustment}% + \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty + \let\@finalstrut \tabu@finalstrut + \else % vertical measure of nested tabu + \tabu@evr{\tabu@verticalinit}% + \tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \fi + \tabu@clckpt \let\@halignto \tabu@halignto + \let\@halignto \@empty + \tabu@seteverycr + \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ + \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) + \fi\fi +}% \tabu@closetrialsgroup +\def\tabu@quickend {\expandafter \endgroup \expandafter + \tabu@target \the\tabu@target \tabu@quickrule + \let\endarray \relax \tabu@endenvir +}% \tabu@quickend +\def\tabu@endtrial {\relax % stops \count@ assignment ! + \ifcase \count@ \tabu@err % case 0 = impossible here + \or \tabu@err % case 1 = impossible here + \or \tabu@err % case 2 = impossible here + \or % case 3 = outer goes into mode 0 + \def\tabu@bufferX{\endgroup}\count@ \z@ + \else % case 4 = outer goes into mode 3 + \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) + \else \tabu@arith % or 2 (outer in mode 4) + \fi + \count@=% + \ifcase\tabu@nested \thr@@ % outer goes into mode 3 + \else\iftabu@measuring \tw@ % outer is in mode 4 + \else \@ne % outer is in mode 3 + \fi\fi + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% + \fi + \expandafter \tabu@bufferX \expandafter + \count@ \the\count@ \tabu@strategy +}% \tabu@endtrial +\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} +%% The algorithms: compute the widths / stop or go on --------------- +\def\tabu@arithnegcoef {% + \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs +}% \tabu@arithnegcoef +\def\tabu@arith@negcoef #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition + \advance\@tempdima #2\tabucolX + \else + \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated + \advance\dimen@ -#2\p@ + \advance\@tempdima -#2\tabucolX + \else + \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised + \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised + \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) + \fi + \fi + \fi +}% \tabu@arith@negcoef +\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ + \ifdim \@tempdima=\z@ + \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% + \else + \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} + *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% + \fi +}% \tabu@givespace +\def\tabu@arith {\advance\tabu@cnt \@ne + \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi + \tabu@arithnegcoef + \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % + \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax + \tabu@message{\tabu@message@arith}% + \ifdim \tabu@DELTA <\tabu@hfuzz + \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? + \let\tabu@ \tabu@givespace \tabu@Xcoefs + \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message + \else % already converged: nothing to do but nearly impossible... + \fi + \tabucolX \maxdimen + \tabu@measuringfalse + \else % need for narrower X columns + \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax + \tabu@measuringtrue + \@whilesw \iftabu@measuring\fi {% + \advance\tabu@cnt \@ne + \tabu@arithnegcoef + \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here + \tabu@message{\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else + \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ + \fi}% + \ifdim -\tabu@DELTA<\tabu@hfuzz + \advance\@tempdima \@tempdimb % for message + \tabu@measuringfalse + \else + \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax + \fi + }% + \fi + \tabu@message{\tabu@message@reached}% + \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% +}% \tabu@arith +\def\tabu@spreadarith {% + \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs + \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% + \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax + \iftabu@measuring + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% + \else + \tabu@message{\tabu@message@spreadarith}% + \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target + \tabu@message{(tabu) spread + \ifdim \@tempdimc>\tabu@target useless here: default target used% + \else too large: reduced to fit default target\fi.}% + \else + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% + \fi + \begingroup \let\tabu@wddef \@gobbletwo + \@tempdimb \@tempdima + \tabucolX@init + \tabu@arithnegcoef + \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax + \expandafter\endgroup \expandafter\tabucolX \the\tabucolX + \tabu@arith + \fi +}% \tabu@spreadarith +\def\tabu@spread@arith #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ + \else \advance\@tempdima \tabu@wd{#1}\relax + \fi +}% \tabu@spread@arith +%% Reporting in the .log file --------------------------------------- +\def\tabu@message@defaulttarget{% + \ifnum\tabu@nested=\z@^^J(tabu) Default target: + \ifx\tabudefaulttarget\linewidth \string\linewidth + \ifdim \tabu@thetarget=\linewidth \else + -\the\dimexpr\linewidth-\tabu@thetarget\fi = + \else\ifx\tabudefaulttarget\linegoal\string\linegoal= + \fi\fi + \else (tabu) Default target (nested): \fi + \the\tabu@target \on@line + \ifnum\tabu@nested=\z@ , page \the\c@page\fi} +\def\tabu@message@target {^^J(tabu) Target specified: + \the\tabu@target \on@line, page \the\c@page} +\def\tabu@message@arith {\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else + \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ + \fi +}% \tabu@message@arith +\def\tabu@message@spreadarith {\tabu@spreadheader + \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ + \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ + \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ + \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target + \else \@tempdimc+\tabu@spreadtarget \fi + {}{}{}{}{}\@@} +\def\tabu@message@negcoef #1#2{ + \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: + \space width = \tabu@wd {#1} + \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname + \ifdim -\tabu@pt#2\tabucolX<\tabu@target + < \number-\rem@pt#2 X + = \the\dimexpr -\tabu@pt#2\tabucolX \relax + \else + <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} +\def\tabu@message@reached{\tabu@header + ******* Reached Target: + hfuzz = \tabu@hfuzz\on@line\space *******} +\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% + \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: + \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec + \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) + -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax + *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space + cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} +\def\tabu@message@verticalsp {% + \ifdim \@tempdima>\tabu@ht + \ifdim \@tempdimb>\tabu@dp + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% + \else + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% + \fi + \else\ifdim \@tempdimb>\tabu@dp + \tabu@spaces\tabu@spaces\tabu@spaces + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi + \fi +}% \tabu@message@verticalsp +\edef\tabu@spaces{\@spaces} +\def\tabu@strippt{\expandafter\tabu@pt\the} +{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} +\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} +\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} +\def\do #1{% + \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% + \ifnum##1<10 #1 #1\else + \ifnum##1<100 #1 \else + \ifnum##1<\@m #1\fi\fi\fi + ##1.##2##3##4##5##6##7##8#1}% + \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% + \def\tabu@titles{\ifnum \tabu@nested=\z@ + (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target + #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% + \def\tabu@spreadheader{% + (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. + #1 New Target^^J% + (tabu) sprd} + \def\tabu@message@save {\begingroup + \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} + \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt + \dimexpr####1\p@{ }{ }}}% + \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% + \let\CT@arc@ \relax \let\@preamble \@gobble + \let\tabu@savedpream \@firstofone + \let\tabu@savedparams \@firstofone + \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% + \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% + \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% + \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% + \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% + \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% + \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% + \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% + \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% + \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% + \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% + \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% + \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% + \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% + \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% + \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% + \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% + \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% + \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% + \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% + \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo + \tabu@message{% + (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% + \tabu@usetabu \@nil^^J}% + \endgroup} +}\do{ } +%% Measuring the natural width (varwidth) - store the results ------- +\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop + \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% + \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? + \iftabu@spread \else % if spread -> measure + \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure + \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) + \tabu@measuringtrue % for the quick option... + \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi + \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target + \tabu@target=\tabu@temp\tabucolX \fi\fi + \setbox\tabu@box \hbox \bgroup + \begin{varwidth}\tabu@target + \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... + \narrowragged \arraybackslash \parfillskip \@flushglue + \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi + \bgroup \aftergroup\tabu@endpboxmeasure + \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi + \else \expandafter\@gobble + \tabu@startpboxquick{#1}% \@gobble \bgroup + \fi +}% \tabu@startpboxmeasure +\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty + \bgroup\color@begingroup} +\def\tabu@endpboxmeasure {% + \@finalstrut \@arstrutbox + \end{varwidth}\egroup % + \ifdim \tabu@temp\p@ <\z@ % neg coef + \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box + \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% + \tabu@debug{\tabu@message@endpboxmeasure}% + \fi + \else % spread coef>0 + \global\advance \tabu@naturalX \wd\tabu@box + \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax + \ifdim \tabu@naturalXmax <\tabu@naturalX + \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi + \ifdim \tabu@naturalXmin <\@tempdima + \xdef\tabu@naturalXmin {\the\@tempdima}\fi + \fi + \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target +}% \tabu@endpboxmeasure +\def\tabu@wddef #1{\expandafter\xdef + \csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd + \the\tabu@Xcol. X[\tabu@temp]: + target = \the\tabucolX \space + \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol + =\tabu@wd\tabu@Xcol +}% \tabu@message@endpboxmeasure +\def\tabu@startpboxquick {\bgroup + \let\@startpbox \tabu@startpboxORI % restore immediately + \let\tabu \tabu@quick % \begin is expanded before... + \expandafter\@gobble \@startpbox % gobbles \bgroup +}% \tabu@startpboxquick +\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick +}% \tabu@quick +\def\tabu@endquick {% + \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else + \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax + \endgroup + \else \let\endtabu \relax + \tabu@end@envir + \fi +}% \tabu@quick +\def\tabu@endtabu {\end{tabu}} +\def\tabu@endtabus {\end{tabu*}} +%% Measuring the heights and depths - store the results ------------- +\def\tabu@verticalmeasure{\everypar{}% + \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group + \setbox\tabu@box =\hbox\bgroup + \let\tabu@verticalspacing \tabu@verticalsp@lcr + \d@llarbegin % after \hbox ... + \else + \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop + \else\ifnum\currentgrouptype=12\vcenter + \else\vbox\fi\fi}% + \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup + \let\tabu@verticalspacing \tabu@verticalsp@pmb + \fi +}% \tabu@verticalmeasure +\def\tabu@verticalsp@lcr{% + \d@llarend \egroup % + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \noindent\vrule height\@tempdima depth\@tempdimb +}% \tabu@verticalsp@lcr +\def\tabu@verticalsp@pmb{% inserts struts as needed + \par \expandafter\egroup + \expandafter$\expandafter + \egroup \expandafter + \@tempdimc \the\prevdepth + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \let\@finalstrut \@gobble + \hrule height\@tempdima depth\@tempdimb width\hsize +%% \box\tabu@box +}% \tabu@verticalsp@pmb + +\def\tabu@verticalinit{% + \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! + \advance\c@taburow \@ne + \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% + \advance\c@taburow \m@ne +}% \tabu@verticalinit +\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@verticaldynamicadjustment {% + \advance\c@taburow \@ne + \extrarowheight \dimexpr\tabu@ht - \ht\strutbox + \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox + \let\arraystretch \@empty + \advance\c@taburow \m@ne +}% \tabu@verticaldynamicadjustment +\def\tabuphantomline{\crcr \noalign{% + {\globaldefs \@ne + \setbox\@arstrutbox \box\voidb@x + \let\tabu@@celllalign \tabu@celllalign + \let\tabu@@cellralign \tabu@cellralign + \let\tabu@@cellleft \tabu@cellleft + \let\tabu@@cellright \tabu@cellright + \let\tabu@@thevline \tabu@thevline + \let\tabu@celllalign \@empty + \let\tabu@cellralign \@empty + \let\tabu@cellright \@empty + \let\tabu@cellleft \@empty + \let\tabu@thevline \relax}% + \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% + \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr + \noalign{\tabu@rearstrut + {\globaldefs\@ne + \let\tabu@celllalign \tabu@@celllalign + \let\tabu@cellralign \tabu@@cellralign + \let\tabu@cellleft \tabu@@cellleft + \let\tabu@cellright \tabu@@cellright + \let\tabu@thevline \tabu@@thevline}}}% + \expandafter}\the\toks@ +}% \tabuphantomline +%% \firsthline and \lasthline corrections --------------------------- +\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} +\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} +\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} +\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} +\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) + \noalign{\ifnum0=`}\fi + {\CT@arc@\hrule height\arrayrulewidth}% + \futurelet \tabu@temp \tabu@xhline +}% \tabu@hline +\def\tabu@xhline{% + \ifx \tabu@temp \hline + {\ifx \CT@drsc@\relax \vskip + \else\ifx \CT@drsc@\@empty \vskip + \else \CT@drsc@\hrule height + \fi\fi + \doublerulesep}% + \fi + \ifnum0=`{\fi}% +}% \tabu@xhline +\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ + \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% + \tabu@hlineAZsurround +}% \tabu@hlineAZ +\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% + \extratabsurround #1\let\tabucline \tabucline@scan + \let\hline \tabu@hlinescan \let\firsthline \hline + \let\cline \tabu@clinescan \let\lasthline \hline + \expandafter \futurelet \expandafter \tabu@temp + \expandafter \tabu@nexthlineAZ \tabu@temp +}% \tabu@hlineAZsurround +\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} +\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} +\def\tabucline@scan{\@testopt \tabucline@sc@n {}} +\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} +\def\tabu@nexthlineAZ{% + \ifx \tabu@temp\hline \else + \ifx \tabu@temp\cline \else + \ifx \tabu@temp\tabucline \else + \tabu@hlinecorrection + \fi\fi\fi +}% \tabu@nexthlineAZ +\def\tabu@xhlineAZ #1{% + \toks@\expandafter{\the\toks@ #1}% + \@tempdimc \tabu@thick % The last line width + \ifcase\count@ \@tempdimb \tabu@thick % The first line width + \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax + \fi + \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ +}% \tabu@xhlineAZ +\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 + \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ + \edef\firsthline{% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + height \the\dimexpr\@tempdima+\extratabsurround + depth \dp\@arstrutbox + width \tabustrutrule}\hss}\cr + \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb + +\dp\@arstrutbox \relax}% + \the\toks@ + }\ifnum0=`{\fi + \expandafter}\firsthline % we are then ! +}% \tabu@firsthlinecorrection +\def\tabu@lasthlinecorrection{% + \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc + \edef\lasthline{% + \the\toks@ + \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ + +\extratabsurround-\@tempdimc + height \z@ + width \tabustrutrule}\hss}\cr + }\ifnum0=`{\fi + \expandafter}\lasthline % we are then ! +}% \tabu@lasthlinecorrection +\def\tabu@LT@@hline{% + \ifx\LT@next\hline + \global\let\LT@next \@gobble + \ifx \CT@drsc@\relax + \gdef\CT@LT@sep{% + \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% + \else + \gdef\CT@LT@sep{% + \multispan\LT@cols{% + \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% + \fi + \else + \global\let\LT@next\empty + \gdef\CT@LT@sep{% + \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \CT@LT@sep + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \noalign{\penalty\@M}% + \LT@next +}% \tabu@LT@@hline +%% Horizontal lines : \tabucline ------------------------------------ +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} +\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% + \ifnum \tabu@stop<\z@ \toks@{}% + \else \tabu@clinearg{#1}\tabu@thestyle + \edef\tabucline{\toks@{% + \ifnum \tabu@start>\z@ \omit + \tabu@multispan\tabu@start {\span\omit}&\fi + \omit \tabu@multispan\tabu@stop {\span\omit}% + \tabu@thehline\cr + }}\tabucline + \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% + \fi + \futurelet \tabu@temp \tabu@xcline +}% \tabu@cline +\def\tabu@clinearg #1{% + \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ + \else \@defaultunits \expandafter\let\expandafter\@tempa + \romannumeral-`\0#1\relax \@nnil + \ifx \hbox\@tempa \tabu@clinebox{#1}% + \else\ifx \box\@tempa \tabu@clinebox{#1}% + \else\ifx \vbox\@tempa \tabu@clinebox{#1}% + \else\ifx \vtop\@tempa \tabu@clinebox{#1}% + \else\ifx \copy\@tempa \tabu@clinebox{#1}% + \else\ifx \leaders\@tempa \tabu@clineleads{#1}% + \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% + \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% + \else\tabu@getline {#1}% + \fi\fi\fi\fi\fi\fi\fi\fi + \fi +}% \tabu@clinearg +\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} +\def\tabu@clineleads #1{% + \let\tabu@thestyle \relax \let\tabu@leaders \@undefined + \gdef\tabu@thehrule{#1}} +\def\tabu@thehline{\begingroup + \ifdefined\tabu@leaders + \noexpand\tabu@thehleaders + \else \noexpand\tabu@thehrule + \fi \endgroup +}% \tabu@thehline +\def\tabu@xcline{% + \ifx \tabu@temp\tabucline + \toks@\expandafter{\the\toks@ \noalign + {\ifx\CT@drsc@\relax \vskip + \else \CT@drsc@\hrule height + \fi + \doublerulesep}}% + \fi + \tabu@docline +}% \tabu@xcline +\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} +\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% + \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} +\def\tabu@multispan #1#2{% + \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan + \else \expandafter\@gobbletwo + \fi {#1-1}{#2}% +}% \tabu@multispan +\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} +\def\tabu@start@stop #1-#2\@nnil{% + \@defaultunits \tabu@start\number 0#1\relax \@nnil + \@defaultunits \tabu@stop \number 0#2\relax \@nnil + \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne + \else\ifnum \tabu@stop=\z@ \tabu@nbcols + \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols + \else \tabu@stop + \fi\fi\fi + \advance\tabu@start \m@ne + \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi +}% \tabu@start@stop +%% Numbers: siunitx S columns (and \tabudecimal) ------------------- +\def\tabu@tabudecimal #1{% + \def\tabu@decimal{#1}\@temptokena{}% + \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces + \tabu@scandecimal +}% \tabu@tabudecimal +\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} +\def\tabu@skipdecimal#1{#1\tabu@scandecimal} +\def\tabu@getdecimal@ignorespaces{% + \ifcase 0\ifx\tabu@temp\ignorespaces\else + \ifx\tabu@temp\@sptoken1\else + 2\fi\fi\relax + \let\tabu@getdecimal@ \tabu@getdecimal + \expandafter\tabu@skipdecimal + \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal + \else \expandafter\tabu@skipdecimal + \fi +}% \tabu@getdecimal@ignorespaces +\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% + \tabu@scandecimal} +\def\do#1{% + \def\tabu@get@decimalspace#1{% + \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% +}\do{ } +\let\tabu@@tabudecimal \tabu@tabudecimal +\def\tabu@getdecimal{% + \ifcase 0\ifx 0\tabu@temp\else + \ifx 1\tabu@temp\else + \ifx 2\tabu@temp\else + \ifx 3\tabu@temp\else + \ifx 4\tabu@temp\else + \ifx 5\tabu@temp\else + \ifx 6\tabu@temp\else + \ifx 7\tabu@temp\else + \ifx 8\tabu@temp\else + \ifx 9\tabu@temp\else + \ifx .\tabu@temp\else + \ifx ,\tabu@temp\else + \ifx -\tabu@temp\else + \ifx +\tabu@temp\else + \ifx e\tabu@temp\else + \ifx E\tabu@temp\else + \ifx\tabu@cellleft\tabu@temp1\else + \ifx\ignorespaces\tabu@temp1\else + \ifx\@sptoken\tabu@temp2\else + 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \expandafter\tabu@get@decimal + \or \expandafter\tabu@skipdecimal + \or \expandafter\tabu@get@decimalspace + \else\expandafter\tabu@printdecimal + \fi +}% \tabu@getdecimal +\def\tabu@printdecimal{% + \edef\tabu@temp{\the\@temptokena}% + \ifx\tabu@temp\@empty\else + \ifx\tabu@temp\space\else + \expandafter\tabu@decimal\expandafter{\the\@temptokena}% + \fi\fi +}% \tabu@printdecimal +%% Verbatim inside X columns ---------------------------------------- +\def\tabu@verbatim{% + \let\verb \tabu@verb + \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd +}% \tabu@verbatim +\let\tabu@ltx@verb \verb +\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} +\def\tabu@fancyvrb {% + \def\tabu@FV@DefineCheckEnd ##1{% + \def\tabu@FV@DefineCheckEnd{% + ##1% + \let\FV@CheckEnd \tabu@FV@CheckEnd + \let\FV@@CheckEnd \tabu@FV@@CheckEnd + \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd + \edef\FV@EndScanning{% + \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% + \global\let\noexpand\FV@EnvironName\relax + \noexpand\next}% + \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% + }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} +}% \tabu@fancyvrb +\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} +\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} +\begingroup +\catcode`\[1 \catcode`\]2 +\@makeother\{ \@makeother\} + \edef\x[\endgroup + \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% + ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} +\def\tabu@FV@ListProcessLine #1{% + \hbox {%to \hsize{% + \kern\leftmargin + \hbox {%to \linewidth{% + \FV@LeftListNumber + \FV@LeftListFrame + \FancyVerbFormatLine{#1}\hss +%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) +%% \FV@RightListFrame}% + \FV@RightListFrame + \FV@RightListNumber}% +%% DG/SR modification end + \hss}} +%% \savetabu -------------------------------------------------------- +\newcommand*\savetabu[1]{\noalign{% + \tabu@sanitizearg{#1}\tabu@temp + \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else + \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}% + \ifdefined\tabu@restored \expandafter\let + \csname tabu@saved@\tabu@temp \endcsname \tabu@restored + \else {\tabu@save}% + \fi + \fi}% +}% \savetabu +\def\tabu@save {% + \toks0\expandafter{\tabu@saved@}% + \iftabu@negcoef + \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% + \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi + \toks1\expandafter{\tabu@savedpream}% + \toks2\expandafter{\tabu@savedpreamble}% + \let\@preamble \relax + \let\tabu@savedpream \relax \let\tabu@savedparams \relax + \edef\tabu@preamble{% + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \edef\tabu@usetabu{% + \def\@preamble {\noexpand\the\toks2}% + \tabu@target \the\tabu@target \relax + \tabucolX \the\tabucolX \relax + \tabu@nbcols \the\tabu@nbcols \relax + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \let\tabu@aligndefault \relax \let\@sharp \relax + \edef\@tempa{\noexpand\tabu@s@ved + {\tabu@usetabu} + {\tabu@preamble} + {\the\toks1}}\@tempa + \tabu@message@save +}% \tabu@save +\long\def\tabu@s@ved #1#2#3{% + \def\tabu@usetabu{#1}% + \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% + \ifodd ##1% \usetabu + \tabu@measuringfalse \tabu@spreadfalse % Just in case... + \gdef\tabu@usetabu {% + \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi + \global\let\tabu@usetabu \@undefined + \def\@halignto {to\tabu@target}% + #1% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \else % \preamble + \gdef\tabu@preamble {% + \global\let\tabu@preamble \@undefined + #2% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \fi + #3}% +}% \tabu@s@ved +\def\tabu@aligndefault@text {\tabu@aligndefault}% +\def\tabu@warn@usetabu {\PackageWarning{tabu} + {Specifying a target with \string\usetabu\space is useless + \MessageBreak The target cannot be changed!}} +\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} +\def\tabu@savewarn#1#2{\PackageInfo{tabu} + {User-name `#1' already used for \string\savetabu + \MessageBreak #2}}% +\def\tabu@saveerr#1{\PackageError{tabu} + {User-name `#1' is unknown for \string\usetabu + \MessageBreak I cannot restore an unknown preamble!}\@ehd} +%% \rowfont --------------------------------------------------------- +\newskip \tabu@cellskip +\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi + {\ifnum0=`}\fi \tabu@row@font} +\newcommand*\tabu@row@font[2][]{% + \ifnum7=\currentgrouptype + \global\let\tabu@@cellleft \tabu@cellleft + \global\let\tabu@@cellright \tabu@cellright + \global\let\tabu@@celllalign \tabu@celllalign + \global\let\tabu@@cellralign \tabu@cellralign + \global\let\tabu@@rowfontreset\tabu@rowfontreset + \fi + \global\let\tabu@rowfontreset \tabu@rowfont@reset + \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% + \ifcsname tabu@cell@#1\endcsname % row alignment + \csname tabu@cell@#1\endcsname \fi + \ifnum0=`{\fi}% end of group / noalign group +}% \rowfont +\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% +\def\tabu@rowfont@reset{% + \global\let\tabu@rowfontreset \tabu@@rowfontreset + \global\let\tabu@cellleft \tabu@@cellleft + \global\let\tabu@cellright \tabu@@cellright + \global\let\tabu@cellfont \@empty + \global\let\tabu@celllalign \tabu@@celllalign + \global\let\tabu@cellralign \tabu@@cellralign +}% \tabu@@rowfontreset +\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl +%% \tabu@prepnext@tok ----------------------------------------------- +\newif \iftabu@cellright +\def\tabu@prepnext@tok{% + \ifnum \count@<\z@ % + \@tempcnta \@M % + \tabu@nbcols\z@ + \let\tabu@fornoopORI \@fornoop + \tabu@cellrightfalse + \else + \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left + \advance \tabu@nbcols \@ne + \iftabu@cellright % before-previous token is right and is finished + \tabu@cellrightfalse % + \tabu@righttok + \fi + \tabu@lefttok + \or % (case 1) previous token is right + \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop + \else % special column: do not change the token + \iftabu@cellright % before-previous token is right + \tabu@cellrightfalse + \tabu@righttok + \fi + \fi % \ifcase + \fi + \tabu@prepnext@tokORI +}% \tabu@prepnext@tok +\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} +\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% + \ifx \in@#2\else + \let\@fornoop \tabu@fornoopORI + \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% + \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% + \expandafter\prepnext@tok + \fi +}% \tabu@lastnoop +\def\tabu@righttok{% + \advance \count@ \m@ne + \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% + \advance \count@ \@ne +}% \tabu@righttok +\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign + \the\toks\count@ \tabu@cellleft}% after because of $ +}% \tabu@lefttok +%% Neutralisation of glues ------------------------------------------ +\let\tabu@cellleft \@empty +\let\tabu@cellright \@empty +\tabu@celllalign@def{\tabu@cellleft}% +\let\tabu@cellralign \@empty +\def\tabu@cell@align #1#2#3{% + \let\tabu@maybesiunitx \toks@ \tabu@celllalign + \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% + \toks@\expandafter{\tabu@cellralign #2}% + \xdef\tabu@cellralign{\the\toks@}% + \toks@\expandafter{\tabu@cellleft #3}% + \xdef\tabu@cellleft{\the\toks@}% +}% \tabu@cell@align +\def\tabu@cell@l{% force alignment to left + \tabu@cell@align + {\tabu@removehfil \raggedright \tabu@cellleft}% left + {\tabu@flush1\tabu@ignorehfil}% right + \raggedright +}% \tabu@cell@l +\def\tabu@cell@c{% force alignment to center + \tabu@cell@align + {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \centering +}% \tabu@cell@c +\def\tabu@cell@r{% force alignment to right + \tabu@cell@align + {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} + \tabu@ignorehfil + \raggedleft +}% \tabu@cell@r +\def\tabu@cell@j{% force justification (for p, m, b columns) + \tabu@cell@align + {\tabu@justify\tabu@cellleft} + {} + \tabu@justify +}% \tabu@cell@j +\def\tabu@justify{% + \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip + \parfillskip\@flushglue +}% \tabu@justify +%% ragged2e settings +\def\tabu@cell@L{% force alignment to left (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedRight \tabu@cellleft} + {\tabu@flush 1\tabu@ignorehfil} + \RaggedRight +}% \tabu@cell@L +\def\tabu@cell@C{% force alignment to center (ragged2e) + \tabu@cell@align + {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \Centering +}% \tabu@cell@C +\def\tabu@cell@R{% force alignment to right (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} + \tabu@ignorehfil + \RaggedLeft +}% \tabu@cell@R +\def\tabu@cell@J{% force justification (ragged2e) + \tabu@cell@align + {\justifying \tabu@cellleft} + {} + \justifying +}% \tabu@cell@J +\def\tabu@flush#1{% + \iftabu@colortbl % colortbl uses \hfill rather than \hfil + \hskip \ifnum13<\currentgrouptype \stretch{#1}% + \else \ifdim#1pt<\p@ \tabu@cellskip + \else \stretch{#1} + \fi\fi \relax + \else % array.sty + \ifnum 13<\currentgrouptype + \hfil \hskip1sp \relax \fi + \fi +}% \tabu@flush +\let\tabu@hfil \hfil +\let\tabu@hfill \hfill +\let\tabu@hskip \hskip +\def\tabu@removehfil{% + \iftabu@colortbl + \unkern \tabu@cellskip =\lastskip + \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip + \else \tabu@cellskip \z@skip + \fi + \else + \ifdim\lastskip=1sp\unskip\fi + \ifnum\gluestretchorder\lastskip =\@ne + \hfilneg % \hfilneg for array.sty but not for colortbl... + \fi + \fi +}% \tabu@removehfil +\def\tabu@ignorehfil{\aftergroup \tabu@nohfil} +\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil + \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group +}% \tabu@nohfil +\def\tabu@colortblalignments {% if colortbl + \def\tabu@nohfil{% + \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group + \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... + \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local +}% \tabu@colortblalignments +%% Taking care of footnotes and hyperfootnotes ---------------------- +\long\def\tabu@footnotetext #1{% + \edef\@tempa{\the\tabu@footnotes + \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% + \global\tabu@footnotes\expandafter{\@tempa {#1}}}% +\long\def\tabu@xfootnotetext [#1]#2{% + \global\tabu@footnotes\expandafter{\the\tabu@footnotes + \footnotetext [{#1}]{#2}}} +\let\tabu@xfootnote \@xfootnote +\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} +\long\def\tabu@Hy@xfootnote [#1]{% + \begingroup + \value\@mpfn #1\relax + \protected@xdef \@thefnmark {\thempfn}% + \endgroup + \@footnotemark \tabu@Hy@ftntxt {#1}% +}% \tabu@Hy@xfootnote +\long\def\tabu@Hy@ftntxt #1#2{% + \edef\@tempa{% + \the\tabu@footnotes + \begingroup + \value\@mpfn #1\relax + \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% + \expandafter \noexpand \expandafter + \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% + }% + \global\tabu@footnotes\expandafter{\@tempa {#2}% + \endgroup}% +}% \tabu@Hy@ftntxt +\long\def\tabu@Hy@footnotetext #1#2{% + \H@@footnotetext{% + \ifHy@nesting + \hyper@@anchor {#1}{#2}% + \else + \Hy@raisedlink{% + \hyper@@anchor {#1}{\relax}% + }% + \def\@currentHref {#1}% + \let\@currentlabelname \@empty + #2% + \fi + }% +}% \tabu@Hy@footnotetext +%% No need for \arraybackslash ! ------------------------------------ +\def\tabu@latextwoe {% +\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@centering \centering \arraybackslash +\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash +\tabu@temp \tabu@raggedright \raggedright \arraybackslash +}% \tabu@latextwoe +\def\tabu@raggedtwoe {% +\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@Centering \Centering \arraybackslash +\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash +\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash +\tabu@temp \tabu@justifying \justifying \arraybackslash +}% \tabu@raggedtwoe +\def\tabu@normalcrbackslash{\let\\\@normalcr} +\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% + \expandafter\tabu@normalcrbackslash \@trivlist}} +%% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- +\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} +\def\tabu@beginfbox {\bgroup \kern\fboxsep + \bgroup\aftergroup\tabu@endfbox} +\def\tabu@endfbox {\kern\fboxsep\egroup\egroup + \@frameb@x\relax} +\def\tabu@color@b@x #1#2{\leavevmode \bgroup + \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% + \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox +}% \tabu@color@b@x +\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup + \aftergroup\tabu@endcolor@b@x \set@color} +\def\tabu@endcolor@b@x {\kern\fboxsep \egroup + \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ + \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ + \tabu@docolor@b@x \egroup +}% \tabu@endcolor@b@x +%% Corrections (arydshln, delarray, colortbl) ----------------------- +\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray + \iftabu@colortbl + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \def\tabu@endarray{% + \crcr \egroup \egroup % + \@arrayright % + \gdef\@preamble{}\CT@end}% + \fi + \else + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \PackageWarning{tabu} + {\string\@arrayright\space is missing from the + \MessageBreak definition of \string\endarray. + \MessageBreak Compatibility with delarray.sty is broken.}% + \fi\fi +}% \tabu@fix@arrayright +\def\tabu@adl@xarraydashrule #1#2#3{% + \ifnum\@lastchclass=\adl@class@start\else + \ifnum\@lastchclass=\@ne\else + \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) + \adl@leftrulefalse \fi\fi % must be treated the same + \fi + \ifadl@zwvrule\else \ifadl@inactive\else + \@addtopreamble{\vrule\@width\arrayrulewidth + \@height\z@ \@depth\z@}\fi \fi + \ifadl@leftrule + \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% + {\number#1}#3}% + \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% + {\number#2}#3} + \fi +}% \tabu@adl@xarraydashrule +\def\tabu@adl@act@endpbox {% + \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox + \egroup \egroup + \adl@colhtdp \box\adl@box \hfil +}% \tabu@adl@act@endpbox +\def\tabu@adl@fix {% + \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln + \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln + \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln + \let\@preamerror \@preamerr % arydshln +}% \tabu@adl@fix +%% Correction for longtable' \@startbox definition ------------------ +%% => \everypar is ``missing'' : TeX should be in vertical mode +\def\tabu@LT@startpbox #1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \everypar{% + \vrule \@height \ht\@arstrutbox \@width \z@ + \everypar{}}% +}% \tabu@LT@startpbox +%% \tracingtabu and the package options ------------------ +\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} +\DeclareOption{linegoal}{% + \AtEndOfPackage{% + \RequirePackage{linegoal}[2010/12/07]% + \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX +}} +\DeclareOption{scantokens}{\tabuscantokenstrue} +\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} +\def\tracingtabu {\begingroup\@ifnextchar=% + {\afterassignment\tabu@tracing\count@} + {\afterassignment\tabu@tracing\count@1\relax}} +\def\tabu@tracing{\expandafter\endgroup + \expandafter\tabu@tr@cing \the\count@ \relax +}% \tabu@tracing +\def\tabu@tr@cing #1\relax {% + \ifnum#1>\thr@@ \let\tabu@tracinglines\message + \else \let\tabu@tracinglines\@gobble + \fi + \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG + \def\tabu@mkarstrut {\tabu@DBG@arstrut}% + \tabustrutrule 1.5\p@ + \else \let\tabu@DBG \@gobble + \def\tabu@mkarstrut {\tabu@arstrut}% + \tabustrutrule \z@ + \fi + \ifnum#1>\@ne \let\tabu@debug \message + \else \let\tabu@debug \@gobble + \fi + \ifnum#1>\z@ + \let\tabu@message \message + \let\tabu@tracing@save \tabu@message@save + \let\tabu@starttimer \tabu@pdftimer + \else + \let\tabu@message \@gobble + \let\tabu@tracing@save \@gobble + \let\tabu@starttimer \relax + \fi +}% \tabu@tr@cing +%% Setup \AtBeginDocument +\AtBeginDocument{\tabu@AtBeginDocument} +\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined + \ifdefined\arrayrulecolor \tabu@colortbltrue % + \tabu@colortblalignments % different glues are used + \else \tabu@colortblfalse \fi + \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi + \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi + \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ + \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % + \expandafter\ifx + \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax + \tabu@siunitxtrue + \else \let\tabu@maybesiunitx \@firstofone % + \let\tabu@siunitx \tabu@nosiunitx + \tabu@siunitxfalse + \fi + \ifdefined\adl@array % + \else \let\tabu@adl@fix \relax + \let\tabu@adl@endtrial \@empty \fi + \ifdefined\longtable % + \else \let\longtabu \tabu@nolongtabu \fi + \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi + \csname\ifcsname ifHy@hyperfootnotes\endcsname % + ifHy@hyperfootnotes\else iffalse\fi\endcsname + \let\tabu@footnotetext \tabu@Hy@ftntext + \let\tabu@xfootnote \tabu@Hy@xfootnote \fi + \ifdefined\FV@DefineCheckEnd% + \tabu@fancyvrb \fi + \ifdefined\color % + \let\tabu@color \color + \def\tabu@leavevmodecolor ##1{% + \def\tabu@leavevmodecolor {\leavevmode ##1}% + }\expandafter\tabu@leavevmodecolor\expandafter{\color}% + \else + \let\tabu@color \tabu@nocolor + \let\tabu@leavevmodecolor \@firstofone \fi + \tabu@latextwoe + \ifdefined\@raggedtwoe@everyselectfont % + \tabu@raggedtwoe + \else + \let\tabu@cell@L \tabu@cell@l + \let\tabu@cell@R \tabu@cell@r + \let\tabu@cell@C \tabu@cell@c + \let\tabu@cell@J \tabu@cell@j \fi + \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% + \ifin@ \let\tabu@endarray \endarray + \else \tabu@fix@arrayright \fi% + \everyrow{}% +}% \tabu@AtBeginDocument +\def\tabu@warn@cellspace{% + \PackageWarning{tabu}{% + Package cellspace has some limitations + \MessageBreak And redefines some macros of array.sty. + \MessageBreak Please use \string\tabulinesep\space to control + \MessageBreak vertical spacing of lines inside tabu environment}% +}% \tabu@warn@cellspace +%% tabu Package initialisation +\tabuscantokensfalse +\let\tabu@arc@G \relax +\let\tabu@drsc@G \relax +\let\tabu@evr@G \@empty +\let\tabu@rc@G \@empty +\def\tabu@ls@G {\tabu@linestyle@}% +\let\tabu@@rowfontreset \@empty % +\let\tabu@@celllalign \@empty +\let\tabu@@cellralign \@empty +\let\tabu@@cellleft \@empty +\let\tabu@@cellright \@empty +\def\tabu@naturalXmin {\z@} +\def\tabu@naturalXmax {\z@} +\let\tabu@rowfontreset \@empty +\def\tabulineon {4pt}\let\tabulineoff \tabulineon +\tabu@everyrowtrue +\ifdefined\pdfelapsedtime % + \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% +\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax +\fi +\tracingtabu=\z@ +\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ +\tabulinestyle{} +\taburowcolors{} +\let\tabudefaulttarget \linewidth +\ProcessOptions* % \ProcessOptions* is quicker ! +\endinput +%% +%% End of file `tabu.sty'. diff --git a/PySpice/Spice/OpenSPICE/main.md b/PySpice/Spice/OpenSPICE/main.md new file mode 100644 index 00000000..053420fd --- /dev/null +++ b/PySpice/Spice/OpenSPICE/main.md @@ -0,0 +1,9 @@ +OpenSPICE is a lightweight, Python-native circuit simulator. It is bundled with +PySpice. As a result, to use OpenSPICE, replace any usage of PySpice.Spice.NgSpice.Shared +with PySpice.Spice.OpenSPICE.Shared in your PySpice code. Also, if you call +the simulator method in the Circuit class, be sure to provide "OpenSPICE" and not +"NgSpice" as the simulator argument. Other than that, pretty much all of your +PySpice code should work the same. + +One last detail: OpenSPICE does NOT support variable timestepping. Thus, be sure +to use a sufficiently small timestep value for accurate results. From f5061839a3b57f02a4aca5c2963dc4db6d8b1340 Mon Sep 17 00:00:00 2001 From: Roman Parise Date: Fri, 18 Nov 2022 15:23:48 -0800 Subject: [PATCH 113/115] Update documentation with mainpage --- PySpice/Spice/OpenSPICE/html/index.html | 9 ++++++--- PySpice/Spice/OpenSPICE/html/search/all_c.js | 15 ++++++++------- .../Spice/OpenSPICE/html/search/pages_0.js | 4 ++++ .../Spice/OpenSPICE/html/search/searchdata.js | 9 ++++++--- ...ice_1_1OpenSPICE_1_1RawFile_1_1RawFile.pdf | Bin 5729 -> 5729 bytes ...ce_1_1OpenSPICE_1_1RawFile_1_1Variable.pdf | Bin 5927 -> 5927 bytes ...ICE_1_1Shared_1_1OpenSPICECircuitError.pdf | Bin 6028 -> 6028 bytes ...ICE_1_1Shared_1_1OpenSPICECommandError.pdf | Bin 5843 -> 5843 bytes ..._1Spice_1_1OpenSPICE_1_1Shared_1_1Plot.pdf | Bin 5714 -> 5714 bytes ...imulation_1_1OpenSPICECircuitSimulator.pdf | Bin 5758 -> 5758 bytes ..._1OpenSPICE_1_1components_1_1Component.pdf | Bin 6012 -> 6012 bytes ...1_1OpenSPICE_1_1components_1_1Resistor.pdf | Bin 6014 -> 6014 bytes ...nSPICE_1_1eqnstr_1_1EqnStrOpPtStrategy.pdf | Bin 6120 -> 6120 bytes ...1OpenSPICE_1_1eqnstr_1_1EqnStrStrategy.pdf | Bin 6268 -> 6268 bytes ...E_1_1eqnstr_1_1EqnStrTransientStrategy.pdf | Bin 6196 -> 6196 bytes ...PICE_1_1netlist_1_1BehavISourceTextFmt.pdf | Bin 6700 -> 6700 bytes ...PICE_1_1netlist_1_1BehavVSourceTextFmt.pdf | Bin 6806 -> 6806 bytes ...nSPICE_1_1netlist_1_1CCCSSourceTextFmt.pdf | Bin 6323 -> 6323 bytes ...nSPICE_1_1netlist_1_1CCVSSourceTextFmt.pdf | Bin 6414 -> 6414 bytes ...enSPICE_1_1netlist_1_1CapacitorTextFmt.pdf | Bin 6382 -> 6382 bytes ...nSPICE_1_1netlist_1_1ExtISourceTextFmt.pdf | Bin 6320 -> 6320 bytes ...nSPICE_1_1netlist_1_1ExtVSourceTextFmt.pdf | Bin 6415 -> 6415 bytes ...OpenSPICE_1_1netlist_1_1ISourceTextFmt.pdf | Bin 6319 -> 6319 bytes ...penSPICE_1_1netlist_1_1InductorTextFmt.pdf | Bin 6446 -> 6446 bytes ...penSPICE_1_1netlist_1_1ResistorTextFmt.pdf | Bin 6330 -> 6330 bytes ...ice_1_1OpenSPICE_1_1netlist_1_1TextFmt.pdf | Bin 7686 -> 7686 bytes ...nSPICE_1_1netlist_1_1VCCSSourceTextFmt.pdf | Bin 6414 -> 6414 bytes ...nSPICE_1_1netlist_1_1VCVSSourceTextFmt.pdf | Bin 6414 -> 6414 bytes ...OpenSPICE_1_1netlist_1_1VSourceTextFmt.pdf | Bin 6410 -> 6410 bytes ...enSPICE_1_1solve_1_1OpPtSolverStrategy.pdf | Bin 6252 -> 6252 bytes ..._1OpenSPICE_1_1solve_1_1SolverStrategy.pdf | Bin 6420 -> 6420 bytes ...CE_1_1solve_1_1TransientSolverStrategy.pdf | Bin 6330 -> 6330 bytes PySpice/Spice/OpenSPICE/latex/index.tex | 5 +++++ PySpice/Spice/OpenSPICE/latex/refman.tex | 2 ++ 34 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 PySpice/Spice/OpenSPICE/html/search/pages_0.js create mode 100644 PySpice/Spice/OpenSPICE/latex/index.tex diff --git a/PySpice/Spice/OpenSPICE/html/index.html b/PySpice/Spice/OpenSPICE/html/index.html index 0a9f35d6..3543fdc5 100644 --- a/PySpice/Spice/OpenSPICE/html/index.html +++ b/PySpice/Spice/OpenSPICE/html/index.html @@ -5,7 +5,7 @@ -OpenSPICE: Main Page +OpenSPICE: OpenSPICE @@ -69,10 +69,13 @@
  • -
    -
    OpenSPICE Documentation
    +
    +
    OpenSPICE
    +

    OpenSPICE is a lightweight, Python-native circuit simulator. It is bundled with PySpice. As a result, to use OpenSPICE, replace any usage of PySpice.Spice.NgSpice.Shared with PySpice.Spice.OpenSPICE.Shared in your PySpice code. Also, if you call the simulator method in the Circuit class, be sure to provide "OpenSPICE" and not "NgSpice" as the simulator argument. Other than that, pretty much all of your PySpice code should work the same.

    +

    One last detail: OpenSPICE does NOT support variable timestepping. Thus, be sure to use a sufficiently small timestep value for accurate results.

    +