Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/PySpice-org/PySpice

Simulate electronic circuit using Python and the Ngspice / Xyce simulators
https://github.com/PySpice-org/PySpice

circuit-simulation ngspice pyspice python python3 spice spice-simulator xyce

Last synced: about 2 months ago
JSON representation

Simulate electronic circuit using Python and the Ngspice / Xyce simulators

Awesome Lists containing this project

README

        

PySpice : Simulate Electronic Circuit using Python and the Ngspice / Xyce Simulators

/* Minimal style sheet for the HTML output of Docutils. */
/* */
/* :Author: Günter Milde, based on html4css1.css by David Goodger */
/* :Id: $Id: minimal.css 9079 2022-06-19 14:00:56Z milde $ */
/* :Copyright: © 2015, 2021 Günter Milde. */
/* :License: Released under the terms of the `2-Clause BSD license`_, */
/* in short: */
/* */
/* Copying and distribution of this file, with or without modification, */
/* are permitted in any medium without royalty provided the copyright */
/* notice and this notice are preserved. */
/* */
/* This file is offered as-is, without any warranty. */
/* */
/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause */

/* This CSS3 stylesheet defines rules for Docutils elements without */
/* HTML equivalent. It is required to make the document semantics visible. */
/* */
/* .. _validates: http://jigsaw.w3.org/css-validator/validator$link */

/* titles */
p.topic-title,
p.admonition-title,
p.system-message-title {
font-weight: bold;
}
p.sidebar-title,
p.rubric {
font-weight: bold;
font-size: larger;
}
p.rubric {
color: maroon;
}
p.subtitle,
p.section-subtitle,
p.sidebar-subtitle {
font-weight: bold;
margin-top: -0.5em;
}
h1 + p.subtitle {
font-size: 1.6em;
}
a.toc-backref {
color: inherit;
text-decoration: none;
}

/* Warnings, Errors */
.system-messages h2,
.system-message-title,
span.problematic {
color: red;
}

/* Inline Literals */
.docutils.literal {
font-family: monospace;
white-space: pre-wrap;
}
/* do not wrap at hyphens and similar: */
.literal > span.pre { white-space: nowrap; }

/* Lists */

/* compact and simple lists: no margin between items */
.simple li, .simple ul, .simple ol,
.compact li, .compact ul, .compact ol,
.simple > li p, dl.simple > dd,
.compact > li p, dl.compact > dd {
margin-top: 0;
margin-bottom: 0;
}
/* Nested Paragraphs */
p:first-child { margin-top: 0; }
p:last-child { margin-bottom: 0; }
details > p:last-child { margin-bottom: 1em; }

/* Table of Contents */
.contents ul.auto-toc { /* section numbers present */
list-style-type: none;
}

/* Enumerated Lists */
ol.arabic { list-style: decimal }
ol.loweralpha { list-style: lower-alpha }
ol.upperalpha { list-style: upper-alpha }
ol.lowerroman { list-style: lower-roman }
ol.upperroman { list-style: upper-roman }

/* Definition Lists and Derivatives */
dt .classifier { font-style: italic }
dt .classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
/* Field Lists and similar */
/* bold field name, content starts on the same line */
dl.field-list,
dl.option-list,
dl.docinfo {
display: flow-root;
}
dl.field-list > dt,
dl.option-list > dt,
dl.docinfo > dt {
font-weight: bold;
clear: left;
float: left;
margin: 0;
padding: 0;
padding-right: 0.2em;
}
/* Offset for field content (corresponds to the --field-name-limit option) */
dl.field-list > dd,
dl.option-list > dd,
dl.docinfo > dd {
margin-left: 9em; /* ca. 14 chars in the test examples, fit all Docinfo fields */
}
/* start nested lists on new line */
dd > dl:first-child,
dd > ul:first-child,
dd > ol:first-child {
clear: left;
}
/* start field-body on a new line after long field names */
dl.field-list > dd > *:first-child,
dl.option-list > dd > *:first-child
{
display: inline-block;
width: 100%;
margin: 0;
}

/* Bibliographic Fields (docinfo) */
dl.docinfo pre.address {
font: inherit;
margin: 0.5em 0;
}
dl.docinfo > dd.authors > p { margin: 0; }

/* Option Lists */
dl.option-list > dt { font-weight: normal; }
span.option { white-space: nowrap; }

/* Footnotes and Citations */

.footnote, .citation { margin: 1em 0; } /* default paragraph skip (Firefox) */
/* hanging indent */
.citation { padding-left: 2em; }
.footnote { padding-left: 1.7em; }
.footnote.superscript { padding-left: 1.0em; }
.citation > .label { margin-left: -2em; }
.footnote > .label { margin-left: -1.7em; }
.footnote.superscript > .label { margin-left: -1.0em; }

.footnote > .label + *,
.citation > .label + * {
display: inline-block;
margin-top: 0;
vertical-align: top;
}
.footnote > .backrefs + *,
.citation > .backrefs + * {
margin-top: 0;
}
.footnote > .label + p, .footnote > .backrefs + p,
.citation > .label + p, .citation > .backrefs + p {
display: inline;
vertical-align: inherit;
}

.backrefs { user-select: none; }
.backrefs > a { font-style: italic; }

/* superscript footnotes */
a[role="doc-noteref"].superscript,
.footnote.superscript > .label,
.footnote.superscript > .backrefs {
vertical-align: super;
font-size: smaller;
line-height: 1;
}
a[role="doc-noteref"].superscript > .fn-bracket,
.footnote.superscript > .label > .fn-bracket {
/* hide brackets in display but leave for copy/paste */
display: inline-block;
width: 0;
overflow: hidden;
}
[role="doc-noteref"].superscript + [role="doc-noteref"].superscript {
padding-left: 0.15em; /* separate consecutive footnote references */
/* TODO: unfortunately, "+" also selects with text between the references. */
}

/* Alignment */
.align-left {
text-align: left;
margin-right: auto;
}
.align-center {
text-align: center;
margin-left: auto;
margin-right: auto;
}
.align-right {
text-align: right;
margin-left: auto;
}
.align-top { vertical-align: top; }
.align-middle { vertical-align: middle; }
.align-bottom { vertical-align: bottom; }

/* reset inner alignment in figures and tables */
figure.align-left, figure.align-right,
table.align-left, table.align-center, table.align-right {
text-align: inherit;
}

/* Text Blocks */
.topic { margin: 1em 2em; }
.sidebar,
.admonition,
.system-message {
margin: 1em 2em;
border: thin solid;
padding: 0.5em 1em;
}
div.line-block { display: block; }
div.line-block div.line-block, pre { margin-left: 2em; }

/* Code line numbers: dropped when copying text from the page */
pre.code .ln { display: none; }
pre.code code:before {
content: attr(data-lineno); /* …, none) fallback not supported by any browser */
color: gray;
}

/* Tables */
table {
border-collapse: collapse;
}
td, th {
border: thin solid silver;
padding: 0 1ex;
}
.borderless td, .borderless th {
border: 0;
padding: 0;
padding-right: 0.5em /* separate table cells */
}

table > caption {
text-align: left;
margin-top: 0.2em;
margin-bottom: 0.2em;
}
table.captionbelow {
caption-side: bottom;
}

/* Document Header and Footer */
header { border-bottom: 1px solid black; }
footer { border-top: 1px solid black; }

/* Images are block-level by default in Docutils */
/* New HTML5 block elements: set display for older browsers */
img, header, footer, main, aside, nav, section, figure, video, details {
display: block;
}
/* inline images */
p img, p video, figure img, figure video {
display: inline;
}

/* CSS31_ style sheet for the output of Docutils HTML writers. */
/* Rules for easy reading and pre-defined style variants. */
/* */
/* :Author: Günter Milde, based on html4css1.css by David Goodger */
/* :Id: $Id: plain.css 9338 2023-04-08 21:08:47Z milde $ */
/* :Copyright: © 2015 Günter Milde. */
/* :License: Released under the terms of the `2-Clause BSD license`_, */
/* in short: */
/* */
/* Copying and distribution of this file, with or without modification, */
/* are permitted in any medium without royalty provided the copyright */
/* notice and this notice are preserved. */
/* */
/* This file is offered as-is, without any warranty. */
/* */
/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause */
/* .. _CSS3: https://www.w3.org/Style/CSS/ */

/* Document Structure */
/* ****************** */

/* "page layout" */
body {
margin: 0;
background-color: #dbdbdb;
--field-indent: 9em; /* default indent of fields in field lists */
}
main, footer, header {
line-height:1.6;
/* avoid long lines --> better reading */
/* optimum is 45…75 characters/line <http://webtypography.net/2.1.2> */
/* OTOH: lines should not be too short because of missing hyphenation, */
max-width: 50rem;
padding: 1px 2%; /* 1px on top avoids grey bar above title (mozilla) */
margin: auto;
}
main {
counter-reset: table figure;
background-color: white;
}
footer, header {
font-size: smaller;
padding: 0.5em 2%;
border: none;
}

/* Table of Contents */
ul.auto-toc > li > p {
padding-left: 1em;
text-indent: -1em;
}
nav.contents ul {
padding-left: 1em;
}
main > nav.contents ul ul ul ul:not(.auto-toc) {
list-style-type: '\2B29\ ';
}
main > nav.contents ul ul ul ul ul:not(.auto-toc) {
list-style-type: '\2B1D\ ';
}

/* Transitions */
hr.docutils {
width: 80%;
margin-top: 1em;
margin-bottom: 1em;
clear: both;
}

/* Paragraphs */

/* vertical space (parskip) */
p, ol, ul, dl, li,
div.line-block,
.footnote, .citation,
div > math,
table {
margin-top: 0.5em;
margin-bottom: 0.5em;
}

h1, h2, h3, h4, h5, h6,
dd, details > p:last-child {
margin-bottom: 0.5em;
}

/* Lists */
/* ===== */

/* Definition Lists */
/* Indent lists nested in definition lists */
dd > ul:only-child, dd > ol:only-child { padding-left: 1em; }

/* Description Lists */
/* styled like in most dictionaries, encyclopedias etc. */
dl.description {
display: flow-root;
}
dl.description > dt {
font-weight: bold;
clear: left;
float: left;
margin: 0;
padding: 0;
padding-right: 0.3em;
}
dl.description > dd:after {
display: table;
content: "";
clear: left; /* clearfix for empty descriptions */
}

/* Field Lists */

dl.field-list > dd,
dl.docinfo > dd {
margin-left: var(--field-indent); /* adapted in media queries or HTML */
}

/* example for custom field-name width */
dl.field-list.narrow > dd {
--field-indent: 5em;
}
/* run-in: start field-body on same line after long field names */
dl.field-list.run-in > dd p {
display: block;
}

/* Bibliographic Fields */

/* generally, bibliographic fields use dl.docinfo */
/* but dedication and abstract are placed into divs */
div.abstract p.topic-title {
text-align: center;
}
div.dedication {
margin: 2em 5em;
text-align: center;
font-style: italic;
}
div.dedication p.topic-title {
font-style: normal;
}

/* disclosures */
details { padding-left: 1em; }
summary { margin-left: -1em; }

/* Text Blocks */
/* =========== */

/* Literal Blocks */
pre.literal-block, pre.doctest-block,
pre.math, pre.code {
font-family: monospace;
}

/* Block Quotes and Topics */
bockquote { margin: 1em 2em; }
blockquote p.attribution,
.topic p.attribution {
text-align: right;
margin-left: 20%;
}

/* Tables */
/* ====== */

/* th { vertical-align: bottom; } */

table tr { text-align: left; }

/* "booktabs" style (no vertical lines) */
table.booktabs {
border: 0;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.booktabs * {
border: 0;
}
table.booktabs th {
border-bottom: thin solid;
}

/* numbered tables (counter defined in div.document) */
table.numbered > caption:before {
counter-increment: table;
content: "Table " counter(table) ": ";
font-weight: bold;
}

/* Explicit Markup Blocks */
/* ====================== */

/* Footnotes and Citations */
/* ----------------------- */

/* line on the left */
.footnote-list {
border-left: solid thin;
padding-left: 0.25em;
}

/* Directives */
/* ---------- */

/* Body Elements */
/* ~~~~~~~~~~~~~ */

/* Images and Figures */

/* let content flow to the side of aligned images and figures */
figure.align-left,
img.align-left,
video.align-left,
object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
figure.align-right,
img.align-right,
video.align-right,
object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
/* Stop floating sidebars, images and figures */
h1, h2, h3, h4, footer, header { clear: both; }

/* Numbered figures */
figure.numbered > figcaption > p:before {
counter-increment: figure;
content: "Figure " counter(figure) ": ";
font-weight: bold;
}

/* Admonitions and System Messages */
.caution p.admonition-title,
.attention p.admonition-title,
.danger p.admonition-title,
.error p.admonition-title,
.warning p.admonition-title,
div.error {
color: red;
}

/* Sidebar */
/* Move right. In a layout with fixed margins, */
/* it can be moved into the margin. */
aside.sidebar {
width: 30%;
max-width: 26em;
float: right;
clear: right;
margin-left: 1em;
margin-right: -1%;
background-color: #fffffa;
}

/* Code */
pre.code { padding: 0.7ex }
pre.code, code { background-color: #eeeeee }
/* basic highlighting: for a complete scheme, see */
/* https://docutils.sourceforge.io/sandbox/stylesheets/ */
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}

/* Math */
/* for math-output=MathML (for math-output=HTML, see math.css) */
math .boldsymbol {
font-weight: bold;
}
mstyle.mathscr, mi.mathscr {
font-family: STIX, XITSMathJax_Script, rsfs10,
"Asana Math", Garamond, cursive;
}

/* Epigraph */
/* Highlights */
/* Pull-Quote */
/* Compound Paragraph */
/* Container */

/* Inline Markup */
/* ============= */

sup, sub { line-height: 0.8; } /* do not add leading for lines with sup/sub */

/* Inline Literals */
/* possible values: normal, nowrap, pre, pre-wrap, pre-line */
/* span.docutils.literal { white-space: pre-wrap; } */

/* Hyperlink References */
a { text-decoration: none; }

/* External Targets */
/* span.target.external */
/* Internal Targets */
/* span.target.internal */
/* Footnote References */
/* a[role="doc-noteref"] */
/* Citation References */
/* a.citation-reference */

PySpice : Simulate Electronic Circuit using Python and the Ngspice / Xyce Simulators

PySpice license
PySpice python version


PySpice last version


Anaconda last version
Anaconda donwloads


PySpice build status @travis-ci.org


Quick Links


2024 Update


Disclaimer: PySpice is developed on my free time actually, so I could be busy with other tasks and less reactive.


The free Discourse forum was closed some time ago due to a lack of activity.
A HTML backup is stored in the directory pyspice-discourse-backup.


On Devel HEAD



  • fixed the ngspice library loading for recent cffi


  • fixed simulation aborting due to a message from newer ngspice


  • fixes for Spice parser


  • added support for Pint unit library


  • implemented SpiceLibrary


  • code cleanup but must check for typo...


An issue was found with NgSpice Shared, we must setlocale(LC_NUMERIC, "C"); see https://sourceforge.net/p/ngspice/bugs/490/

Overview

What is PySpice ?


PySpice is a Python module which interface Python to the Ngspice and Xyce circuit simulators.

Where is the Documentation ?


The documentation is available on the PySpice Home Page.


Note: This site is hosted on my own infrastructure, if the site seems done, please create an issue to notify me.

Where to get help or talk about PySpice ?


Thanks to Discourse, PySpice now has a Forum hosted at https://pyspice.discourse.group

What are the main features ?



  • support Ngspice and Xyce circuit simulators


  • support Linux, Windows and Mac OS X platforms


  • licensed under GPLv3 therms


  • implement an Ngspice shared library binding using CFFI which support external sources


  • implement (partial) SPICE netlist parser


  • implement an Oriented Object API to define circuit


  • export simulation output to Numpy arrays


  • plot using Matplotlib


  • handle units


  • work with Kicad schematic editor


  • implement a documentation generator


  • provides many examples


How to install it ?


Look at the installation section in the documentation.

Pull Request Recommendation


To make it easier to merge your pull request, you should divide your PR into smaller and easier-to-verify units.


Please do not make a pull requests with a lot of modifications which are difficult to check. If I merge
pull requests blindly then there is a high risk this software will become a mess quickly for everybody.

Credits


Authors: Fabrice Salvaire and contributors

News

V1.6.0 (development release)



  • KiCadTools a proof of concept module to read KiCad 6
    .kicad_sch schema file and compute the netlist. This module can
    be used to perform any kind of processings on a KiCad schema. It is
    actually hosted in the source but could become a standalone
    project.
    For PySpice, it provides a very flexible way to draft a
    circuit with the help of KiCad and then generate the netlist without
    using the netlist export feature of KiCad. And thus leverage the
    writing of fastidious cicruit.


V1.5.0 (production release) 2021-05-15



  • Support Ngspice up to version 34


  • Renamed custom dunders "__dunder__" to "CONSTANT" or "_private" class attributes


  • Fixed typo in documentation (thanks to endolith and brollb)


  • Add DC temperature sweep support #272 (thanks to Fatsie)


  • PWL support improvements #271 (thanks to Fatsie)


  • Assign units on creation of temperature-sweep vectors #263 (thanks to ARF1)


  • Prevent memory leaks by freeing ngspice command log #260 thanks to ARF1)


  • Performance optimization: dispatch multiple alter commands jointly #259 (thanks to ARF1)


  • Added spice library support #258 (thanks to Fatsie)


  • Allow to specify DC value for PWL #257 (thanks to Fatsie)


  • Support for .nodeset type initial condition #256 (thanks to Fatsie)


  • Fix accuracy problems #254 (thanks to sotw1957)


  • Changes to make it easier to use PySpice with a large archive of SPICE models medium diff #249 (thanks to xesscorp)


  • Netlist.py: Fix wrong method when joining parameters during netlist parse #245 (thanks to cyber-g)


  • Unit: add Pickle support


  • Add Parser code from #136 (thanks to jmgc) but not yet merged


  • Unit: add np.mean


V1.4.3 2020-07-04


A huge effort, thanks to @stuarteberg Stuart Berg, has been made to make Ngspice and PySpice
available on Anaconda (conda-forge) for the Window, OSX and Linux platforms. Thanks to the
conda-forge continuous integration platform, we can now run unit tests and the examples on theses
platforms automatically. Hope this will make the software more robust and easier to run !



  • PySpice is now available on Anaconda(conda-forge) as well as a wheel on PyPI


  • Added a post installation tool to download the Ngspice DLL on Windows and to check the installation.
    It should now simplify considerably the PySpice installation on Windows.


  • This tool can also download the examples and the Ngspice PDF manual.


  • On Linux and OSX, a Ngspice package is now available on Anaconda(conda-forge).
    Note that theses two platforms do not download a binary from Ngspice since a compiler can easily be installed on theses platforms.


  • Updated installation documentation for Linux, the main distributions now provide a ngspice shared package.


  • Added a front-end web site so as to keep older releases documentation available on the web.


  • fixed and rebuilt all examples (but mistakes could happen ...)


  • examples are now available as Python files and Jupyter notebooks
    (but some issues must be fixed, e.g. due to the way Jupyter handles Matplotlib plots)


  • support NgSpice 32 API (no change)


  • removed @substitution@ in PySpice/__init__.py, beacause it breaks pip install from git


  • fixed some logging spams


  • fixed NonLinearVoltageSource


  • fixed Unicode issue with °C (° is Extended ASCII)


  • fixed ffi_string_utf8 for UnicodeDecodeError


  • fixed logging formater for OSX (removed ANSI codes)


  • reworded "Invalid plot name" exception


  • removed diacritics in example filenames


  • cir2py has been converted to an entry point so as to work on all platforms


  • updated Matplotlib subplots in examples


  • added a unit example


  • added a NMOS example (thanks to cyber-g) cf. #221


V1.4.0 2020-05-05


This release is yanked due to broken Windows support.



  • fixed nasty issue with NgSpice shared for setlocale(LC_NUMERIC, "C"); cf. #172


  • fixed AC AC_MAG AC_PASAE SIN for new NgSpice syntax


  • fixed initial_state for VoltageControlledSwitch


  • fixed LosslessTransmissionLine #169


  • fixed docstrings for element shortcut methods (thanks to Kyle Dunn) #178


  • fixed parser for leading whitespace (thanks to Matt Huszagh) #182


  • fix for PyYAML newer API


  • support NgSpice 31 API (no change)


  • added check for CoupledInductor #157


  • added check-installation tool to help to fix broken installation


  • added pole-zero, noise, distorsion, transfer-function analyses (thanks to Peter Garrone) #191


  • added .measure support (thanks to ceprio) #160


  • added log_desk parameter to CircuitSimulator


  • added listing command method to NgSpiceShared


  • added Xyce Mosfet nfin #177


V1.3.2 2019-03-11



  • support Ngspice 30 and Xyce 6.10


  • fixed NgSpice and Xyce support on Windows 10


  • bug fixes


V1.2.0 2018-06-07



  • Initial support of the Xyce simulator. Xyce is an open source, SPICE-compatible,
    high-performance analog circuit simulator, capable of solving extremely large circuit problems
    developed at Sandia National Laboratories. Xyce will make PySpice suitable for industry and
    research use.


  • Fixed OSX support


  • Splitted G device


  • Implemented partially A XSPICE device


  • Implemented missing transmission line devices


  • Implemented high level current sources
    Notice: Some classes were renamed !


  • Implemented node kwarg e.g. circuit.Q(1, base=1, collector=2, emitter=3, model='npn')


  • Implemented raw spice pass through (see User FAQ)


  • Implemented access to internal parameters (cf. save @device[parameter])


  • Implemented check for missing ground node


  • Implemented a way to disable an element and clone netlist


  • Improved SPICE parser



  • Improved unit support:



    • Implemented unit prefix cast U_μV(U_mV(1)) to easily convert values


    • Added U_mV, ... shortcuts


    • Added Numpy array support to unit, see UnitValues Notice: this new feature could be buggy !!!


    • Rebased WaveForm to UnitValues




  • Fixed node order so as to not confuse users Now PySpice matches SPICE order for two ports elements !


  • Fixed device shortcuts in Netlist class


  • Fixed model kwarg for BJT Notice: it must be passed exclusively as kwarg !


  • Fixed subcircuit nesting


  • Outsourced documentation generator to Pyterate


  • Updated setup.py for wheel


V1.1.0 2017-09-06



  • Enhanced shared mode


  • Shared mode is now set as default on Linux


V1.0.0 2017-09-06



  • Bump version to v1.0.0 since it just works!


  • Support Windows platform using Ngspice shared mode


  • Fixed shared mode


  • Fixed and completed Spice parser : tested on example's libraries


V0.4.2



  • Fixed Spice parser for lower case device prefix.


V0.4.0 2017-07-31



  • Git repository cleanup: filtered generated doc and useless files so as to shrink the repository size.


  • Improved documentation generator: Implemented format for RST content and Tikz figure.


  • Improved unit support: It implements now the International System of Units.
    And we can now use unit helper like u_mV or compute the value of 1.2@u_kΩ / 2@u_mA.
    The relevant documentation is on this page.


  • Added the Simulation instance to the Analysis class.


  • Refactored simulation parameters as classes.


V0.3.2 2017-02-22



  • fixed CCCS and CCVS


V0.3.1 2017-02-22



  • fixed ngspice shared


V0.3.0 2015-12-08



  • Added an example to show how to use the NgSpice Shared Simulation Mode.


  • Completed the Spice netlist parser and added examples, we could now use a schematic editor
    to define the circuit. The program cir2py translates a circuit file to Python.


V0 2014-03-21


Started project