-
Notifications
You must be signed in to change notification settings - Fork 5
Python API
This module handles communication with a simulation server. The underlying protocol is described in https://github.com/NyanCAD/SimServer/blob/main/Simulator.capnp
Basic usage of this module:
con = await connect("localhost", simulator=Xyce)
fs = loadFiles(con, "test.cir")
res = fs.commands.run(["V(*)", "I(*)"])
print(await readAll(res))
For streaming plots, have a look at holoviews.streams.Buffer
and https://holoviews.org/user_guide/Streaming_Data.html.
async def connect(host, port=5923, simulator=Ngspice, autostart=True)
Connect to a simulation server at the given host:port
,
which should be a simulator
such as Ngspice
or Xyce
.
If host
is set to "localhost" and no server is running,
we will attempt to start one automatically,
unless autostart=False
.
def loadFiles(sim, *names)
Load the specified filenames into the simulation server. The first file is the entrypoint for the simulator. Returns a handle to run simulation commands on.
For in-memory data, directly call sim.loadFiles
.
The data should be of the form [{"name": name, "contents": contents}]
For files already present on the simulator use sim.loadPath
.
async def read(response, io=stdout)
Read one chunk from a simulation command
async def stream(response,
streamdict,
newkey=lambda k: None,
io=stdout,
suffix="")
Stream simulation data into a Buffer (DataFrame)
streamdict
is a dictionary, where Buffers are added as needed.
This is done because some simulation commands have multiple results.
The newkey
function is called when a new Buffer is added.
Additionally, a custom "file-like" object can be passed for logging, and a suffix can be passed that is appended to the dictionary key.
async def readAll(response, io=stdout, suffix="")
Read all the simulation data from a simulation command.
This module communicates with CouchDB to fetch schematics, and generate SPICE netlists out of them.
Basic usage:
async with SchematicService("http://localhost:5984/offline") as service:
name = "top$top"
seq, docs = await service.get_all_schem_docs(name)
print(spice_netlist(name, docs))
The sequence number can later be used to efficiently update the netlist with update_schem
.
For live updates, use live_schem_docs
.
class StatusError(ClientError)
Non-200 response
class SchematicService(AbstractAsyncContextManager)
A context manager for getting schematics from a CouchDB database
def __init__(url)
Create a HTTP session with the given database URL
async def dbget(path, **kwargs)
Do a GET request to the given database endpoint and query parameters
async def dbpost(path, json, **kwargs)
Do a POST request to the given database endpoint, JSON data, and query parameters
async def dbput(path, json, **kwargs)
Do a PUT request to the given database endpoint, data, and query parameters
async def dbstream(path, json, **kwargs)
Stream data from the given database endpoint, JSON data, and query parameters
async def get_docs(name)
Get all the documents with the specified schematic ID
async def get_all_schem_docs(name)
Recursively get all the documents of the specified schematic and all the subcircuits inside it. And all the model definitions. Returns a sequence number and a dictionary of schematic ID: documents.
async def update_schem(seq, schem)
Take a sequence number and dictionary as returned by get_all_schem_docs
and update it.
async def live_schem_docs(name)
A live stream of updated dictionaries, as returned by get_all_schem_docs
async def save_simulation(name, data)
takes a schematic name and data as populated by
pyttoresque.simserver.stream
and saves it to the database.
Additional keys can be added as the designer sees fit.
def netlist(docs, models)
Turn a collection of documents as returned by get_docs
into a netlist structure.
Returns a dictionary of device ID: {port: net}
Usage:
async with SchematicService("http://localhost:5984/offline") as service:
name = "top$top"
seq, docs = await service.get_all_schem_docs(name)
print(netlist(docs[name], models))
def spice_netlist(name,
schem,
extra="",
corner='tt',
temp=None,
sim="NgSpice",
**params)
Generate a spice netlist, taking a dictionary of schematic documents, and the name of the top level schematic. It is possible to pass extra SPICE code and specify the simulation corner.
def ngspice_vectors(name, schem, path=())
Extract all the relevant vectors from the schematic, and format them in NgSpice syntax. Saves label/port net names, and vectors indicated on spice models.