Skip to content

EDA Team: IHP SG13G2 PDK Support

Four engineers supporting the IHP SG13G2 130nm BiCMOS PDK collaborate across different agent tools on a shared context store. They are preparing designs for an MPW shuttle run, where a PDK fix discovered by one engineer ripples into another's design flow -- shared context makes the impact visible and actionable across tools.

  • Lukas -- Claude Code: PDK cell library, device characterization, model updates
  • Amira -- Cursor: LibreLane design flow, chip tapeout, timing closure
  • Jan -- Gemini: DRC/LVS rule development, verification
  • Sofia -- OpenCode: Analog design (xschem), bandgap and LNA simulation

Setup

Lukas initializes the project

cd ~/designs/sg13g2-shuttle
context-teleport init --name sg13g2-shuttle --repo-url git@github.com:team/sg13g2-shuttle.git
context-teleport register claude-code

The team joins

# Amira
cd ~/designs/sg13g2-shuttle
context-teleport register cursor

# Jan
cd ~/designs/sg13g2-shuttle
context-teleport register gemini

# Sofia
cd ~/designs/sg13g2-shuttle
context-teleport register opencode

Import baseline PDK issues

The team pulls in closed issues from the IHP Open PDK repo so every agent starts with known PDK errata and resolved fixes:

context-teleport import github --repo IHP-GmbH/IHP-Open-PDK \
    --state closed --labels sg13g2 --as-decisions --limit 15
Imported 12 issues:
  github-issue-ihp-open-pdk-835: SG13G2 metal stack DRC rule update
  github-issue-ihp-open-pdk-812: Via resistance values corrected
  github-issue-ihp-open-pdk-798: pnpMPA model parameter fix
  ...
  + 9 decision records from closed issues

Load EDA skills from the skills pack

context-teleport skill add debug-drc --file eda-skills-pack/debug-drc/SKILL.md
context-teleport skill add debug-lvs --file eda-skills-pack/debug-lvs/SKILL.md
context-teleport skill add configure-pdn --file eda-skills-pack/configure-pdn/SKILL.md
context-teleport skill add xschem-simulate --file eda-skills-pack/xschem-simulate/SKILL.md
context-teleport sync push -m "Baseline: PDK issues + EDA skills"

Day 1-2: Independent work with cross-pollination

Lukas (Claude Code) -- Via resistance discovery

Lukas characterizes via resistances and finds that the published values for via5 (TopMetal1 to Metal5) are wrong.

Lukas: "I measured via5 resistance across 20 test structures. The PDK
        model says 2.8 ohm but I'm consistently seeing 4.5 ohm. Record this."

Agent: [calls context_add_knowledge(
           key="via5-resistance-measurement",
           content="## Via5 (TopMetal1-Metal5) Resistance\n\nMeasured: 4.5 ohm/via
           (20 structures, wafer lot W24-103)\nPDK model value: 2.8 ohm/via\n
           Delta: +60% -- significant for high-current PDN paths.\n\n
           Source: 4-point Kelvin measurement on MPW-2024Q3 silicon."
       )]
       Saved. (author: mcp:claude-code)

Lukas: "Record the decision to use the corrected value going forward"

Agent: [calls context_record_decision(
           title="Use measured via5 resistance (4.5 ohm) over PDK model value",
           context="via5 resistance measured at 4.5 ohm vs 2.8 ohm in PDK model.
                    60% higher than expected, affects PDN IR-drop and timing.",
           decision="All shuttle designs must use 4.5 ohm/via for via5 in IR-drop
                     analysis. File errata with IHP.",
           consequences="PDN designs need more vias or wider straps to meet IR-drop
                         budget. Timing signoff margins may tighten."
       )]

Lukas: "Push"
Agent: [calls context_sync_push(message="Via5 resistance errata and corrected value")]

This is the ripple that propagates through the team.

Amira (Cursor) -- LibreLane flow and the ripple effect

Amira runs the LibreLane flow for her top-level design and imports the results:

context-teleport import eda config.json
# Imported: librelane-config-shuttle_top

context-teleport import eda results/drc/shuttle_top.rpt
# Imported: drc-summary-shuttle_top (7 violations, 2 categories)

context-teleport import eda results/lvs/shuttle_top.rpt
# Imported: lvs-summary-shuttle_top (MATCH)

context-teleport import eda results/metrics.json
# Imported: librelane-metrics-shuttle_top (area, timing, utilization)

Then she pulls context and gets the via resistance update:

Amira: "Pull context and check for anything new"

Agent: [calls context_sync_pull()]
       Pulled. New from Lukas (claude-code):
         - via5-resistance-measurement
         - Decision: Use measured via5 resistance (4.5 ohm)

       [reads context://knowledge/via5-resistance-measurement]
       [reads context://knowledge/librelane-config-shuttle_top]

       Important: The via5 resistance is 60% higher than the PDK model.
       Your PDN uses via5 for TopMetal1-to-Metal5 power connections.
       With the corrected value, IR-drop on VDD increases from 12mV to
       ~19mV -- close to your 20mV budget.

       I recommend tightening the PDN strap pitch to compensate.

Amira: "Good catch. Tighten the Metal5 strap pitch from 30um to 20um
        and record the decision."

Agent: [calls context_record_decision(
           title="Tighten Metal5 PDN strap pitch from 30um to 20um",
           context="Via5 resistance errata (4.5 vs 2.8 ohm) pushes IR-drop
                    from 12mV to ~19mV against 20mV budget",
           decision="Reduce Metal5 vertical strap pitch from 30um to 20um in
                     pdn.tcl. Increases via5 count per strap intersection.",
           consequences="IR-drop margin restored to ~13mV. Routing utilization
                         increases by ~5%, acceptable at current 52%."
       )]
       [calls context_sync_push(message="PDN strap tightening for via5 errata")]

This is the core cross-domain moment: a PDK measurement in Claude Code produced a design flow decision in Cursor, with full traceability.

Jan (Gemini) -- DRC rule update

Jan receives a foundry bulletin with updated Metal5 density requirements:

Jan: "New density rules from IHP bulletin 2024-Q3-07. Metal5 min density
      goes from 20% to 25%, max stays at 75%. Record it."

Agent: [calls context_add_knowledge(
           key="sg13g2-metal5-density-rules",
           content="## Metal5 Density Rules (Bulletin 2024-Q3-07)\n\n
           - Minimum density: 25% (was 20%)\n- Maximum density: 75%\n
           - Window size: 100x100 um\n- Effective: all tapeouts after 2024-10-01"
       )]

Jan: "Are there other metal stack entries I should know about?"

Agent: [calls context_search(query="metal stack via resistance")]
       Found: via5-resistance-measurement (from claude-code)
       The via5 resistance is 60% higher than the model. This may
       affect DRC rules for via density near power connections.

Jan: "Good, I'll factor that into the via density check rules."
Agent: [calls context_sync_push(message="Metal5 density rules from foundry bulletin")]

Sofia (OpenCode) -- Analog characterization

Sofia is simulating a bandgap reference circuit. She pulls context and evaluates the via resistance impact:

Sofia: "Pull context and summarize what's new"

Agent: [calls context_sync_pull()]
       Updates from the team:
       - Lukas: via5 resistance errata (4.5 ohm vs 2.8 ohm)
       - Amira: PDN strap pitch tightened for IR-drop
       - Jan: Metal5 density rules updated

       For your bandgap circuit: via5 resistance mainly affects
       high-current digital paths. Your bandgap reference current
       is ~10uA, so the IR-drop through via5 is <0.05mV.
       Negligible for your design.

Sofia: "Agreed. Record the pnpMPA characterization results instead."

Agent: [calls context_add_knowledge(
           key="pnpmpa-characterization-w24103",
           content="## pnpMPA Characterization (Wafer W24-103)\n\n
           - Beta: 3.2 (spec: 3.0 typ)\n- Vbe @ 10uA: 648mV @ 27C\n
           - Ideality factor: 1.02\n- CTAT slope: -1.78 mV/C\n
           Consistent with updated model from PDK issue #798."
       )]
       [calls context_sync_push(message="pnpMPA characterization results")]

Day 4: The conflict

Lukas and Jan both update the metal stack reference knowledge at the same time. Lukas adds TopMetal2 slit rules, Jan adds the density bounds.

Lukas pushes first

Lukas: "Add TopMetal2 slit rules to the metal stack reference"

Agent: [calls context_add_knowledge(
           key="sg13g2-metal-stack-reference",
           content="...existing content...\n\n## TopMetal2 Slit Rules\n
           - Required for widths > 10um\n- Slit width: 2um\n
           - Slit spacing: 8um\n- Applies to power bus routing"
       )]
       [calls context_sync_push(message="TopMetal2 slit rules")]
       Pushed.

Jan's push fails

Jan: "Add the updated density bounds to the metal stack reference"

Agent: [calls context_add_knowledge(
           key="sg13g2-metal-stack-reference",
           content="...existing content...\n\n## Metal Density Bounds\n
           - Metal5: 25-75%\n- TopMetal1: 20-80%\n- TopMetal2: 30-70%\n
           - Window: 100x100um for all layers"
       )]
       [calls context_sync_push(message="Metal density bounds")]
       Error: push failed, remote has changes.

Jan: "Pull and resolve"

Agent: [calls context_sync_pull(strategy="agent")]
       Conflict in knowledge/sg13g2-metal-stack-reference.md.

       [calls context_conflict_detail(
           file_path=".context-teleport/knowledge/sg13g2-metal-stack-reference.md"
       )]
       Lukas added a "TopMetal2 Slit Rules" section,
       you added a "Metal Density Bounds" section.
       These are in different ## sections -- merging cleanly.

       [calls context_resolve_conflict(
           file_path="...", content="...merged with both sections..."
       )]
       [calls context_merge_finalize()]
       Merged. Both TopMetal2 slit rules and density bounds preserved.

Section-level merge handled this automatically because the changes were in different ## sections of the same file.

Week 2: Skill evolution

After several flow runs, Jan and Amira find that the debug-drc skill is missing guidance on IHP-specific filler cell density rules -- a common stumbling block.

Rating and feedback

Jan: "The debug-drc skill doesn't mention IHP filler density workarounds.
      That's the first thing I check. Rate it 2."

Agent: [calls context_rate_skill(name="debug-drc", rating=2,
           comment="Missing IHP filler density workaround for Metal5 25% minimum")]
Amira: "Same issue. I spent 30 minutes before realizing I needed FILL_INSERTION.
        Rate it 3."

Agent: [calls context_rate_skill(name="debug-drc", rating=3,
           comment="Should include FILL_INSERTION step for IHP density DRC")]

Identifying the problem

context-teleport skill stats --sort rating
Name              Usage  Avg Rating  Attention
debug-drc             7        2.5   !!
debug-lvs             4        4.2
configure-pdn         5        3.8
xschem-simulate       3        4.0

The debug-drc skill is flagged as needing attention.

Proposing an improvement

Jan: "Propose an improvement to debug-drc that adds the IHP filler density
      workaround as a dedicated section."

Agent: [calls context_propose_skill_improvement(
           name="debug-drc",
           proposed_content="## Debug DRC Failures\n\n...existing steps...\n\n
           ## IHP SG13G2 Density Workarounds\n\n### Metal Fill Insertion\n
           If density violations appear on Metal5 (min 25%):\n
           1. Enable `FILL_INSERTION: true` in LibreLane config\n
           2. Set `FILL_CONFIG` to point to `sg13g2_fill.json`\n
           3. Re-run from floorplan stage\n\n
           ### Filler Cell Placement\n
           For standard cell density:\n
           1. Verify filler cells are in the cell library\n
           2. Check `PLACE_DENSITY` is above 0.6\n
           3. Run `detailed_placement` with `-filler` flag",
           rationale="Two team members rated this skill poorly because IHP
                      density DRC is the most common failure mode and the
                      existing skill doesn't cover it at all."
       )]
       Proposal created: a1b2c3d4

Accepting the proposal

The team lead reviews and accepts:

context-teleport skill proposals --skill debug-drc
# ID          Status   Agent        Rationale (truncated)
# a1b2c3d4   pending  mcp:gemini   Two team members rated poorly...

context-teleport skill apply-proposal debug-drc a1b2c3d4
# Applied proposal a1b2c3d4 to debug-drc
# Diff: +18 lines (new section: IHP SG13G2 Density Workarounds)

Creating a project-specific skill

Lukas creates a shuttle-specific checklist from the team's accumulated experience:

Lukas: "Create a skill for our MPW shuttle pre-tapeout checklist"

Agent: [calls context_add_skill(
           name="mpw-shuttle-checklist",
           description="Pre-tapeout checklist for IHP SG13G2 MPW shuttle",
           instructions="## MPW Shuttle Pre-Tapeout Checklist\n\n
           ### PDK Errata\n- [ ] via5 resistance: use 4.5 ohm (not 2.8)\n
           - [ ] pnpMPA model: verify W24-103 parameters applied\n\n
           ### DRC\n- [ ] Metal5 density >= 25% (bulletin 2024-Q3-07)\n
           - [ ] TopMetal2 slit rules for widths > 10um\n
           - [ ] FILL_INSERTION enabled\n\n
           ### IR-Drop\n- [ ] PDN analysis with corrected via resistances\n
           - [ ] Metal5 strap pitch <= 20um\n- [ ] VDD drop < 20mV\n\n
           ### Signoff\n- [ ] DRC clean\n- [ ] LVS match\n
           - [ ] Liberty corners regenerated with updated models"
       )]
       [calls context_sync_push(message="MPW shuttle checklist skill")]

Session handoff

At the end of the day, Amira wraps up and Lukas picks up where she left off.

Amira closes out

Amira: "Wrap up my session. I finished the PDN rework but timing
        closure on the clock tree still needs another iteration."

Agent: [calls context_update_state(
           current_task="Timing closure on shuttle_top clock tree",
           blockers="Hold time violations on scan chain after PDN rework"
       )]
       [calls context_append_session(
           agent="cursor",
           summary="Completed PDN strap rework (Metal5 pitch 30->20um).
                    IR-drop now 13mV. Re-ran STA -- setup timing clean,
                    but 3 hold violations on scan chain path.",
           knowledge_added="librelane-config-shuttle_top (updated)",
           decisions_added="Tighten Metal5 PDN strap pitch"
       )]
       [calls context_sync_push(message="Amira EOD: PDN rework complete, hold violations remain")]

Lukas picks up

Lukas: "What's the current status? I'm picking up from Amira."

Agent: [uses context_handoff prompt]
       Amira (cursor) finished the PDN strap rework -- Metal5 pitch
       is now 20um, IR-drop is 13mV (under the 20mV budget).

       Remaining blocker: 3 hold time violations on the scan chain
       path after the PDN rework. Setup timing is clean.

       Current task: timing closure on shuttle_top clock tree.

Final snapshot

After two weeks, the shared context store captures the full team's work:

context-teleport summary
Project: sg13g2-shuttle
Knowledge: 14 entries
  - via5-resistance-measurement         (mcp:claude-code)
  - sg13g2-metal-stack-reference        (mcp:claude-code, mcp:gemini)
  - sg13g2-metal5-density-rules         (mcp:gemini)
  - pnpmpa-characterization-w24103      (mcp:opencode)
  - librelane-config-shuttle_top        (mcp:cursor)
  - drc-summary-shuttle_top             (mcp:cursor)
  - lvs-summary-shuttle_top             (mcp:cursor)
  - librelane-metrics-shuttle_top       (mcp:cursor)
  - github-issue-ihp-open-pdk-835       (cli)
  - github-issue-ihp-open-pdk-812       (cli)
  - ...4 more from PDK issues

Decisions: 8 recorded
  - Use measured via5 resistance (4.5 ohm)
  - Tighten Metal5 PDN strap pitch from 30um to 20um
  - (6 from GitHub issues)

Skills: 6 available
  - debug-drc (improved)
  - debug-lvs
  - configure-pdn
  - xschem-simulate
  - mpw-shuttle-checklist
  - sg13g2-pdn-config

Current task: Timing closure on shuttle_top clock tree
Blockers: Hold time violations on scan chain after PDN rework

Key takeaways

Pattern Implementation
Cross-domain propagation PDK via resistance fix (Claude Code) triggers PDN strap decision (Cursor)
EDA artifact import LibreLane config, DRC, LVS, metrics imported as structured knowledge
GitHub issue bridge Closed PDK issues imported as decisions for team baseline
4-tool collaboration Claude Code, Cursor, Gemini, OpenCode sharing one context store
Section-level merge Simultaneous metal stack updates auto-merged by section
Skill feedback loop debug-drc rated poorly, improved via proposal, accepted by team lead
Project-specific skill MPW shuttle checklist distilled from team experience
Agent attribution Every entry tagged with originating tool via MCP_CALLER