-prefixed cell names in the output netlist)\n2. Verify that the output netlist (`synth_netlist.v`) exists and is non-empty\n3. Parse `report_area` / `report_timing` output if ABC timing mode (`abc -constr`) was used\n\nWhen used inside OpenROAD Flow Scripts (ORFS) or LibreLane, the Yosys log appears at:\n`logs/\u003cplatform>/\u003cdesign>/1_1_yosys.log`\n\n---\n\n## Stage: constraint_setup\n\n### Domain Rules\n1. `create_clock`: all primary clocks with period, waveform, source pin, name\n2. `create_generated_clock`: all derived/divided clocks with correct source\n3. `set_clock_uncertainty`: setup = skew + jitter — use `design_state.constraints.timing.clk_uncertainty_ps` if set; otherwise 200–500 ps pre-CTS (default: see `constraints.timing.clk_uncertainty_ps`, schema default null → use 200–500 ps rule-of-thumb)\n4. `set_input_delay` / `set_output_delay`: all primary IOs constrained\n5. `set_false_path`: multi-clock crossings, test modes, async resets\n6. `set_multicycle_path`: both setup (-setup N) and hold (-hold 1) must be set\n7. `set_dont_touch`: IPs, memory macros, hand-crafted cells\n8. `set_max_fanout`: from `design_state.constraints.timing.fanout_max` (default: 32)\n9. `set_max_transition`: per technology DRC rule\n10. Operating conditions: explicitly set (never rely on tool defaults)\n\n### Common SDC Mistakes\n| Mistake | Consequence |\n|---------|------------|\n| Missing generated clock | Path unconstrained — may miss timing |\n| MCP without hold correction | Hold violations introduced |\n| False path too broad | Real timing issues masked |\n| No operating conditions set | Wrong library corner used |\n\n### QoR Metrics to Evaluate\n- All clocks defined (verify with `report_clocks`)\n- All IOs constrained (verify with `report_port -verbose`)\n- No unconstrained paths (`report_timing -unconstrained`)\n\n### Output Required\n- Validated SDC file\n- Clock summary\n- Constraint QA report\n\n---\n\n## Stage: compile_explore\n\n### Domain Rules\n1. Run at worst-case timing corner (SS, low voltage, high temperature)\n2. Compile explore: faster run to find best logic structure\n3. Try multiple architectures: retiming on/off, datapath options\n4. Identify critical paths for human review before final compile\n5. Check area estimate vs microarch estimate\n\n### Optimisation Strategy by Priority\n| Priority | Approach |\n|----------|---------|\n| Timing | compile_ultra, path_group weighting, retiming |\n| Area | High area_effort, resource sharing |\n| Power | Clock gating insertion, power-aware compile |\n| Balanced | compile_ultra -no_autoungroup + incremental |\n\n### Output Required\n- Exploration report (timing, area, power summary)\n- Critical path list for architect review\n- Recommended compile strategy for final compile\n\n---\n\n## Stage: compile_final\n\n### Domain Rules\n1. Run multi-scenario if available (setup + hold simultaneously)\n2. Enable clock gating synthesis for sequential power reduction\n3. Preserve hierarchy for blocks with existing placement intent\n4. Ungroup small modules for better cross-boundary optimisation\n5. Review critical paths manually — restructure RTL if path cannot close\n6. Run incremental compile after initial compile to address remaining violations\n\n### QoR Metrics to Evaluate\n- WNS: ≥ `design_state.constraints.timing.wns_ns_target` at worst-case corner for sign-off (default: 0)\n- TNS: = `design_state.constraints.timing.tns_ns_target` for clean sign-off (default: 0)\n- Area: within `design_state.constraints.area.area_um2` budget\n- Power: within `design_state.constraints.power.power_mw` budget\n- No unmapped cells\n\n### Output Required\n- Gate-level netlist (.v)\n- Timing report (setup and hold, all path groups)\n- Area report\n- Power report\n- Synthesis run log\n\n---\n\n## Stage: netlist_qc\n\n### Checks Required\n1. No black boxes (undefined modules) in netlist. A black box is an input-set defect, not a\n compile result: if it resolves to first-party RTL, that file is missing from the synthesis\n source list (sv2v and yosys black-box it without an error); otherwise a library, macro or\n IP view is missing. Either way re-running the compile cannot fix it — name the module, the\n file or view, and the list, and escalate as `input_setup`\n2. No combinational loops (`report_loop`)\n3. Scan chains intact (if DFT-enabled compile)\n4. Power/ground connections correct (tie cells, well ties)\n5. Formal equivalence check (RTL vs netlist): PASS required\n\n### LEC Requirements\n- Golden: RTL (post-lint, post-CDC-clean)\n- Revised: gate-level netlist\n- Result: all points EQUIVALENT\n- Any UNMATCHED point: must be resolved before PD\n\n### QoR Metrics to Evaluate\n- LEC: 100% EQUIVALENT\n- No black boxes\n- No combinational loops\n- Scan chain integrity: verified\n\n### Output Required\n- LEC report (pass/fail)\n- Netlist QC checklist\n- Final gate netlist (ready for PD)\n- Back-annotated SDC for PD\n\n---\n\n## Stage: synthesis_signoff\n\n### Sign-off Checklist\n- [ ] WNS ≥ `design_state.constraints.timing.wns_ns_target` at all required corners (default: 0)\n- [ ] TNS = `design_state.constraints.timing.tns_ns_target` (default: 0)\n- [ ] Area within `design_state.constraints.area.area_um2` budget\n- [ ] Power within `design_state.constraints.power.power_mw` budget\n- [ ] LEC: EQUIVALENT\n- [ ] No black boxes\n- [ ] No combinational loops\n- [ ] Scan chains verified (if DFT)\n\n### Output Required\n- PD handoff package: netlist, SDC, timing reports, area/power reports\n\n---\n\n## Constraint Validation\n\nSee `plugins/meta/skills/pipeline-orchestration/SKILL.md` §Constraints Schema for the authoritative schema and stage-entry validation rule.\n\n**Required at entry (`constraint_setup`) — hard-fail if missing:**\n- `constraints.clock.clk_mhz` — target clock frequency (drives SDC `create_clock`)\n- `constraints.area.area_um2` — area budget\n- `constraints.power.power_mw` — power budget\n\n**Optional (schema defaults apply when absent):**\n- `constraints.timing.wns_ns_target` (default: 0) — WNS sign-off threshold\n- `constraints.timing.tns_ns_target` (default: 0) — TNS sign-off threshold\n- `constraints.timing.fanout_max` (default: 32) — `set_max_fanout` value\n- `constraints.timing.clk_uncertainty_ps` (default: null → use 200–500 ps rule-of-thumb)\n\n---\n\n## Memory\n\n### Write on stage completion\nAfter each stage completes (regardless of whether an orchestrator session is active),\nupsert one JSON record in `memory/synthesis/experiences.jsonl` keyed by `run_id`.\nImplement the upsert by rewriting the file: read all existing lines, filter out any\nrecord(s) with the same `run_id`, append the updated record, write the full content\nback atomically (replace the file). Every record must include a top-level `\"run_id\"`\nfield with format `synthesis_\u003cYYYYMMDD>_\u003cHHMMSS>` (set once at flow start; reuse on\neach stage update). Set `signoff_achieved: false` until the final sign-off stage\ncompletes.\n### Run state (write before first stage, update after each stage)\nWrite `memory/synthesis/run_state.md` as the **first action** before launching any tool:\n```markdown\nrun_id: synthesis_\u003cYYYYMMDD>_\u003cHHMMSS>\ndesign_name: \u003cdesign>\ntool: \u003cprimary tool>\nstart_time: \u003cISO-8601>\nlast_stage: \u003cfirst stage name>\n```\nUpdate `last_stage` after each stage completes. This file lets wakeup-loop prompts\nand resumed sessions identify the correct run without relying on in-memory state.\nCreate the file and parent directories if they do not exist.\n\n### Optional: claude-mem index\nIf `mcp__plugin_ecc_memory__add_observations` is available in this session, emit each\napplied fix as an observation to entity `chip-design-synthesis-fixes` after writing to\n`experiences.jsonl`. Skip silently if the tool is absent — JSONL is the canonical record.\n","licenseDocuments":[]}}
L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

logic-synthesis

logic-synthesis

Logic synthesis from RTL to gate-level netlist — SDC constraint validation, compile and optimisation strategy, netlist quality check, and LEC equivalence verification. Use when synthesising RTL for ASIC, setting up timing constraints, optimising for timing/area/power, or verifying a post-synthesis netlist.

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: logic-synthesis description: > Logic synthesis from RTL to gate-level netlist — SDC constraint validation, compile and optimisation strategy, netlist quality check, and LEC equivalence verification. Use when synthesising RTL for ASIC, setting up timing constraints, optimising for timing/area/power, or verifying a post-synthesis netlist. version: 1.0.0 author: chuanseng-ng license: MIT allowed-tools: Read, Write, Bash

Skill: Logic Synthesis

Invocation

  • If invoked by a user presenting a synthesis task: immediately spawn the digital-chip-design-agents:synthesis-orchestrator agent and pass the full user request and any available context. Do not execute stages directly.
  • If invoked by the synthesis-orchestrator mid-flow: do not spawn a new agent. Treat this file as read-only — return the requested stage rules, sign-off criteria, or loop-back guidance to the calling orchestrator.

Spawning the orchestrator from within an active orchestrator run causes recursive delegation and must never happen.

Pre-run Context

Before executing or advising on any stage, read the following files if they exist:

  1. memory/synthesis/knowledge.md — known failure patterns, successful tool flags, PDK/tool quirks. Incorporate its guidance into every stage decision. If absent, proceed without it.
  2. memory/synthesis/run_state.md — current run identity (run_id, design_name, tool, last_stage). Use this to resume correctly after interruption. If absent, a new run is starting; the orchestrator will create this file before the first stage.

This pre-run read applies whether this skill is loaded by a user or called by the orchestrator mid-flow. It ensures the fix database is consulted before any diagnosis step.

Purpose

Produce a timing-clean, area-efficient, LEC-verified gate-level netlist from RTL. Covers constraint setup, synthesis compilation strategy, and quality checks before PD handoff.


Supported EDA Tools

Open-Source

  • Yosys (yosys) — open-source synthesis suite; runs as a sequential pass pipeline (see sequential flow note below)
  • Surelog (surelog) — SystemVerilog front-end for Yosys
  • ABC — logic optimisation and technology mapping (invoked automatically by Yosys)

Proprietary

  • Synopsys Design Compiler (dc_shell, dialect synopsys) — industry-standard logic synthesis
  • Cadence Genus (genus, dialect cadence) — RTL-to-netlist with concurrent optimisation
  • Synopsys Fusion Compiler (fc_shell, dialect synopsys) — combined synthesis and physical guidance

Sequential Flow Log Review (Yosys)

Yosys runs its synthesis script (yosys -c synth.ys or yosys -p "synth_*") as a sequential pass pipeline. Each pass (read_verilog → synth → opt → techmap → abc → write_verilog) executes in order; errors or warnings in early passes propagate forward.

After a Yosys run the agent must:

  1. Read the Yosys log (stdout or redirected yosys.log) for:
    • Warning: / Error: lines per pass
    • Final statistics block: number of cells, wires, and logic depth
    • Unmapped cells (search for $-prefixed cell names in the output netlist)
  2. Verify that the output netlist (synth_netlist.v) exists and is non-empty
  3. Parse report_area / report_timing output if ABC timing mode (abc -constr) was used

When used inside OpenROAD Flow Scripts (ORFS) or LibreLane, the Yosys log appears at: logs/<platform>/<design>/1_1_yosys.log


Stage: constraint_setup

Domain Rules

  1. create_clock: all primary clocks with period, waveform, source pin, name
  2. create_generated_clock: all derived/divided clocks with correct source
  3. set_clock_uncertainty: setup = skew + jitter — use design_state.constraints.timing.clk_uncertainty_ps if set; otherwise 200–500 ps pre-CTS (default: see constraints.timing.clk_uncertainty_ps, schema default null → use 200–500 ps rule-of-thumb)
  4. set_input_delay / set_output_delay: all primary IOs constrained
  5. set_false_path: multi-clock crossings, test modes, async resets
  6. set_multicycle_path: both setup (-setup N) and hold (-hold 1) must be set
  7. set_dont_touch: IPs, memory macros, hand-crafted cells
  8. set_max_fanout: from design_state.constraints.timing.fanout_max (default: 32)
  9. set_max_transition: per technology DRC rule
  10. Operating conditions: explicitly set (never rely on tool defaults)

Common SDC Mistakes

MistakeConsequence
Missing generated clockPath unconstrained — may miss timing
MCP without hold correctionHold violations introduced
False path too broadReal timing issues masked
No operating conditions setWrong library corner used

QoR Metrics to Evaluate

  • All clocks defined (verify with report_clocks)
  • All IOs constrained (verify with report_port -verbose)
  • No unconstrained paths (report_timing -unconstrained)

Output Required

  • Validated SDC file
  • Clock summary
  • Constraint QA report

Stage: compile_explore

Domain Rules

  1. Run at worst-case timing corner (SS, low voltage, high temperature)
  2. Compile explore: faster run to find best logic structure
  3. Try multiple architectures: retiming on/off, datapath options
  4. Identify critical paths for human review before final compile
  5. Check area estimate vs microarch estimate

Optimisation Strategy by Priority

PriorityApproach
Timingcompile_ultra, path_group weighting, retiming
AreaHigh area_effort, resource sharing
PowerClock gating insertion, power-aware compile
Balancedcompile_ultra -no_autoungroup + incremental

Output Required

  • Exploration report (timing, area, power summary)
  • Critical path list for architect review
  • Recommended compile strategy for final compile

Stage: compile_final

Domain Rules

  1. Run multi-scenario if available (setup + hold simultaneously)
  2. Enable clock gating synthesis for sequential power reduction
  3. Preserve hierarchy for blocks with existing placement intent
  4. Ungroup small modules for better cross-boundary optimisation
  5. Review critical paths manually — restructure RTL if path cannot close
  6. Run incremental compile after initial compile to address remaining violations

QoR Metrics to Evaluate

  • WNS: ≥ design_state.constraints.timing.wns_ns_target at worst-case corner for sign-off (default: 0)
  • TNS: = design_state.constraints.timing.tns_ns_target for clean sign-off (default: 0)
  • Area: within design_state.constraints.area.area_um2 budget
  • Power: within design_state.constraints.power.power_mw budget
  • No unmapped cells

Output Required

  • Gate-level netlist (.v)
  • Timing report (setup and hold, all path groups)
  • Area report
  • Power report
  • Synthesis run log

Stage: netlist_qc

Checks Required

  1. No black boxes (undefined modules) in netlist. A black box is an input-set defect, not a compile result: if it resolves to first-party RTL, that file is missing from the synthesis source list (sv2v and yosys black-box it without an error); otherwise a library, macro or IP view is missing. Either way re-running the compile cannot fix it — name the module, the file or view, and the list, and escalate as input_setup
  2. No combinational loops (report_loop)
  3. Scan chains intact (if DFT-enabled compile)
  4. Power/ground connections correct (tie cells, well ties)
  5. Formal equivalence check (RTL vs netlist): PASS required

LEC Requirements

  • Golden: RTL (post-lint, post-CDC-clean)
  • Revised: gate-level netlist
  • Result: all points EQUIVALENT
  • Any UNMATCHED point: must be resolved before PD

QoR Metrics to Evaluate

  • LEC: 100% EQUIVALENT
  • No black boxes
  • No combinational loops
  • Scan chain integrity: verified

Output Required

  • LEC report (pass/fail)
  • Netlist QC checklist
  • Final gate netlist (ready for PD)
  • Back-annotated SDC for PD

Stage: synthesis_signoff

Sign-off Checklist

  • WNS ≥ design_state.constraints.timing.wns_ns_target at all required corners (default: 0)
  • TNS = design_state.constraints.timing.tns_ns_target (default: 0)
  • Area within design_state.constraints.area.area_um2 budget
  • Power within design_state.constraints.power.power_mw budget
  • LEC: EQUIVALENT
  • No black boxes
  • No combinational loops
  • Scan chains verified (if DFT)

Output Required

  • PD handoff package: netlist, SDC, timing reports, area/power reports

Constraint Validation

See plugins/meta/skills/pipeline-orchestration/SKILL.md §Constraints Schema for the authoritative schema and stage-entry validation rule.

Required at entry (constraint_setup) — hard-fail if missing:

  • constraints.clock.clk_mhz — target clock frequency (drives SDC create_clock)
  • constraints.area.area_um2 — area budget
  • constraints.power.power_mw — power budget

Optional (schema defaults apply when absent):

  • constraints.timing.wns_ns_target (default: 0) — WNS sign-off threshold
  • constraints.timing.tns_ns_target (default: 0) — TNS sign-off threshold
  • constraints.timing.fanout_max (default: 32) — set_max_fanout value
  • constraints.timing.clk_uncertainty_ps (default: null → use 200–500 ps rule-of-thumb)

Memory

Write on stage completion

After each stage completes (regardless of whether an orchestrator session is active), upsert one JSON record in memory/synthesis/experiences.jsonl keyed by run_id. Implement the upsert by rewriting the file: read all existing lines, filter out any record(s) with the same run_id, append the updated record, write the full content back atomically (replace the file). Every record must include a top-level "run_id" field with format synthesis_<YYYYMMDD>_<HHMMSS> (set once at flow start; reuse on each stage update). Set signoff_achieved: false until the final sign-off stage completes.

Run state (write before first stage, update after each stage)

Write memory/synthesis/run_state.md as the first action before launching any tool:

run_id:      synthesis_<YYYYMMDD>_<HHMMSS>
design_name: <design>
tool:        <primary tool>
start_time:  <ISO-8601>
last_stage:  <first stage name>

Update last_stage after each stage completes. This file lets wakeup-loop prompts and resumed sessions identify the correct run without relying on in-memory state. Create the file and parent directories if they do not exist.

Optional: claude-mem index

If mcp__plugin_ecc_memory__add_observations is available in this session, emit each applied fix as an observation to entity chip-design-synthesis-fixes after writing to experiences.jsonl. Skip silently if the tool is absent — JSONL is the canonical record.

Skills enregistrées