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
官方收录技能
质量 优秀 · 90
v1.0.0
获取
https://deepseekmodel.com/api/download.php?id=arcadia-1-virtuoso-bridge-lite-skills-virtuoso-skill-md&format=skill
下载 .skill
标准格式,含 system_prompt 与 model_config,导入任意 Agent 框架即可使用
.skill 文件中 system_prompt 字段的实际内容。
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
Agent 识别该技能的关键词,点击任意一个即可复制。
该技能未提供触发词。
下载的 .skill 包内含以下字段。
| 字段 | 说明 |
|---|---|
| format | 格式标识(skill/v1) |
| skill_id | 技能唯一 ID |
| name | 技能名称 |
| version | 版本号 |
| description | 技能描述 |
| category | 所属分类(数组) |
| trigger_words | 触发词列表 |
| tags | 标签列表 |
| source | 来源标识 |
| source_url | 来源链接(本页地址) |
| exported_at | 导出时间(每次下载生成) |
| system_prompt | 系统提示词正文 |
| model_config | 模型参数:provider / model / temperature / max_tokens / top_p |
| examples | 示例 |
| install_guide | 各平台导入说明(Coze / Dify / Claude / 自定义框架) |