{"id":21608151,"url":"https://github.com/thennen/pyltspice","last_synced_at":"2025-04-11T04:37:17.143Z","repository":{"id":98323993,"uuid":"155376545","full_name":"thennen/pyltspice","owner":"thennen","description":"Python functions for automating LTspice circuit simulations","archived":false,"fork":false,"pushed_at":"2025-03-06T07:55:26.000Z","size":601,"stargazers_count":8,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-11T04:37:13.074Z","etag":null,"topics":["circuit-simulation","electronics","python","spice"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thennen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-30T11:49:00.000Z","updated_at":"2025-04-03T18:05:01.000Z","dependencies_parsed_at":null,"dependency_job_id":"f3b1c5ec-297c-41ab-bd81-1e2aaf3ce27f","html_url":"https://github.com/thennen/pyltspice","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thennen%2Fpyltspice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thennen%2Fpyltspice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thennen%2Fpyltspice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thennen%2Fpyltspice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thennen","download_url":"https://codeload.github.com/thennen/pyltspice/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248345256,"owners_count":21088231,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["circuit-simulation","electronics","python","spice"],"created_at":"2024-11-24T20:36:28.219Z","updated_at":"2025-04-11T04:37:17.127Z","avatar_url":"https://github.com/thennen.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pyltspice\n\nThis is something I put together to automate and analyze my LTspice simulations in Python.\n\nThere are some existing libraries out there for this, such as [this](https://pypi.org/project/PyLTSpice/) more fully-featured project of the same name, but at the time I couldn't find one that worked for me.\n\nThis project takes a lightweight, functional approach. It is structured as a single module (.py file) that contains \na set of functions that output SPICE code, operate on netlists, dispatch LTspice, and parse the various output files.\n\n## Installation\n\nThis package is not registered on PyPI.  To install,\n\n1. Clone/download this repo\n3. Run `pip install .` inside the pyltspice directory.\n\nYou will also need to install LTspice (XVII or later).\n\n## How to use\n\n\n```python\nimport pyltspice\nfrom pyltspice import *\n```\n\n    Simulation files will be stored at C:\\Users\\t\\ltspice_sims.  To change, overwrite the simfolder variable\n    \n\nHere's how you can change the output directory:\n\n\n```python\npyltspice.simfolder = r'C:\\Users\\t\\ltspice_sims'\n```\n\nWe represent netlists in python as a list of strings.  You may write them directly in python or read them from a file using the function `netlist_fromfile()`.\n\nI drew this very interesting example circuit in the LTspice GUI: \n\n\n\u003cimg src=\"docs/images/LCR.png\" width=300\u003e\n\nWe work with SPICE netlists, not the PCB manufacturing formats now in the export options of recent LTspice versions.  For those, you can get a SPICE netlist from the GUI using `View → Spice NETLIST`, then copy-paste the text.\n\nThe netlist for the circuit above is included in this repository, and its path is stored in the variable `netlist_path`\n\n\n```python\nnetlist = netlist_fromfile(netlist_path)\nnetlist\n```\n\n\n\n\n    ['* Example netlist',\n     'V1 in 0 PULSE(0 5 1m 1n 1n 10m)',\n     'R1 in N001 {R}',\n     'L1 N001 N002 {L}',\n     'C1 N002 0 {C}',\n     '.PARAM C=1e-6',\n     '.PARAM L=1e-3',\n     '.PARAM R=1',\n     '.tran 0 10m 0',\n     '.backanno',\n     '.end']\n\n\n\nThese netlists can be passed to the function `runspice()`, which writes the netlist to a file, executes it with LTspice,\nreads the output binary file and returns the simulation results as a dictionary.\n\n\n\n```python\ndata = runspice(netlist)\n```\n\n    Writing C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.net\n    Executing C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.net\n    Reading C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.raw\n    Reading C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.log\n    Reading C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.net\n    \n\nThe returned data combines information from the output .log file and the binary (.raw) file, and also includes the netlist and other metadata.\n\nHere's what it looks like:\n\n\n```python\n# pandas used here just for prettier printing\nimport pandas as pd\npd.Series(data)\n```\n\n\n\n\n    filepath          C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_...\n    Title                                             * Example netlist\n    Date                                       Tue Sep  3 16:19:37 2024\n    Plotname                                         Transient Analysis\n    Flags                                                  real forward\n    No. Variables                                                     8\n    No. Points                                                      932\n    Offset                                       0.0000000000000000e+00\n    Command                       Linear Technology Corporation LTspice\n    time              [0.0, 0.001, 0.0010000001606947238, 0.00100000...\n    V(in)             [0.0, 0.0, 0.8034736, 1.6069472, 3.1470428, 5....\n    V(n001)           [0.0, 0.0, 0.80347353, 1.606947, 3.1470416, 4....\n    V(n002)           [0.0, 0.0, 8.4442574e-12, 5.3361017e-11, 3.171...\n    I(C1)             [0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\n    I(L1)             [0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\n    I(R1)             [0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\n    I(V1)             [0.0, 0.0, -7.907755e-08, -3.191806e-07, -1.13...\n    netlist           [* Example netlist, V1 in 0 PULSE(0 5 1m 1n 1n...\n    C                                                          0.000001\n    L                                                             0.001\n    R                                                               1.0\n    sim_time                                                      0.007\n    solver                                                       Normal\n    method                                                modified trap\n    WARNING                                                        None\n    sim_time_total                                             0.414094\n    dtype: object\n\n\n\nNote that there is some overhead to do the simulation including the file IO:\n\n\n```python\ndt = data['sim_time_total'] - data['sim_time']\nprint(f'Extra time needed: {dt:.3f} s')\n```\n\n    Extra time needed: 0.407 s\n    \n\nRepeated runs of the same netlist will use the already existing result, which will be faster.\n\n\n```python\ndata = runspice(netlist)\n```\n\n    Reading the previous result of a matching simulation from disk\n    Reading C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.raw\n    Reading C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.log\n    Reading C:\\Users\\t\\ltspice_sims\\2024-09-03_161937_288_Example_netlist.net\n    \n\nPlot the results\n\n\n```python\n%matplotlib inline\nfrom matplotlib import pyplot as plt\nt = data['time']\nI = data['I(R1)']\nplt.figure(figsize=(4,2))\nplt.plot(t * 1e3, I * 1e3)\nplt.xlabel('Time [ms]')\nplt.ylabel('Current [mA]');\n```\n\n\n    \n![png](docs/images/output_21_0.png)\n    \n\n\nIf you are annoyed by the print statements, you can deactivate them like this:\n\n\n```python\npyltspice.verbose = False\n```\n\nFrom here, you *could* just modify the netlists directly through list and string operations.\n\nBut we also have a set of python functions that evaluate to spice code (strings).  These should be a little more convenient than writing the spice directly.  Only some of the common spice commands are implemented currently, but you are welcome to extend it.\n\nFor example:\n\n\n```python\nresistor(num=1, cathode=0, anode='N001', val=300)\n```\n\n\n\n\n    'R1 0 N001 300'\n\n\n\n\n```python\nsine(freq=1e3, amp=2, delay=1e-3)\n```\n\n\n\n\n    'SINE(0 2 1000.0 0.001 0 0 )'\n\n\n\nThere are also functions for inserting new commands into existing netlists.\n\nThe main function to use is `netchange()`, which takes a netlist as the first argument and incorporates more lines passed as additional arguments. For each input line, it decides whether to add a new line to the netlist or to overwrite an existing line.  You can pass it individual lines as strings,  partial netlists as lists of strings, or both.\n\nInput netlists are never modified.  Rather, new netlists are always returned by the functions.\n\nFor example, to change a parameter,\n\n\n```python\nnetchange(netlist, R=3.3)\n```\n\n\n\n\n    ['* Example netlist',\n     'V1 in 0 PULSE(0 5 1m 1n 1n 10m)',\n     'R1 in N001 {R}',\n     'L1 N001 N002 {L}',\n     'C1 N002 0 {C}',\n     '.PARAM C=1e-6',\n     '.PARAM L=1e-3',\n     '.PARAM R=3.3',\n     '.tran 0 10m 0',\n     '.backanno',\n     '.end']\n\n\n\nto add a circuit element,\n\n\n```python\nnetchange(netlist, resistor(2, 'in', 0, 50))\n```\n\n\n\n\n    ['* Example netlist',\n     'V1 in 0 PULSE(0 5 1m 1n 1n 10m)',\n     'R1 in N001 {R}',\n     'R2 in 0 50',\n     'L1 N001 N002 {L}',\n     'C1 N002 0 {C}',\n     '.PARAM C=1e-6',\n     '.PARAM L=1e-3',\n     '.PARAM R=1',\n     '.tran 0 10m 0',\n     '.backanno',\n     '.end']\n\n\n\nYou can add as many lines as you want:\n\n\n```python\nnewnet = netchange(netlist,\n                      '* test',\n                      capacitor(1, 'N003', 0, '{C}'),\n                      voltage_source(2, 'N002', 'N003', pulse(0, 4, 1e-9, 1e-3, 1e-9, delay=2e-3)),\n                      transient(0, 5e-3),\n                      L=2e-3,\n                      C=2e-6\n                      )\n\nprint('\\n'.join(newnet))\nnewdata = runspice(newnet)\n\nt = newdata['time']\nI = newdata['I(R1)']\nplt.figure(figsize=(4,2))\nplt.plot(t * 1e3, I * 1e3)\nplt.xlabel('Time [ms]')\nplt.ylabel('Current [mA]');\n```\n\n    * test\n    V1 in 0 PULSE(0 5 1m 1n 1n 10m)\n    V2 N002 N003 PULSE(0 4 0.002 1e-09 1e-09 0.001 0.003000002 )\n    R1 in N001 {R}\n    L1 N001 N002 {L}\n    C1 N003 0 {C}\n    .PARAM C=2e-06\n    .PARAM L=0.002\n    .PARAM R=1\n    .tran 0 0.005 0 0.0001\n    .backanno\n    .end\n    \n\n\n    \n![png](docs/images/output_33_1.png)\n    \n\n\nNow we can automate our simulation runs and get back a useful data structure for further analysis.  \n\nFor example, here we vary all the parameters by ±50%:\n\n\n```python\ndatalist = []\nfor name, value in get_params(netlist).items():\n    for v in np.linspace(0.5 * value, 1.5 * value, 5):\n        data = runspice(netchange(netlist, param(name, v)));\n        datalist.append(data)\n```\n\n\n```python\npd.DataFrame(datalist)[['R', 'L', 'C', 'sim_time', 'time', 'I(R1)']]\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003eR\u003c/th\u003e\n      \u003cth\u003eL\u003c/th\u003e\n      \u003cth\u003eC\u003c/th\u003e\n      \u003cth\u003esim_time\u003c/th\u003e\n      \u003cth\u003etime\u003c/th\u003e\n      \u003cth\u003eI(R1)\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e5.000000e-07\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e7.500000e-07\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.014\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.250000e-06\u003c/td\u003e\n      \u003ctd\u003e0.009\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.500000e-06\u003c/td\u003e\n      \u003ctd\u003e0.009\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00050\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.009\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000000229959374, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 3.2065541e-09, 6.207098e-09, 1.5922...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e6\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00075\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.009\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.001000000160694725, 0.001000000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 1.0543673e-07, 4.255741e-07, 1.5150...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e7\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.1918057e-07, 1.1362...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e8\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00125\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.007\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.001000000160694725, 0.001000000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 6.326204e-08, 2.5534447e-07, 9.0901...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e9\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00150\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947245, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 5.2718367e-08, 2.1278707e-07, 7.575...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e10\u003c/th\u003e\n      \u003ctd\u003e0.50\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.001000000160694724, 0.001000000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907756e-08, 3.1918063e-07, 1.1362...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e11\u003c/th\u003e\n      \u003ctd\u003e0.75\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.001000000160694725, 0.001000000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e12\u003c/th\u003e\n      \u003ctd\u003e1.00\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.007\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947238, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.191806e-07, 1.13626...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e13\u003c/th\u003e\n      \u003ctd\u003e1.25\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947247, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.1918057e-07, 1.1362...\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e14\u003c/th\u003e\n      \u003ctd\u003e1.50\u003c/td\u003e\n      \u003ctd\u003e0.00100\u003c/td\u003e\n      \u003ctd\u003e1.000000e-06\u003c/td\u003e\n      \u003ctd\u003e0.008\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.001, 0.0010000001606947253, 0.00100000...\u003c/td\u003e\n      \u003ctd\u003e[0.0, 0.0, 7.907755e-08, 3.1918057e-07, 1.1362...\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\n\n```python\nplt.figure(figsize=(4,2))\nplt.xlabel('Time [ms]')\nplt.ylabel('Current [mA]');\nfor data in datalist:\n    plt.plot(data['time'] * 1e3, data['I(R1)'] * 1e3)\nplt.xlim(0.9, 5)\n```\n\n\n\n\n    (0.9, 5.0)\n\n\n\n\n    \n![png](docs/images/output_37_1.png)\n    \n\n\n### Notes\n\nI would not call this production-ready.  If in doubt, use [PyLTSpice](https://pypi.org/project/PyLTSpice/).\n\nWe have had some success using multiprocessing to increase the speed when running many simulations, but that code is not included yet.\n\nError handling is not very sophisticated.  If you write an error in your netlist, sometimes python just hangs while it waits for LTspice to respond.  In this case, use task manager to end the SPICE Simulator.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthennen%2Fpyltspice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthennen%2Fpyltspice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthennen%2Fpyltspice/lists"}