PANDA is an LLM-enhanced, performance-driven analog design framework that bridges high-level design intent and final layout generation. It actively manages cross-stage dependencies through guided topology synthesis, substructure-aware sizing, and constraint-driven layout generation, shifting analog design automation from isolated algorithm-centric execution to intent-centric co-design. The repository provides a reproducible implementation that connects topology generation, sizing, Spectre simulation, placement, routing, LVS, PEX, and post-layout feedback through explicit task contracts and isolated run directories.
This repository intentionally separates reusable flow code from private EDA state. Cadence, PDK, Calibre, OpenAccess databases, Paprika binaries, and generated GDS/PEX artifacts are not tracked.
The project has two real, non-smoke flows that should be used as the reference cases.
| Case | Status | Current result |
|---|---|---|
| Three-stage high-gain OTA | Topology, real Spectre sizing, true-PCell placement/routing, layout-matched LVS/PEX, and post-PEX Spectre completed on the configured Linux EDA host | Post-PEX layout-matched gain 74.25 dB, UGBW 1.49 MHz, phase margin 98.10 deg, current 14.84 uA |
| StrongARM / SA comparator | Topology, real transient Spectre sizing, flattened T65 PCell GDS export, placement, and routing completed on the configured Linux EDA host | Delay about 155 ps to abs(VOUTP - VOUTN)=0.6 V, about 190 ps to 1.0 V, energy about 125 fJ/decision |
Important caveats:
- Smoke adapters are only orchestration checks. Do not report smoke output as a design result.
- The OTA result above is layout-matched PEX. Topology-source exact LVS is
still blocked by the
MP_STAGE3_LOADPCell property-expression mismatch. - Older OTA phase-margin values above
170 degare invalid historical output. The corrected try17 values are about99.31 degpre-layout and98.10 degpost-PEX. - Placement/routing return code
0is not enough. The route log must also be clean ofFAILED WITH DRC,failed at, and similar fatal markers.
See docs/panda_real_chain_repro.md and docs/panda_real_chain_buglog_20260517.md for the detailed run history and failure analysis.
git clone https://github.com/PKU-IDEA/PANDA.git
cd PANDA
git lfs pull
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -U pip
python3 -m pip install -r requirements.txt
python3 -m compileall analog_agent_flow.py analogxpert simulation sizing virtuoso_run \
virtuoso-bridge-lite-main/src virtuoso-bridge-lite-main/autopr_skillgit lfs pull is required for the released placement/routing kernel binaries
under pr_kernel/.
The optional Virtuoso bridge is an installable Python package. Install it on a machine that can reach the EDA host:
python3 -m pip install -e virtuoso-bridge-lite-mainFor the full dependency matrix, including Spectre, Virtuoso, PCell GDS, placement/routing kernels, and LVS/PEX wrappers, read docs/runtime_dependencies.md.
The placement/routing binaries also need non-Python shared libraries. Check pr_kernel/README.md before running real P&R.
Python-side dependencies are installed with:
python3 -m pip install -r requirements.txt
python3 -m pip install -e virtuoso-bridge-lite-mainrequirements.txt currently contains:
| Package | Used for |
|---|---|
numpy |
Sizing vectors, metrics, numeric utilities |
scipy |
Differential-evolution sizing and statistics |
scikit-learn |
Additive Gaussian-process sizing helper |
openai |
AnalogXpert-compatible topology LLM calls |
pydantic |
Virtuoso bridge data models |
PyYAML |
Virtuoso bridge schematic parameter-filter parsing |
python-dotenv |
Optional .env loading for local bridge profiles |
The following system tools are expected on the machine that runs PANDA:
| Tool | Required for |
|---|---|
git and git-lfs |
Repository checkout and P&R binary download |
Python >=3.9 |
PANDA orchestration and bridge package |
bash |
Placement/routing shell adapters |
| OpenSSH client | Remote Virtuoso/Spectre bridge flows |
file, ldd, readelf, sha256sum or shasum |
P&R binary dependency audit on Linux |
| Cadence Virtuoso and Spectre | Real PCell generation, sizing, and simulation |
| PDK model files, stream-out layer map, PR tech/stdcell JSON, flattened PCell GDS | Real sizing and placement/routing |
| LVS/PEX tool wrappers such as Calibre adapters | Layout verification, RC extraction, and post-layout simulation |
The released placement/routing binaries are Linux x86-64 ELF executables. The
direct dynamic libraries audited from both pr_kernel/placement and
pr_kernel/routing are:
libz.so.1
libtorch.so
libtorch_cpu.so
libc10.so
libpthread.so.0
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6
ld-linux-x86-64.so.2
Required symbol versions:
GLIBC_2.14
GLIBCXX_3.4.26
CXXABI_1.3.5
In practice, put the non-system P&R runtime libraries in one directory:
$PANDA_REPO/pr_kernel/libso/
|-- libc10.so
|-- libtorch.so
|-- libtorch_cpu.so
`-- libstdc++.so.6 # needed if the host system libstdc++ is too old
Then configure:
export PR_LIB_DIR="$PANDA_REPO/pr_kernel/libso"
export LD_LIBRARY_PATH="$PR_LIB_DIR:${LD_LIBRARY_PATH:-}"On the Linux EDA host, validate the binaries before real placement/routing:
bash pr_kernel/check_deps.shThe dependency audit used these checks: file for binary type, readelf -d
for direct NEEDED libraries, readelf --version-info for GLIBC/GLIBCXX
requirements, ldd for resolved or missing runtime libraries, and SHA-256
hashes for the two released binaries. A usable P&R environment has no
not found entries and no GLIBCXX_* not found or GLIBC_* not found errors.
Use smoke mode first to verify Python imports, task contracts, artifact paths, and placement/routing wrapper wiring:
python3 virtuoso_run/run_demo.py --demo all --backend smoke \
--run-root run/virtuoso/smoke_checkSmoke mode uses seed sizing and placeholder placement/routing adapters. It is not a real circuit result and must not be reported as topology, sizing, layout, or post-layout performance.
Real PANDA runs require user-provided access to Spectre, Virtuoso, licensed PDK models, flattened PCell GDS, and PR technology inputs. Copy the example env file and fill only local private paths:
mkdir -p .local/virtuoso_run
cp virtuoso_run/env.real.example .local/virtuoso_run/real.env
${EDITOR:-vi} .local/virtuoso_run/real.envAt minimum, real placement/routing runs need:
export PANDA_REPO=$PWD
export SPECTRE_BIN=/path/to/spectre
export PDK_MODEL_INCLUDE=/path/to/model.scs
export PLACE_KERNEL_BIN=$PWD/pr_kernel/placement
export ROUTE_KERNEL_BIN=$PWD/pr_kernel/routing
export PR_LIB_DIR=$PWD/pr_kernel/libso
export LD_LIBRARY_PATH=$PR_LIB_DIR:${LD_LIBRARY_PATH:-}
export PLACE_TECHFILE=/path/to/lef.json
export PLACE_STDCELL=/path/to/stdcell.json
export PCELL_SKILL_TEMPLATE=$PWD/virtuoso-bridge-lite-main/autopr_skill/pcell_extract/pcell_skill_header.txt
export PANDA_PCELL_GDS_DIR=/path/to/flattened_pcell_gdsPR_LIB_DIR must contain the P&R binary shared libraries described in
pr_kernel/README.md, especially the LibTorch CPU runtime
and a libstdc++.so.6 new enough for GLIBCXX_3.4.26 on older hosts.
Private env files, PDK content, GDS outputs, OA databases, Calibre outputs, and Spectre PSF directories are intentionally ignored by Git.
Three-stage OTA target75:
set -a
. .local/virtuoso_run/real.env
set +a
python3 virtuoso_run/scripts/run_three_stage_ota_target75.py \
--run-root run/virtuoso/three_stage_ota_target75_demoStrongARM comparator:
set -a
. .local/virtuoso_run/real.env
set +a
python3 virtuoso_run/scripts/run_sa_comp_panda_236.py \
--run-root run/virtuoso/sa_comp_demoExpected checkpoint artifacts are written inside the selected run root:
<run-root>/
|-- design_request.json
|-- run_manifest.json
|-- pcell_gds_flat/
`-- <case>/try1/
|-- topology_clean.sp
|-- sizing.json
|-- sizing_tb.scs
|-- sizing_parameter_map.json
|-- placement_result/*.gds
`-- route_result/*.gds
Always inspect run_route.log for fatal markers such as FAILED WITH DRC even
when a wrapper returns success.
sizing/topology_sizing_template.py is the template for new sizing cases.
It consumes a PANDA topology artifact and emits a parameterized Spectre deck and
parameter map:
python3 sizing/topology_sizing_template.py \
--run-dir run/sizing_template_try1 \
--topology-json run/virtuoso/three_stage_ota_target75_demo/three_stage_ota/try1/topology.json \
--model-include "$PDK_MODEL_INCLUDE" \
--model-section "${SIZING_MODEL_SECTION:-tt_lib}"For end-to-end flow runs, set a sizing backend command. The released single
point Spectre adapter is useful for validating generated decks; production
optimization can replace it with a MOSTAR-compatible wrapper that writes
SIZING_BACKEND_RESULT_JSON or SIZING_OPTIMIZED_CSV.
export SIZING_BACKEND_CMD="python3 $PWD/sizing/spectre_backend.py"PANDA uses a dual-license policy:
- Academic and other non-commercial use is permitted under the PolyForm Noncommercial License 1.0.0.
- Commercial use requires a separate written commercial license from the PANDA rights holders. See COMMERCIAL-LICENSE.md. To request a commercial license, contact yibolin@pku.edu.cn. (the commercial license is still free, but simply needs additional application process with the applicant's name and affiliation)
Because commercial use is restricted, this public license is a source-available non-commercial license rather than an OSI open-source license.
All copies, modified versions, redistributions, public demos, benchmark artifacts, technical reports, and derivative works that include or use PANDA must retain the required PANDA notice in NOTICE:
Required Notice: This work uses PANDA, developed by PKU-IDEA and PANDA contributors.
Academic publications, benchmarks, technical reports, and public presentations that use PANDA or results generated by PANDA must acknowledge PANDA and cite the relevant papers listed in the Citation section below.
This repository does not grant rights to third-party proprietary EDA tools, PDKs, foundry data, model files, technology files, generated layouts, signoff decks, or other third-party artifacts.
If you use this repository, please acknowledge PANDA and cite the relevant papers for the framework and the stage-specific engines you use. The BibTeX entries below cover the framework and each stage-specific engine.
For the full PANDA framework:
@inproceedings{zhang2026panda,
title = {{PANDA}: An {LLM}-Enhanced Performance-Driven Analog Design Framework Bridging Design Intent and Layout Generation},
author = {Haoyi Zhang, Weijian Fan, Xiaohan Gao, Bingyang Liu, Runsheng Wang, and Yibo Lin},
booktitle = {Proceedings of the 63rd ACM/IEEE Design Automation Conference (DAC)},
year = {2026},
address = {Long Beach, CA, USA},
note = {Invited Paper}
}For the stage-specific engines used by PANDA:
@inproceedings{zhang2025analogxpert,
title = {{AnalogXpert}: Automating Analog Topology Synthesis by Incorporating Circuit Design Expertise into Large Language Models},
author = {Haoyi Zhang, Shizhao Sun, Yibo Lin, Runsheng Wang, Jiang Bian},
booktitle = {International Symposium of EDA (ISEDA)},
year = {2025}
}
@inproceedings{fan2026mostar,
title = {{MOSTAR}: Multi-Stage Hierarchical Bayesian Optimization for Substructure-Aware High-Dimensional Analog Circuit Sizing},
author = {Weijian Fan, Haoyi Zhang, Weibin Lin, Runsheng Wang, Yibo Lin},
booktitle = {Asia and South Pacific Design Automation Conference (ASP-DAC)},
year = {2026}
}
@inproceedings{zhang2024jointplacement,
title = {Joint Placement Optimization for Hierarchical Analog/Mixed-Signal Circuits},
author = {Xiaohan Gao, Haoyi Zhang, Bingyang Liu, Yibo Lin, Runsheng Wang, Ru Huang},
booktitle = {ACM/IEEE International Conference on Computer-Aided Design (ICCAD)},
year = {2024}
}
@inproceedings{zhang2023sageroute,
title = {{SAGERoute}: Synergistic Analog Routing Considering Geometric and Electrical Constraints},
author = {Haoyi Zhang, Xiaohan Gao, Haoyang Luo, Jiahao Song, Xiyuan Tang, Junhua Liu, Yibo Lin, Runsheng Wang, Ru Huang},
booktitle = {Design, Automation and Test in Europe Conference (DATE)},
year = {2023},
note = {Best Paper Award}
}.
|-- analog_agent_flow.py # Main task orchestrator and local MCP-style server
|-- flow_request.json # Default autonomous-flow request
|-- analogxpert/ # Local topology templates and topology helpers
|-- sizing/ # Reusable topology-driven sizing template, optimizer glue, and backend adapters
|-- simulation/ # Spectre deck builder and launcher wrappers
|-- virtuoso-bridge-lite-main/ # Virtuoso/Spectre bridge and PCell GDS export templates
|-- place.py / route.py # Placement and routing wrapper logic
|-- run_placement.sh # Placement kernel adapter
|-- run_route.sh # Routing kernel adapter
|-- verification.py # LVS/PEX backend wrapper contracts
|-- virtuoso_run/ # Isolated real/demo run harnesses
|-- task_skills/ # Per-task skill contracts for the PANDA stages
|-- agent_skills/ # Main-agent skill backup for real configured Linux EDA host flows
|-- docs/ # Contracts, status notes, repro notes, buglogs
|-- template_json/ # allconfig templates and PR inputs
`-- topology_gen/ # Legacy topology-generation tools and fallback scripts
Generated data should stay under ignored paths such as run/, outputs/, and
run_artifacts/.
The main flow is a sequence of explicit tasks. Each task receives structured inputs, writes artifacts to the current attempt directory, and returns a JSON status object.
topology_generationpost_topology_decisionsizingsimulator_launchplacement_pr_planningplacementrouting_pr_planningroutinglvspex
Before sizing starts, the flow must carry matched-device relationships from
post-topology planning into downstream_inputs.sizing.symmetry_constraints.
Differential pairs, current mirrors, active loads, and matched capacitors or
resistors should be tied to shared sizing variables or explicit ratio
constraints before the optimizer runs. The same relationships should stay
consistent with placement/routing symmetry groups.
The implementation uses an MCP-style local interface in analog_agent_flow.py.
The stable methods are:
| Method | Purpose |
|---|---|
analog.topology.generate |
Generate or load topology netlists |
analog.post_topology.plan |
Plan downstream constraints after topology |
analog.sizing.optimize |
Build sizing decks, apply sizing symmetry constraints, and call a real sizing backend |
analog.simulator.launch |
Build and optionally launch Spectre decks |
analog.placement_pr.plan |
Build placement constraints |
analog.placement.execute |
Run placement through place.py and run_placement.sh |
analog.routing_pr.plan |
Build routing constraints |
analog.routing.execute |
Run routing through route.py and run_route.sh |
analog.lvs.run |
Run configured LVS backend |
analog.pex.extract |
Run configured PEX backend |
For the full interface contract, read docs/mcp_contract.md.
The real-chain demos run on a configured Linux EDA host that has access to Virtuoso, Spectre, the PDK, and the Paprika placement/routing binaries. If your EDA host is behind a gateway, connect through your own private SSH chain:
ssh -o BatchMode=yes -o ConnectTimeout=10 <gateway-user>@<gateway-host> \
'ssh -o BatchMode=yes -o ConnectTimeout=10 <eda-user>@<eda-host> "hostname"'Important private paths are supplied through environment variables, usually by
copying virtuoso_run/env.real.example into .local/virtuoso_run/real.env and
filling it locally:
| Item | Path |
|---|---|
| Repo | $PANDA_REPO |
| Optional flow copy | $PANDA_FLOW_ROOT |
| Virtuoso workspace | $VIRTUOSO_WORKSPACE |
| Virtuoso wrapper | $VIRTUOSO_BIN |
| Spectre | $SPECTRE_BIN |
| T65 model | $PDK_MODEL_INCLUDE |
| PR placement binary | $PANDA_REPO/pr_kernel/placement |
| PR routing binary | $PANDA_REPO/pr_kernel/routing |
| PR shared libraries | $PANDA_REPO/pr_kernel/libso |
The placement and routing kernel binaries are stored with Git LFS. After
cloning, run git lfs pull before launching real P&R. Then run
bash pr_kernel/check_deps.sh on the Linux EDA host and fix any missing
dynamic libraries before starting placement/routing.
This case reproduces the StrongARM / SA comparator flow from design intent to transient sizing, true PCell GDS export, placement, and routing. It is the recommended comparator demo for checking the non-smoke PANDA path on a configured Linux EDA host.
Design intent: generate a StrongARM latch comparator for low-energy transient decision evaluation, then verify delay and switching energy with real Spectre transient simulation before taking the topology through true-PCell placement and routing.
Before running, fill .local/virtuoso_run/real.env with the private Spectre,
Virtuoso, PDK, PCell, and P&R paths, then validate the P&R runtime:
bash pr_kernel/check_deps.shRun the case in a fresh isolated directory:
cd $PANDA_REPO
set -a
. .local/virtuoso_run/real.env
set +a
python3 virtuoso_run/scripts/run_sa_comp_panda_236.py \
--run-root run/virtuoso/real_chain_sa_comp_<tag>The runner executes the case-specific stages in order:
- Generate the
STRONGARM_COMPtopology. - Run real Spectre transient sizing through
virtuoso_run/scripts/strongarm_sizing_backend.py. - Export flattened MOS PCell GDS through Virtuoso.
- Run Paprika placement.
- Run Paprika routing and inspect the route log.
Expected output layout:
| Stage | Main artifact |
|---|---|
| Topology | comparator/try1/topology_clean.sp |
| Sizing | comparator/try1/sizing.json, comparator/try1/strongarm_tran_tb.scs, comparator/try1/strongarm_tran.raw/ |
| PCell GDS | <run-root>/pcell_gds_flat/*.gds |
| Placement | comparator/try1/placement_result/STRONGARM_COMP.gp.gds |
| Routing | comparator/try1/route_result/STRONGARM_COMP.route.gds, comparator/try1/route_result/route_wires.json |
Parse transient metrics from the generated Spectre raw directory:
python3 virtuoso_run/scripts/extract_strongarm_perf.py \
run/virtuoso/real_chain_sa_comp_<tag>/comparator/try1/strongarm_tran.rawReference accepted metrics from the known-good try4 run:
| Metric | Value |
|---|---|
Delay to abs(VOUTP - VOUTN)=0.6 V |
about 155 ps |
Delay to abs(VOUTP - VOUTN)=1.0 V |
about 190 ps |
| Energy | about 125 fJ/decision |
Known-good run root:
$PANDA_REPO/run/virtuoso/real_chain_20260521_panda_sa_comp_full_try4/comparator/try1
Accept routing only after checking the route log, not just the return code:
grep -n 'FAILED WITH DRC\|failed at\|terminate called\|std::out_of_range' \
run/virtuoso/real_chain_sa_comp_<tag>/comparator/try1/run_route.logThis case reproduces the high-gain three-stage OTA target75 demo for sensor
readout: differential input, single-ended output, target gain around 75 dB,
and target UGBW around 1 MHz. The public runner covers topology generation,
real Spectre sizing, pre-layout deck generation, true-PCell placement, and
routing. The layout-matched LVS/PEX metrics below come from the accepted try17
post-layout run.
Design intent: design a three-stage OTA with differential input and single
output for sensor readout, targeting high open-loop gain and robust phase
margin near a 1 MHz unity-gain bandwidth.
Before running, configure .local/virtuoso_run/real.env and verify the P&R
runtime in the same way as the comparator case:
bash pr_kernel/check_deps.shRun the OTA case in a fresh isolated directory:
cd $PANDA_REPO
set -a
. .local/virtuoso_run/real.env
set +a
python3 virtuoso_run/scripts/run_three_stage_ota_target75.py \
--run-root run/virtuoso/three_stage_ota_target75_<tag>The runner executes the case-specific stages in order:
- Generate the
THREE_STAGE_OTA_HGtopology. - Inject the target75 operating assumptions for T65:
VDD=1.2,VCM=600m,VBN=0.62,VBP2=0.52,VBP3=0.64, andCLOAD=500f. - Run real Spectre sizing.
- Generate the pre-layout simulation deck.
- Run Paprika placement.
- Run Paprika routing and inspect the route log.
Expected output layout:
| Stage | Main artifact |
|---|---|
| Topology | three_stage_ota/try1/topology_clean.sp |
| Sizing | three_stage_ota/try1/sizing.json, three_stage_ota/try1/sizing_tb.scs, three_stage_ota/try1/sizing_parameter_map.json |
| Placement | three_stage_ota/try1/placement_result/THREE_STAGE_OTA_HG.gp.gds |
| Routing | three_stage_ota/try1/route_result/THREE_STAGE_OTA_HG.route.gds |
| Run manifest | <run-root>/run_manifest.json |
Generated GDS stays under run/ and is ignored by Git.
Reference run roots:
# Full topology/sizing/placement/routing run
$PANDA_REPO/run/virtuoso/real_chain_20260518_panda_direct_true_pcell_try17_full_stage3_w32m2/three_stage_ota/try1
# Layout-matched LVS/PEX and post-PEX run
$PANDA_REPO/run/virtuoso/real_chain_20260518_panda_direct_true_post_layout_try17_layoutmatched_lvs_pex
Corrected accepted metrics:
| Stage | Gain | UGBW | Phase margin | Current |
|---|---|---|---|---|
| Pre-layout try17 | 80.05 dB |
1.89 MHz |
99.31 deg |
16.89 uA |
| Post-PEX layout-matched try17 | 74.25 dB |
1.49 MHz |
98.10 deg |
14.84 uA |
Accept routing only after checking the route log, not just the return code:
grep -n 'FAILED WITH DRC\|failed at\|terminate called\|std::out_of_range' \
run/virtuoso/three_stage_ota_target75_<tag>/three_stage_ota/try1/run_route.logKnown scope caveat: the post-PEX result is layout-matched. Topology-source exact
LVS is still blocked by the MP_STAGE3_LOAD PCell property-expression mismatch
documented in docs/panda_real_chain_buglog_20260517.md.
The flow is intentionally adapter-driven. Configure real tools through environment variables instead of hardcoding private paths.
| Variable | Purpose |
|---|---|
ANALOG_AGENT_RUN_ROOT |
Root directory for attempts, default run |
TOPOLOGY_BACKEND |
local, codex, or legacy external topology behavior |
TOPOLOGY_CANDIDATE_PATH |
Explicit topology candidate netlist |
SIZING_BACKEND_CMD |
Real sizing backend command |
SIZING_BACKEND |
Built-in sizing mode selector, for example builtin |
SPECTRE_BIN / SPECTRE_CMD |
Spectre executable or launch command |
PLACE_KERNEL_BIN |
Placement binary path |
ROUTE_KERNEL_BIN |
Routing binary path |
PR_KERNEL_BIN |
Shared fallback PR binary path |
LD_LIBRARY_PATH |
Must include PR shared libraries for Paprika kernels |
PLACE_TECHFILE / ROUTE_TECHFILE |
PR technology input |
PLACE_STDCELL / ROUTE_STDCELL |
PR standard-cell input |
PLACE_PCELLDIR / ROUTE_PCELLDIR |
Flattened PCell GDS directory |
ALLCONFIG_TEMPLATE_PATH |
allconfig.json template override |
LVS_CMD |
Real LVS backend command |
PEX_CMD |
Real PEX backend command |
For backend details, read docs/backend_adapters.md.
Each attempt directory is self-contained. Typical files include:
try1/
|-- topology.json
|-- topology_clean.sp
|-- post_topology_decision.json
|-- sizing.json
|-- sizing_tb.scs
|-- sizing_parameter_map.json
|-- pre_sim_tb.scs
|-- post_sim_tb.scs
|-- placement_pr.json
|-- place_input.json
|-- pl.json
|-- routing_pr.json
|-- route_input.json
|-- rt.json
|-- allconfig.json
|-- multi_symmetric_group.json
|-- lvs.json
|-- pex.json
`-- post_layout_pex.scs
For real Paprika runs, the meaningful layout deliverables are usually under
placement_result/ and route_result/. The wrapper files pl.bin and rt.bin
can be zero-byte placeholders and should not be treated as the final GDS.
The real PANDA/Virtuoso debugging workflow is captured as a Codex skill:
agent_skills/panda-virtuoso-flow/
A local installed copy may also live at:
~/.codex/skills/panda-virtuoso-flow/
Use this skill whenever the task mentions:
- real PANDA reruns on the configured Linux EDA host
- three-stage OTA try17 status
- StrongARM / SA comparator reproduction
- true PCell GDS generation
- placement/routing kernel failures
- LVS/PEX/post-PEX status
- Keep every rerun in a new isolated directory.
- Stop at the first failing checkpoint and identify the concrete bad input, script, or tool log.
- Use the Cadence wrapper
$VIRTUOSO_BIN; do not call the64bit/virtuosobinary directly in non-interactive SSH. - For configured Linux EDA host Python 3.6 flow copies, avoid
from __future__ import annotationsandA | Btyping syntax. - Use fixed capacitor types for layout input. The working T65 path uses a
flattened fixed
crtmomGDS with explicitPLUS/MINUS/BULKtext. - Resistor PCell GDS must include
PLUS/MINUStext on the M1 pin rectangles. - StrongARM Spectre decks should use explicit DC parameters such as
VINPDC=605mandVINNDC=595m; Spectre 19.1 rejects expressions likedc='VCM+VDIFF/2'. - Avoid multi-underscore MOS aliases in Paprika PCell names. Generate both the original and stripped GDS aliases when needed.
- Check route logs for fatal text even when the wrapper returns success.
- Treat any post-layout result generated before clean LVS as diagnostic only.
Use rg and the docs under docs/ first when debugging old runs. The most
useful starting points are:
- docs/panda_real_chain_repro.md
- docs/panda_real_chain_buglog_20260517.md
- docs/mcp_contract.md
- docs/skill_mcp_standard.md
- virtuoso_run/README.md
Before committing, keep generated private artifacts out of Git. The repository should contain reproducible scripts, contracts, and documentation, not PDK or EDA output databases.