Skills Plugins MCP Prompt Model 博客 我的中心
Development #python #api

virtuoso

Bridge to remote Cadence Virtuoso via Python API. TRIGGER when user mentions: Virtuoso, Maestro, ADE, CIW, SKILL, layout, schematic, cellview, OCEAN, or any Cadence EDA operation.

DeepseekModel Curated skill Quality Excellent · 90 v1.0.0

Get

https://deepseekmodel.com/api/download.php?id=arcadia-1-virtuoso-bridge-lite-skills-virtuoso-skill-md&format=skill
Download .skill Standard format with system_prompt and model_config, ready for any agent framework
The actual content of the system_prompt field in the .skill file.
name virtuoso description Bridge to remote Cadence Virtuoso via Python API. TRIGGER when user mentions: Virtuoso, Maestro, ADE, CIW, SKILL, layout, schematic, cellview, OCEAN, or any Cadence EDA operation. Virtuoso Skill CRITICAL: Do NOT invent SKILL code or API calls from memory. Before writing any SKILL expression or calling any Python API function: Search references/ for the function name or keyword Check examples/ for a working example of the same operation Read the actual function signature ( help() for Python, references/*.md for SKILL) If the function is not documented in references or examples, it probably does not exist or has a different name. Never guess parameter names -- verify first. Mental Model You control a remote Cadence Virtuoso through virtuoso-bridge . Python runs locally; SKILL executes remotely in the Virtuoso CIW. SSH tunneling is automatic. Local (Python) Remote (Virtuoso) ┌──────────────────┐ SSH tunnel ┌──────────────────┐ │ VirtuosoClient │ ────────────► │ CIW (SKILL) │ │ │ │ │ │ • schematic.* │ │ • dbCreateInst │ │ • layout.* │ │ • schCreateWire │ │ • execute_skill │ │ • mae* │ │ • load_il │ │ • dbOpenCellView │ └──────────────────┘ └──────────────────┘ Three abstraction levels Level When to use Example Python API Schematic/layout editing — structured, safe client.schematic.create(lib, cell) Inline SKILL Maestro, CDF params, anything the API doesn't cover client.execute_skill('maeRunSimulation()') SKILL file Bulk operations, complex loops client.load_il("my_script.il") Always use the highest level that works. Drop to a lower level only when needed. Never guess function names. If the function isn't in the examples below, read the relevant references/ file before writing the call. Fabricating a wrong name wastes time debugging in CIW. Five domains Domain What it does Python package API docs Schematic Create/edit schematics, wire instances, add pins client.schematic.* references/schematic-python-api.md , references/schematic-skill-api.md Symbol Generate, edit, and read symbol views client.symbol.* references/symbol-python-api.md Layout Create/edit layout, add shapes/vias/instances client.layout.* references/layout-python-api.md , references/layout-skill-api.md Maestro Read/write ADE Assembler config, run simulations client.maestro.* references/maestro-python-api.md , references/maestro-skill-api.md Library Read/create/rename/delete libraries, bind technology client.library.* references/library-python-api.md Netlist (si) Batch netlist generation without Maestro simInitEnvWithArgs + si CLI See "Batch Netlist (si)" section below SKILL Finder Search SKILL function names and get detailed docs client.find_skill() , client.get_skill_more_info() references/skill-finder-python-api.md General File transfer, screenshots, raw SKILL, .il loading client.* See below Before you start Environment setup virtuoso-bridge is a Python CLI. Use uv + virtual environment — never install into the global Python. uv venv .venv && source .venv/bin/activate # Windows: source .venv/Scripts/activate uv pip install -e virtuoso-bridge-lite All virtuoso-bridge CLI commands and Python scripts must run inside the activated venv. Connection sequence (follow in order) Check .env — the bridge looks up .env in this order: --env FILE (CLI flag) → first parent .env that looks like a Virtuoso Bridge config (any VB_*_HOST role or VB_LOCAL_PORT ) → ~/.virtuoso-bridge/.env (user-level). If any of these exists, skip init . Only run virtuoso-bridge init when none exist — it creates ~/.virtuoso-bridge/.env (user-level, shared across projects). If the user already told you their SSH target, prefer virtuoso-bridge init user@host [-J user@jump] to fill the one-host model + ports in one step; otherwise plain virtuoso-bridge init writes a template. For split installations, verify VB_GUI_HOST owns CIW/X11, VB_DEPLOY_HOST receives generated files, VB_DAEMON_HOST is the tunnel endpoint, VB_SPECTRE_HOST runs standalone jobs, and VB_REMOTE_SCRATCH_ROOT is visible to every role that consumes deployed files. Unset roles fall back to VB_REMOTE_HOST . virtuoso-bridge start — starts the local bridge service and SSH tunnel. If status is degraded — load the exact setup line printed by start in Virtuoso CIW. As an opt-in alternative, run virtuoso-bridge list-windows --top-level --json , select one explicit CIW, then run virtuoso-bridge bootstrap --window WINDOW_ID ; bootstrap refuses non-CIW windows and accepts no arbitrary SKILL. virtuoso-bridge status — verify everything is healthy before proceeding. virtuoso-bridge windows — list all open Virtuoso windows (num + name). virtuoso-bridge eval 'EXPR' — run a one-line SKILL expression from the shell and print the full VirtuosoResult JSON. virtuoso-bridge eval --stdin — run multi-line SKILL from stdin; the CLI auto-wraps multiple forms in progn(...) and returns the last form. virtuoso-bridge load FILE.il — run a .il file in the live Virtuoso session; uploads the file automatically in SSH mode. virtuoso-bridge screenshot [ciw|current|N] [-o DIR|FILE] — screenshot a window. Default target is CIW; default output is the user artifact screenshots directory. virtuoso-bridge snapshot -o <dir> — dump the currently-focused maestro window to <dir>/<YYYYMMDD_HHMMSS>__<lib>__<cell>/ (state XMLs, SKILL probe output, per-point netlist + PSF results, .rdb ). This is the default way to capture Maestro state — no Python required. Use the Python API (below) only inside a multi-step pipeline. Then Check examples first : examples/01_virtuoso/ — don't reinvent from scratch. Open the window : client.open_window(lib, cell, view="layout") so the user sees what you're doing. Client basics Direct CLI SKILL execution For quick checks and one-off SKILL files, prefer the CLI over writing a Python wrapper. It uses the same bridge connection and avoids shell/Python/SKILL triple-quoting problems. # One-line expression -- full VirtuosoResult JSON on stdout virtuoso-bridge eval 'getCurrentTime()' # Multi-line SKILL -- auto-wrapped in progn when needed virtuoso-bridge eval --stdin << 'EOF' let ((libs) libs = mapcar(lambda((l) l~>name) ddGetLibList()) printf ( "found %d libraries\n" length(libs)) libs) EOF # Whole .il file -- uploaded automatically in SSH mode virtuoso-bridge load my_script.il Use Python only when the SKILL call is one step in a larger scripted workflow or when you need structured high-level APIs such as schematic/layout editors. Python client from virtuoso_bridge import VirtuosoClient client = VirtuosoClient.from_env() client.execute_skill( '...' ) # run SKILL expression client.fetch(expr, fields) # batch ~>slot extract (see below) client.fetch_one(expr, fields) # single-object ~>slot extract client.load_il( "my_script.il" ) # upload + load .il file client.upload_file(local_path, remote_path) # local → remote client.download_file(remote_path, local_path) # remote → local client.open_window(lib, cell, view= "layout" ) # open GUI window client.run_shell_command( "ls /tmp/" ) # run shell on remote client.list_windows() # list all open windows client.screenshot(target= "ciw" ) # screenshot to the user artifact directory client.screenshot(output= "output" , target= "ciw" ) # explicit repo-local output Batch attribute fetch: fetch() / fetch_one() execute_skill() is a raw-string in, raw-string out channel. For DFII objects it returns an opaque handle ( "db:0x2800ccbe" ) that's useless by itself — to get attributes you'd have to send another SKILL call per attribute, which is both verbose and slow (~100 ms per round-trip). fetch(expr, fields) does the right thing in one round-trip: sends mapcar(lambda((o) list(o~>f1 o~>f2 ...)) <expr>) , parses the SKILL s-expression response, and returns a list of Python dicts. # List of selected schematic objects in one call objs = client.fetch( "geGetSelSet()" , [ "objType" , "cellName" , "name" ]) # [{"objType": "inst", "cellName": "nch_mac", "name": "M1"}, # {"objType": "inst", "cellName": "pch_mac", "name": "M2"}, ...] print (objs[ 0 ][ "name" ]) # → 'M1' # All instances in the current schematic — 1 call, not N×fields insts = client.fetch( "geGetEditCellView()~>instances" , [ "name" , "cellName" , "libName" , "viewName" ], ) fetch_one(expr, fields) is the single-object variant — wraps in list(...) and returns one dict: cv = client.fetch_one( "geGetEditCellView()" , [ "libName" , "cellName" , "viewName" ]) # {"libName": "PLAYGROUND", "cellName": "AMP", "viewName": "schematic"} Value decoding (both methods): strings unquoted, nil → None , t → True , nested SKILL lists → nested Python lists, bare atoms (numbers / symbols) returned as strings so the caller can coerce ( int(d["fingers"]) ). Why not a client["fn"]() lazy-proxy style (à la skillbridge )? Lazy proxies look nicer syntactically but trigger one round-trip per attribute access — 100 selected objects × 3 fields = 300 ssh hops (~30 s). fetch does it all in one hop (~200 ms). If you need the REPL-style ergonomics, use skillbridge alongside this bridge — they coexist fine on the same Virtuoso session. CIW output vs return value execute_skill() returns the result to Python but does not print anything in the CIW window. This is by design — the bridge is a programmatic API, not an interactive REPL. # Return value only — CIW stays silent r = client.execute_skill( "1+2" ) # Python gets 3, CIW shows nothing # To also display in CIW, use printf explicitly r = client.execute_skill( r'let((v) v=1+2 printf("1+2 = %d\n" v) v)' ) # Python gets 3, CIW shows "1+2 = 3" Full example: examples/01_virtuoso/basic/00_ciw_output_vs_return.py Printing multi-line text to CIW Sending multiple printf in a single execute_skill() loses newlines — the CIW concatenates everything on one line. To print multi-line text, write it as a Python multiline string and send one execute_skill() per line: text = """\ ======================================== Title goes here ======================================== First paragraph line one. First paragraph line two. Second paragraph. ========================================""" for line in text.splitlines(): client.execute_skill( 'printf("' + line + '\\n")' ) Constraints: ASCII only — emojis and CJK characters cause a JSON encoding error on the remote SKILL interpreter No unescaped SKILL special chars in the text — if the line may contain " or % , escape them ( \\" , %% ) or use load_il() instead (see 03_load_il.py ) IMPORTANT: Always write .py files, never use python -c . python -c "..." has three layers of quoting (shell + Python + SKILL). \\n easily becomes \\\\n , causing printf to silently produce no output. Always write code to a .py file and run python script.py -- only two quoting layers (Python + SKILL), matching the examples. Full example: examples/01_virtuoso/basic/02_ciw_print.py References Load on demand — each contains detailed API docs and edge-case guidance: File Contents references/schematic-skill-api.md Schematic SKILL API, terminal-aware helpers, CDF params references/schematic-python-api.md SchematicEditor, SchematicOps, netlist import/export, low-level builders references/layout-skill-api.md Layout SKILL API, read/query, mosaic, layer control
Keywords that activate this skill. Click one to copy it.

This skill does not provide trigger words.

The downloaded .skill package contains the following fields.
Field Description
formatFormat tag (skill/v1)
skill_idUnique skill ID
nameSkill name
versionVersion
descriptionDescription
categoryCategories (array)
trigger_wordsTrigger words
tagsTags
sourceSource
source_urlSource URL (this page)
exported_atExported at (set per download)
system_promptSystem prompt body
model_configModel config: provider / model / temperature / max_tokens / top_p
examplesExamples
install_guideImport guide for Coze / Dify / Claude / custom frameworks
The same skill can be exported in different platform formats.
.skill Standard format with system_prompt and model_config, ready for any agent framework Download
.skillpro Enhanced format with scripts, tools, dependencies and hooks Download
.json Plain JSON export with system_prompt and model parameters only Download
Coze Markdown with frontmatter, for Coze platform import Download
Dify Dify DSL, import directly after creating an app Download

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。