From 6c55f93d7bfdc39242c4f001d605c23cfe8dfc9e Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 06:28:30 +0000 Subject: [PATCH 1/7] Add FSiC2026 presentation materials for OpenROAD MCP - Conference abstract (~100 words) with compelling hook - Presenter script with timing guide (~7-8 min + Q&A) - HTML slides with company logos - Logo assets for Precision Innovations and OpenROAD Co-Authored-By: Claude Opus 4.6 --- .../FSiC2026_OpenROAD_MCP_Abstract.md | 17 + presentation/FSiC2026_OpenROAD_MCP_Script.txt | 298 ++++++++++++++++ presentation/openroad_logo.png | Bin 0 -> 11972 bytes presentation/precision_favicon.png | Bin 0 -> 7338 bytes presentation/precision_logo.png | Bin 0 -> 29326 bytes presentation/slides.html | 333 ++++++++++++++++++ 6 files changed, 648 insertions(+) create mode 100644 presentation/FSiC2026_OpenROAD_MCP_Abstract.md create mode 100644 presentation/FSiC2026_OpenROAD_MCP_Script.txt create mode 100644 presentation/openroad_logo.png create mode 100644 presentation/precision_favicon.png create mode 100644 presentation/precision_logo.png create mode 100644 presentation/slides.html diff --git a/presentation/FSiC2026_OpenROAD_MCP_Abstract.md b/presentation/FSiC2026_OpenROAD_MCP_Abstract.md new file mode 100644 index 0000000..6c9a345 --- /dev/null +++ b/presentation/FSiC2026_OpenROAD_MCP_Abstract.md @@ -0,0 +1,17 @@ +# OpenROAD MCP: Let AI Close Your Timing + +## Abstract + +You're staring at debug logs. 23 setup violations. WNS is -0.05 ns. You know the answer is in the constraints, but confirming that means reading critical paths, adjusting SDC, re-running the flow — an hour of mechanical work. + +OpenROAD MCP breaks this loop. It's an MCP server that lets AI assistants like Claude Code talk directly to a live OpenROAD process. Ask "Why is my design failing timing?" and the AI loads your design, analyzes critical paths, and returns a diagnosis — all in one conversation. + +Built with PTY-based sessions for authentic terminal behavior, OpenROAD MCP enables natural language interaction with chip design tools, lowering the barrier for engineers unfamiliar with Tcl scripting and complex EDA workflows. + +--- + +**Format:** 10 minutes (including questions) + +**Presenter:** Jack Luar + +**Keywords:** OpenROAD, MCP, AI, EDA, chip design, open source diff --git a/presentation/FSiC2026_OpenROAD_MCP_Script.txt b/presentation/FSiC2026_OpenROAD_MCP_Script.txt new file mode 100644 index 0000000..5ea8b83 --- /dev/null +++ b/presentation/FSiC2026_OpenROAD_MCP_Script.txt @@ -0,0 +1,298 @@ +================================================================================ +OPENROAD MCP: AI-POWERED CHIP DESIGN THROUGH MODEL CONTEXT PROTOCOL +Free Silicon Conference 2026 - Presentation Script +================================================================================ + +PRESENTER: Jack Luar +DURATION: ~7-8 minutes presentation + 2-3 minutes Q&A +TOTAL: 10 minutes + +================================================================================ +TIMING GUIDE +================================================================================ + +[00:00 - 00:45] Introduction & Problem Statement (Slides 1-2) +[00:45 - 01:30] Solution Overview (Slides 3-4) +[01:30 - 02:30] Architecture & Features (Slides 5-6) +[02:30 - 04:00] Demo & Security (Slides 7-8) +[04:00 - 05:00] Innovations & Use Cases (Slides 9-10) +[05:00 - 06:00] Roadmap & Call to Action (Slides 11-12) +[06:00 - 06:30] Summary & Questions (Slides 13-14) +[06:30 - 10:00] Q&A Session + +================================================================================ +FULL SCRIPT +================================================================================ + +-------------------------------------------------------------------------------- +[SLIDE 1: TITLE] - 15 seconds +-------------------------------------------------------------------------------- + +Good morning everyone. Thank you for having me at FSiC 2026. + +My name is Jack Luar, and today I'm excited to present OpenROAD MCP — a project +that bridges AI assistants with open-source chip design tools. + +-------------------------------------------------------------------------------- +[SLIDE 2: THE PROBLEM] - 30 seconds +-------------------------------------------------------------------------------- + +Here's a situation every VLSI engineer knows. + +You're staring at debug logs. 23 setup violations. WNS is -0.05 ns. The clock +period is 0.46 ns and the design just won't close. + +You already know the answer is probably in the constraints. But confirming that +means reading critical paths, estimating what the design can achieve, adjusting +the SDC, re-running the flow, and checking again. An hour of mechanical work to +answer a question you could have answered in thirty seconds if someone handed +you the right report. + +That's the loop I wanted to break. + +-------------------------------------------------------------------------------- +[SLIDE 3: THE SOLUTION] - 20 seconds +-------------------------------------------------------------------------------- + +That's exactly what OpenROAD MCP enables. + +It's a Model Context Protocol server that sits between AI assistants like Claude +or Gemini and the OpenROAD chip design flow. It allows natural language +interaction with your design tools. + +The best part? It's open source and works with any MCP-compatible AI client. + +-------------------------------------------------------------------------------- +[SLIDE 4: WHAT IS MCP?] - 25 seconds +-------------------------------------------------------------------------------- + +For those unfamiliar, the Model Context Protocol is a standardized way for AI +assistants to interact with external tools. It's developed by Anthropic and is +rapidly gaining adoption in the industry. + +Think of it as a universal adapter — once you build an MCP server, any +MCP-compatible AI can use it. The communication is JSON-RPC based, making it +language-agnostic and easy to integrate. + +-------------------------------------------------------------------------------- +[SLIDE 5: ARCHITECTURE] - 30 seconds +-------------------------------------------------------------------------------- + +Here's how OpenROAD MCP works under the hood. + +OpenROAD expects an interactive terminal. Using a plain subprocess pipe gives +you buffering issues, broken prompts, and unreliable output. Instead, we create +a PTY — a pseudo-terminal — for each session. OpenROAD sees a real terminal +and behaves exactly as it would in an interactive shell. + +Sessions persist across commands. You load LEF, then Liberty, then Verilog, +then SDC — building up design state exactly as you would manually. And the +SessionManager can hold multiple concurrent sessions, which matters for design +space exploration: run the same design with three SDC variants in parallel, +collect the results, pick the winner. + +-------------------------------------------------------------------------------- +[SLIDE 6: CORE FEATURES] - 20 seconds +-------------------------------------------------------------------------------- + +Let me quickly walk through the core features: + +You can create interactive OpenROAD sessions that persist across commands, +execute Tcl commands with configurable timeouts, visualize design reports like +placement and routing images, and manage multiple sessions simultaneously. + +Everything you'd normally do in OpenROAD, but now accessible through an AI +assistant. + +-------------------------------------------------------------------------------- +[SLIDE 7: LIVE DEMO CONCEPT] - 45 seconds +-------------------------------------------------------------------------------- + +Let me show you a real example you can run yourself. + +The nangate45/gcd design ships with a 0.46 ns clock constraint that fails timing +out of the box — 23 setup violations, WNS is -0.05 ns. + +With OpenROAD MCP installed, you open Claude Code and type: +"Create an OpenROAD session, load the nangate45 GCD design from ORFS, and tell +me where the timing failures are." + +The AI loads the design, runs report_checks and report_clock_min_period, reads +the critical path output, and comes back with a diagnosis: "The 0.46 ns clock +period is too aggressive. The minimum achievable period is approximately 0.51 ns. +I recommend relaxing the constraint to 0.52 ns." + +You tell it to make the change. It updates the SDC, reruns the flow, and reports +back: WNS is now ~0.00 ns, timing passed. That whole loop — load, analyze, +diagnose, fix, verify — in one conversation. + +[NOTE: Demo files are in demo/orfs-gcd-timing/ in the repo if audience asks.] + +-------------------------------------------------------------------------------- +[SLIDE 8: SECURITY MODEL] - 45 seconds +-------------------------------------------------------------------------------- + +Now, you might be thinking: "This sounds dangerous. An AI executing commands on +my chip design?" + +That's a valid concern, and we've designed security as a first-class feature. + +We use a deny-by-default whitelist approach. Safe commands like report_timing, +get_cells, set_property — these execute immediately. But potentially dangerous +commands like exec, source, or exit — the AI has to ask for your explicit +confirmation before running them. + +We call this the "permission-ask" model. Instead of blocking outright, the AI +returns a message saying "I need your permission to run this command." This +balances security with usability — you stay in control while still getting +AI assistance. + +-------------------------------------------------------------------------------- +[SLIDE 9: UNIQUE INNOVATIONS] - 30 seconds +-------------------------------------------------------------------------------- + +What makes OpenROAD MCP unique? + +First, it's the first MCP server specifically designed for EDA and chip design. + +Second, we use true pseudo-terminal emulation, not just pipe-based I/O. This +means interactive programs that require real terminal behavior work correctly. + +Third, our permission-ask security model is innovative for AI agents. + +Fourth, we have deep integration with OpenROAD-flow-scripts, automatically +discovering designs and platforms. + +And fifth, it's production-ready with over 80% test coverage. + +-------------------------------------------------------------------------------- +[SLIDE 10: USE CASES] - 30 seconds +-------------------------------------------------------------------------------- + +Who benefits from this? + +Junior engineers can learn OpenROAD with AI guidance — asking questions like +"What does this timing report mean?" + +Senior engineers can debug timing violations faster by having AI analyze +reports and suggest fixes. + +CAD teams can build AI-powered automation on top of the MCP layer. + +And researchers can explore AI-assisted hardware design with a standardized +interface. + +-------------------------------------------------------------------------------- +[SLIDE 11: ROADMAP] - 20 seconds +-------------------------------------------------------------------------------- + +What's next for OpenROAD MCP? + +For version 0.2, we're working on complete RTL-to-GDS flow orchestration, +design space exploration, and real-time monitoring during long runs. + +Looking further ahead, we plan machine learning integration for optimization +and multi-objective design exploration. + +-------------------------------------------------------------------------------- +[SLIDE 12: GET INVOLVED] - 15 seconds +-------------------------------------------------------------------------------- + +I encourage you to try it today. + +Installation is just a pip install. Use it with Claude Code or Gemini CLI. +The code is on GitHub, open source under MIT license. + +Contributions and feedback are always welcome. + +-------------------------------------------------------------------------------- +[SLIDE 13: SUMMARY] - 15 seconds +-------------------------------------------------------------------------------- + +To summarize: + +OpenROAD MCP bridges AI assistants with chip design, provides a natural +language interface to OpenROAD, uses a security-first design, is production- +ready and open source. + +-------------------------------------------------------------------------------- +[SLIDE 14: QUESTIONS] - Transition to Q&A +-------------------------------------------------------------------------------- + +Thank you for your attention. I'm happy to take any questions. + +[PAUSE FOR Q&A] + +-------------------------------------------------------------------------------- +ANTICIPATED Q&A QUESTIONS & ANSWERS +-------------------------------------------------------------------------------- + +Q1: What OpenROAD versions are supported? +A1: We support OpenROAD 2.0 and later. The MCP server detects the version + automatically and adjusts behavior accordingly. + +Q2: Can this work with other EDA tools besides OpenROAD? +A2: The architecture is designed to be extensible. While we currently focus on + OpenROAD, the same pattern could be applied to other Tcl-based EDA tools + with minimal modifications. + +Q3: How does the PTY approach compare to simple pipe-based I/O? +A3: PTY emulation is essential for programs that check terminal properties, + like readline-based tools or programs that produce colored output. It also + handles interactive prompts correctly, which pipes cannot do. + +Q4: What's the performance overhead? +A4: Minimal. The async architecture and circular buffers keep overhead under + 5% for typical workloads. Session creation takes about 100-200ms. + +Q5: Is there support for remote OpenROAD instances? +A5: Currently, we support local OpenROAD instances. SSH tunneling or remote + execution is on the roadmap for v0.3. + +Q6: How do you handle long-running synthesis or routing jobs? +A6: Commands have configurable timeouts (default 30 seconds). For long jobs, + you can set longer timeouts or implement polling patterns using the + session inspection tools. + +Q7: What AI models work best with OpenROAD MCP? +A7: Claude 3.5+ and Gemini 2.0+ work excellently due to their strong + instruction following and code understanding. The MCP protocol is model- + agnostic, so any MCP-compatible client works. + +Q8: Can multiple users share the same MCP server? +A8: The current design is single-user per server instance. For multi-user + scenarios, we recommend running separate instances or implementing an + HTTP transport layer (planned for future releases). + +================================================================================ +PRESENTER NOTES +================================================================================ + +BEFORE THE TALK: +- Test laptop connection to projector +- Have backup PDF of slides +- Bring clicker/remote if available +- Test any live demo beforehand +- Have water nearby + +DURING THE TALK: +- Maintain eye contact +- Speak slowly and clearly +- Use hand gestures when explaining architecture +- Pause after key points +- Watch time — don't overrun + +IF THINGS GO WRONG: +- If live demo fails: Say "Let me show you the concept instead" and use the + code examples +- If projector fails: Offer to present from your laptop screen +- If running out of time: Skip detailed demo, go straight to summary + +AFTER THE TALK: +- Thank the organizers +- Offer to continue discussions during break +- Share contact information for follow-up + +================================================================================ +END OF SCRIPT +================================================================================ diff --git a/presentation/openroad_logo.png b/presentation/openroad_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb28c4ffd65cb43563408a59aec9091a1cf2f66 GIT binary patch literal 11972 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 literal 0 HcmV?d00001 diff --git a/presentation/precision_logo.png b/presentation/precision_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b6802348b8a18c764b9916d1170044b6fc9a9ac3 GIT binary patch literal 29326 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 literal 0 HcmV?d00001 diff --git a/presentation/slides.html b/presentation/slides.html new file mode 100644 index 0000000..b6bb72a --- /dev/null +++ b/presentation/slides.html @@ -0,0 +1,333 @@ + + + + + OpenROAD MCP - FSiC 2026 + + + + + +
+
+

OpenROAD MCP

+

Bridging AI Assistants with Open-Source Chip Design

+

Jack Luar

+

Free Silicon Conference 2026

+
+ +
+ + +
+

The Problem: Chip Design is Hard

+
    +
  • Steep learning curve for EDA tools
  • +
  • Complex multi-stage flows: Synthesis → Placement → Routing → Timing Closure
  • +
  • Tcl scripting expertise required
  • +
  • Debugging is time-consuming
  • +
  • No natural language interface exists
  • +
+
"Why is my chip failing timing?" — A question every designer asks
+ +
+ + +
+

The Solution: OpenROAD MCP

+

An AI-Friendly Bridge to OpenROAD

+
    +
  • Model Context Protocol (MCP) server for OpenROAD
  • +
  • Enables natural language interaction with chip design tools
  • +
  • Works with Claude Code, Gemini CLI, and any MCP-compatible client
  • +
  • Open source and community-driven
  • +
+ +
+ + +
+

What is MCP?

+

Model Context Protocol

+
    +
  • Standardized protocol for AI assistants to interact with external tools
  • +
  • Developed by Anthropic, gaining industry adoption
  • +
  • JSON-RPC based communication
  • +
  • Makes AI agents tool-aware and context-aware
  • +
+
AI Assistant ←→ MCP Server ←→ Your Tools
+ +
+ + +
+

Architecture Overview

+
┌─────────────────┐ MCP Protocol ┌───────────────┐ +│ Claude/Gemini │ ←─────────────────→ │ FastMCP Server│ +└─────────────────┘ (STDIO) └───────┬───────┘ + │ + ▼ + ┌───────────────┐ + │ OpenROAD │ + │ (via PTY) │ + └───────────────┘
+

Key Technologies:

+
    +
  • Linux PTY (Pseudo-Terminal) for true terminal emulation
  • +
  • Async I/O for concurrent sessions
  • +
  • Pydantic models for type safety
  • +
+ +
+ + +
+

Core Features

+ + + + + + + +
FeatureDescription
Interactive SessionsCreate persistent OpenROAD sessions
Command ExecutionRun Tcl commands with timeout support
Report VisualizationView placement, routing, CTS images
Session ManagementMultiple concurrent sessions
Command HistorySearch and review past commands
+ +
+ + +
+

Example Workflow

+
# 1. Create a session
+create_interactive_session()
+
+# 2. Load a design
+interactive_openroad("read_verilog my_design.v")
+
+# 3. Run synthesis
+interactive_openroad("synth_design")
+
+# 4. Check timing
+interactive_openroad("report_timing")
+
+# 5. View results
+list_report_images(platform="sky130", design="my_design")
+ +
+ + +
+

Security Model: Permission-Ask Approach

+

Deny-by-Default Whitelist

+ + + + + +
CategoryExamplesBehavior
Allowedreport_*, get_*, set_*Execute immediately
Blockedexec, source, exitAsk for confirmation
Dangerousfile, socketAlways blocked
+

Why this matters: AI agents can be helpful but cautious

+ +
+ + +
+

Unique Innovations

+

What Makes OpenROAD MCP Special?

+
    +
  1. First MCP server for EDA/chip design
  2. +
  3. True PTY terminal emulation (not just pipe-based)
  4. +
  5. Permission-ask security model for AI agents
  6. +
  7. ORFS integration with automatic design discovery
  8. +
  9. Production-ready: 80%+ test coverage, async architecture
  10. +
+ +
+ + +
+

Use Cases

+

Who Benefits?

+ + + + + + +
UserUse Case
Junior EngineersLearn OpenROAD with AI guidance
Senior EngineersDebug timing violations faster
CAD TeamsBuild AI-powered automation
ResearchersExplore AI-assisted hardware design
+ +
+ + +
+

Roadmap

+

What's Next?

+
+
+

v0.2 Goals:

+
    +
  • Complete RTL-to-GDS flow orchestration
  • +
  • Design space exploration
  • +
  • Real-time monitoring during long runs
  • +
+
+
+

Future Vision:

+
    +
  • Machine learning integration
  • +
  • Multi-objective optimization
  • +
  • Cloud deployment support
  • +
+
+
+ +
+ + +
+

Get Involved

+

Try It Today!

+
# Install
+pip install openroad-mcp
+
+# Use with Claude Code
+claude --mcp-server openroad-mcp
+
+# GitHub
+github.com/your-repo/openroad-mcp
+

Community:

+
    +
  • Open source under MIT license
  • +
  • Contributions welcome
  • +
+ +
+ + +
+

Summary

+

Key Takeaways

+
    +
  1. OpenROAD MCP bridges AI assistants with chip design
  2. +
  3. Natural language interface to OpenROAD
  4. +
  5. Security-first design with permission-ask model
  6. +
  7. Production-ready and open source
  8. +
  9. Community-driven development
  10. +
+ +
+ + +
+
+

Questions?

+

Thank You!

+

+ Contact: Jack Luar

+ GitHub: github.com/your-repo/openroad-mcp

+ Docs: openroad-mcp.readthedocs.io +

+
+ +
+ + + From 66746e664cc00fa3d0ab32fcf83d68079d239349 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 06:32:32 +0000 Subject: [PATCH 2/7] Use white Precision logo on all slides with dark footer bar [skip ci] Co-Authored-By: Claude Opus 4.6 --- presentation/slides.html | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/presentation/slides.html b/presentation/slides.html index b6bb72a..2b3fa13 100644 --- a/presentation/slides.html +++ b/presentation/slides.html @@ -38,8 +38,9 @@ .slide th { background: #f5f5f5; font-weight: 600; } .slide.dark th { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.2); } .slide.dark td { border-color: rgba(255,255,255,0.2); } - .logo-footer { position: absolute; bottom: 25px; left: 50px; display: flex; align-items: center; gap: 25px; } - .logo-footer img { height: 32px; } + .logo-footer { position: absolute; bottom: 0; left: 0; right: 0; background: #1a5f7a; padding: 15px 50px; display: flex; align-items: center; gap: 25px; } + .logo-footer img { height: 28px; } + .dark .logo-footer { background: transparent; position: absolute; bottom: 25px; left: 50px; right: auto; padding: 0; } .center-content { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; text-align: center; } .title-slide .presenter { font-size: 24px; margin-top: 30px; } .title-slide .conference { font-size: 20px; margin-top: 10px; opacity: 0.9; } @@ -91,7 +92,7 @@

The Problem: Chip Design is Hard

"Why is my chip failing timing?" — A question every designer asks
@@ -107,7 +108,7 @@

An AI-Friendly Bridge to OpenROAD

  • Open source and community-driven
  • @@ -124,7 +125,7 @@

    Model Context Protocol

    AI Assistant ←→ MCP Server ←→ Your Tools
    @@ -148,7 +149,7 @@

    Key Technologies:

  • Pydantic models for type safety
  • @@ -165,7 +166,7 @@

    Core Features

    Command HistorySearch and review past commands @@ -188,7 +189,7 @@

    Example Workflow

    # 5. View results list_report_images(platform="sky130", design="my_design") @@ -205,7 +206,7 @@

    Deny-by-Default Whitelist

    Why this matters: AI agents can be helpful but cautious

    @@ -222,7 +223,7 @@

    What Makes OpenROAD MCP Special?

  • Production-ready: 80%+ test coverage, async architecture
  • @@ -239,7 +240,7 @@

    Who Benefits?

    ResearchersExplore AI-assisted hardware design @@ -267,7 +268,7 @@

    Future Vision:

    @@ -290,7 +291,7 @@

    Try It Today!

  • Contributions welcome
  • @@ -307,7 +308,7 @@

    Key Takeaways

  • Community-driven development
  • From 8480d730362aa1bc6344d88f8b47ca531fe2aa6d Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 06:36:20 +0000 Subject: [PATCH 3/7] Rewrite abstract in formal academic tone [skip ci] Co-Authored-By: Claude Opus 4.6 --- presentation/FSiC2026_OpenROAD_MCP_Abstract.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/presentation/FSiC2026_OpenROAD_MCP_Abstract.md b/presentation/FSiC2026_OpenROAD_MCP_Abstract.md index 6c9a345..bf361cd 100644 --- a/presentation/FSiC2026_OpenROAD_MCP_Abstract.md +++ b/presentation/FSiC2026_OpenROAD_MCP_Abstract.md @@ -2,11 +2,13 @@ ## Abstract -You're staring at debug logs. 23 setup violations. WNS is -0.05 ns. You know the answer is in the constraints, but confirming that means reading critical paths, adjusting SDC, re-running the flow — an hour of mechanical work. +Timing closure remains one of the most time-consuming aspects of digital design, often requiring engineers to manually analyze critical paths, iterate on SDC constraints, and repeatedly run the implementation flow. This talk introduces OpenROAD MCP, a Model Context Protocol server that enables AI assistants to interact directly with OpenROAD through natural language. -OpenROAD MCP breaks this loop. It's an MCP server that lets AI assistants like Claude Code talk directly to a live OpenROAD process. Ask "Why is my design failing timing?" and the AI loads your design, analyzes critical paths, and returns a diagnosis — all in one conversation. +OpenROAD MCP bridges large language models with the OpenROAD RTL-to-GDS flow using Linux pseudo-terminals (PTY) for authentic terminal emulation. The server exposes tools for session management, Tcl command execution, and design visualization, allowing engineers to query timing reports, analyze violations, and iterate on constraints conversationally. -Built with PTY-based sessions for authentic terminal behavior, OpenROAD MCP enables natural language interaction with chip design tools, lowering the barrier for engineers unfamiliar with Tcl scripting and complex EDA workflows. +A key design feature is the permission-ask security model: safe commands execute immediately while potentially destructive operations require explicit user approval. This approach balances AI-assisted productivity with user control. + +This presentation demonstrates OpenROAD MCP through a practical timing closure workflow and discusses its applicability for engineers learning EDA tools, senior designers debugging complex designs, and researchers exploring AI-assisted hardware design. --- From 27cc0bd4b0602cff152fdbbfc81233bb1afe0a60 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 06:41:07 +0000 Subject: [PATCH 4/7] Fix logo consistency: dark footer on all slides, white bg for OpenROAD logo [skip ci] Co-Authored-By: Claude Opus 4.6 --- presentation/slides.html | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/presentation/slides.html b/presentation/slides.html index 2b3fa13..5c32726 100644 --- a/presentation/slides.html +++ b/presentation/slides.html @@ -40,7 +40,7 @@ .slide.dark td { border-color: rgba(255,255,255,0.2); } .logo-footer { position: absolute; bottom: 0; left: 0; right: 0; background: #1a5f7a; padding: 15px 50px; display: flex; align-items: center; gap: 25px; } .logo-footer img { height: 28px; } - .dark .logo-footer { background: transparent; position: absolute; bottom: 25px; left: 50px; right: auto; padding: 0; } + .logo-footer .openroad-logo { background: #fff; padding: 4px 8px; border-radius: 4px; height: 24px; } .center-content { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; text-align: center; } .title-slide .presenter { font-size: 24px; margin-top: 30px; } .title-slide .conference { font-size: 20px; margin-top: 10px; opacity: 0.9; } @@ -75,8 +75,8 @@

    Bridging AI Assistants with Open-Source Chip Design

    Free Silicon Conference 2026

    @@ -93,7 +93,7 @@

    The Problem: Chip Design is Hard

    "Why is my chip failing timing?" — A question every designer asks
    @@ -109,7 +109,7 @@

    An AI-Friendly Bridge to OpenROAD

    @@ -126,7 +126,7 @@

    Model Context Protocol

    AI Assistant ←→ MCP Server ←→ Your Tools
    @@ -150,7 +150,7 @@

    Key Technologies:

    @@ -167,7 +167,7 @@

    Core Features

    @@ -190,7 +190,7 @@

    Example Workflow

    list_report_images(platform="sky130", design="my_design") @@ -207,7 +207,7 @@

    Deny-by-Default Whitelist

    Why this matters: AI agents can be helpful but cautious

    @@ -224,7 +224,7 @@

    What Makes OpenROAD MCP Special?

    @@ -241,7 +241,7 @@

    Who Benefits?

    @@ -269,7 +269,7 @@

    Future Vision:

    @@ -292,7 +292,7 @@

    Try It Today!

    @@ -309,7 +309,7 @@

    Key Takeaways

    @@ -325,8 +325,8 @@

    Thank You!

    From 0467570db591a3bf0d2a532a0b4fff0132ea1104 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 06:52:07 +0000 Subject: [PATCH 5/7] Update slides: page numbers, fix URLs, rewrite use cases with actual demo [skip ci] - Add page numbers (X / 14) to all slides - Update GitHub URL to github.com/luarss/openroad-mcp - Remove non-existent readthedocs link - Fix license to Apache 2.0 - Remove "first MCP server for EDA" claim - Rewrite Use Cases with actual GCD timing demo case study Co-Authored-By: Claude Opus 4.6 --- presentation/slides.html | 42 +++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/presentation/slides.html b/presentation/slides.html index 5c32726..2496d81 100644 --- a/presentation/slides.html +++ b/presentation/slides.html @@ -41,6 +41,7 @@ .logo-footer { position: absolute; bottom: 0; left: 0; right: 0; background: #1a5f7a; padding: 15px 50px; display: flex; align-items: center; gap: 25px; } .logo-footer img { height: 28px; } .logo-footer .openroad-logo { background: #fff; padding: 4px 8px; border-radius: 4px; height: 24px; } + .page-number { position: absolute; bottom: 20px; right: 50px; color: rgba(255,255,255,0.7); font-size: 14px; } .center-content { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100%; text-align: center; } .title-slide .presenter { font-size: 24px; margin-top: 30px; } .title-slide .conference { font-size: 20px; margin-top: 10px; opacity: 0.9; } @@ -78,6 +79,7 @@

    Bridging AI Assistants with Open-Source Chip Design

    Precision Innovations +
    1 / 14
    @@ -95,6 +97,7 @@

    The Problem: Chip Design is Hard

    Precision Innovations +
    2 / 14
    @@ -111,6 +114,7 @@

    An AI-Friendly Bridge to OpenROAD

    Precision Innovations +
    3 / 14
    @@ -128,6 +132,7 @@

    Model Context Protocol

    Precision Innovations +
    4 / 14
    @@ -152,6 +157,7 @@

    Key Technologies:

    Precision Innovations +
    5 / 14
    @@ -169,6 +175,7 @@

    Core Features

    Precision Innovations +
    6 / 14
    @@ -192,6 +199,7 @@

    Example Workflow

    Precision Innovations +
    7 / 14
    @@ -209,6 +217,7 @@

    Deny-by-Default Whitelist

    Precision Innovations +
    8 / 14
    @@ -216,7 +225,7 @@

    Deny-by-Default Whitelist

    Unique Innovations

    What Makes OpenROAD MCP Special?

      -
    1. First MCP server for EDA/chip design
    2. +
    3. MCP server for OpenROAD with natural language interface
    4. True PTY terminal emulation (not just pipe-based)
    5. Permission-ask security model for AI agents
    6. ORFS integration with automatic design discovery
    7. @@ -226,23 +235,31 @@

      What Makes OpenROAD MCP Special?

      Precision Innovations +
      9 / 14

      Use Cases

      -

      Who Benefits?

      +

      Demo: GCD Timing Closure

      - - - - - + + + +
      UserUse Case
      Junior EngineersLearn OpenROAD with AI guidance
      Senior EngineersDebug timing violations faster
      CAD TeamsBuild AI-powered automation
      ResearchersExplore AI-assisted hardware design
      MetricBeforeAfter
      WNS-0.05 ns~0.00 ns
      Setup Violations234 (negligible)
      StatusFAILEDPASSED
      +

      Workflow:

      +
        +
      • AI loads nangate45/gcd design from ORFS
      • +
      • Runs report_clock_min_period → achieves 0.51 ns
      • +
      • Relaxes constraint from 0.46 ns to 0.52 ns
      • +
      • Full demo: demo/orfs-gcd-timing/
      • +
      +
      10 / 14
      @@ -271,6 +288,7 @@

      Future Vision:

      Precision Innovations +
      11 / 14
      @@ -284,16 +302,17 @@

      Try It Today!

      claude --mcp-server openroad-mcp # GitHub -github.com/your-repo/openroad-mcp +github.com/luarss/openroad-mcp

      Community:

        -
      • Open source under MIT license
      • +
      • Open source under Apache 2.0 license
      • Contributions welcome
      +
      12 / 14
      @@ -311,6 +330,7 @@

      Key Takeaways

      Precision Innovations +
      13 / 14
      @@ -320,14 +340,14 @@

      Questions?

      Thank You!

      Contact: Jack Luar

      - GitHub: github.com/your-repo/openroad-mcp

      - Docs: openroad-mcp.readthedocs.io + GitHub: github.com/luarss/openroad-mcp

      +
      14 / 14
      From ccdf68bbad827b9867b35e7dddfb3834d917f182 Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 06:55:34 +0000 Subject: [PATCH 6/7] Fix installation instructions in Get Involved slide [skip ci] Use actual uvx-based install command from README instead of incorrect pip Co-Authored-By: Claude Opus 4.6 --- presentation/slides.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/presentation/slides.html b/presentation/slides.html index 2496d81..2b3c2bc 100644 --- a/presentation/slides.html +++ b/presentation/slides.html @@ -295,11 +295,9 @@

      Future Vision:

      Get Involved

      Try It Today!

      -
      # Install
      -pip install openroad-mcp
      -
      -# Use with Claude Code
      -claude --mcp-server openroad-mcp
      +    
      # Add to Claude Code
      +claude mcp add --transport stdio openroad-mcp -- \
      +  uvx --from git+https://github.com/luarss/openroad-mcp openroad-mcp
       
       # GitHub
       github.com/luarss/openroad-mcp
      From daa5b0a383867f0743047f843f0e346672351bfe Mon Sep 17 00:00:00 2001 From: Jack Luar <39641663+luarss@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:03:26 +0000 Subject: [PATCH 7/7] Move presentation files to demo/fsic2026, update timing demo README [skip ci] - Move all FSiC2026 presentation files from presentation/ to demo/fsic2026/ - Update orfs-gcd-timing README with correct paths and verified metrics - Confirmed timing demo works: 0.46ns fails (WNS -0.05ns), 0.52ns passes Co-Authored-By: Claude Opus 4.6 --- .../FSiC2026_OpenROAD_MCP_Abstract.md | 0 .../FSiC2026_OpenROAD_MCP_Script.txt | 47 ++++++++---------- .../fsic2026}/openroad_logo.png | Bin .../fsic2026}/precision_favicon.png | Bin .../fsic2026}/precision_logo.png | Bin {presentation => demo/fsic2026}/slides.html | 0 demo/orfs-gcd-timing/README.md | 12 ++--- 7 files changed, 26 insertions(+), 33 deletions(-) rename {presentation => demo/fsic2026}/FSiC2026_OpenROAD_MCP_Abstract.md (100%) rename {presentation => demo/fsic2026}/FSiC2026_OpenROAD_MCP_Script.txt (89%) rename {presentation => demo/fsic2026}/openroad_logo.png (100%) rename {presentation => demo/fsic2026}/precision_favicon.png (100%) rename {presentation => demo/fsic2026}/precision_logo.png (100%) rename {presentation => demo/fsic2026}/slides.html (100%) diff --git a/presentation/FSiC2026_OpenROAD_MCP_Abstract.md b/demo/fsic2026/FSiC2026_OpenROAD_MCP_Abstract.md similarity index 100% rename from presentation/FSiC2026_OpenROAD_MCP_Abstract.md rename to demo/fsic2026/FSiC2026_OpenROAD_MCP_Abstract.md diff --git a/presentation/FSiC2026_OpenROAD_MCP_Script.txt b/demo/fsic2026/FSiC2026_OpenROAD_MCP_Script.txt similarity index 89% rename from presentation/FSiC2026_OpenROAD_MCP_Script.txt rename to demo/fsic2026/FSiC2026_OpenROAD_MCP_Script.txt index 5ea8b83..15f52e1 100644 --- a/presentation/FSiC2026_OpenROAD_MCP_Script.txt +++ b/demo/fsic2026/FSiC2026_OpenROAD_MCP_Script.txt @@ -105,28 +105,20 @@ Everything you'd normally do in OpenROAD, but now accessible through an AI assistant. -------------------------------------------------------------------------------- -[SLIDE 7: LIVE DEMO CONCEPT] - 45 seconds +[SLIDE 7: EXAMPLE WORKFLOW] - 30 seconds -------------------------------------------------------------------------------- -Let me show you a real example you can run yourself. +Here's what the workflow looks like in practice. -The nangate45/gcd design ships with a 0.46 ns clock constraint that fails timing -out of the box — 23 setup violations, WNS is -0.05 ns. - -With OpenROAD MCP installed, you open Claude Code and type: -"Create an OpenROAD session, load the nangate45 GCD design from ORFS, and tell -me where the timing failures are." +First, you create an interactive session. Then load your design with read_verilog. +Run synthesis, check timing with report_timing, and view the results — including +placement and routing images. -The AI loads the design, runs report_checks and report_clock_min_period, reads -the critical path output, and comes back with a diagnosis: "The 0.46 ns clock -period is too aggressive. The minimum achievable period is approximately 0.51 ns. -I recommend relaxing the constraint to 0.52 ns." +This is all accessible through natural language. You tell the AI what you want +to do, and it translates that into the appropriate OpenROAD commands. -You tell it to make the change. It updates the SDC, reruns the flow, and reports -back: WNS is now ~0.00 ns, timing passed. That whole loop — load, analyze, -diagnose, fix, verify — in one conversation. - -[NOTE: Demo files are in demo/orfs-gcd-timing/ in the repo if audience asks.] +The key insight is that sessions persist — you build up design state across +multiple commands, just like you would in an interactive OpenROAD shell. -------------------------------------------------------------------------------- [SLIDE 8: SECURITY MODEL] - 45 seconds @@ -166,21 +158,22 @@ discovering designs and platforms. And fifth, it's production-ready with over 80% test coverage. -------------------------------------------------------------------------------- -[SLIDE 10: USE CASES] - 30 seconds +[SLIDE 10: USE CASES / DEMO] - 30 seconds -------------------------------------------------------------------------------- -Who benefits from this? +Let me show you a real use case: the GCD timing closure demo. -Junior engineers can learn OpenROAD with AI guidance — asking questions like -"What does this timing report mean?" +The nangate45/gcd design ships with a 0.46 ns clock constraint that fails timing +out of the box — 23 setup violations, WNS is -0.05 ns, status FAILED. -Senior engineers can debug timing violations faster by having AI analyze -reports and suggest fixes. +Using OpenROAD MCP, the AI loads the design, runs report_clock_min_period, and +finds the minimum achievable period is 0.51 ns. It recommends relaxing the +constraint to 0.52 ns. -CAD teams can build AI-powered automation on top of the MCP layer. +After the change: WNS is ~0.00 ns, only 4 negligible violations remain, and +timing PASSES. -And researchers can explore AI-assisted hardware design with a standardized -interface. +The full demo is available in the demo/orfs-gcd-timing/ directory in the repo. -------------------------------------------------------------------------------- [SLIDE 11: ROADMAP] - 20 seconds @@ -201,7 +194,7 @@ and multi-objective design exploration. I encourage you to try it today. Installation is just a pip install. Use it with Claude Code or Gemini CLI. -The code is on GitHub, open source under MIT license. +The code is on GitHub, open source under Apache 2.0 license. Contributions and feedback are always welcome. diff --git a/presentation/openroad_logo.png b/demo/fsic2026/openroad_logo.png similarity index 100% rename from presentation/openroad_logo.png rename to demo/fsic2026/openroad_logo.png diff --git a/presentation/precision_favicon.png b/demo/fsic2026/precision_favicon.png similarity index 100% rename from presentation/precision_favicon.png rename to demo/fsic2026/precision_favicon.png diff --git a/presentation/precision_logo.png b/demo/fsic2026/precision_logo.png similarity index 100% rename from presentation/precision_logo.png rename to demo/fsic2026/precision_logo.png diff --git a/presentation/slides.html b/demo/fsic2026/slides.html similarity index 100% rename from presentation/slides.html rename to demo/fsic2026/slides.html diff --git a/demo/orfs-gcd-timing/README.md b/demo/orfs-gcd-timing/README.md index 4e92649..6da9ac7 100644 --- a/demo/orfs-gcd-timing/README.md +++ b/demo/orfs-gcd-timing/README.md @@ -6,8 +6,8 @@ This demo shows how to fix timing violations in the nangate45/gcd design by rela ## Problem Statement The default nangate45/gcd configuration has timing violations: - **WNS (Worst Negative Slack)**: -0.05 ns -- **TNS (Total Negative Slack)**: -0.53 ns -- **Setup violations**: 23 paths +- **TNS (Total Negative Slack)**: -0.57 ns +- **Setup violations**: 33 paths - **Target clock period**: 0.46 ns (too aggressive) - **Achievable clock period**: ~0.51 ns @@ -106,7 +106,7 @@ set_output_delay [expr $clk_period * $clk_io_pct] -clock $clk_name [all_outputs] 2. **Copy improved constraint to ORFS**: ```bash - cp /home/luars/openroad-mcp/demo/orfs-gcd-timing/configs/improved_timing.sdc \ + cp /home/luars/fsf-conference/demo/orfs-gcd-timing/configs/improved_timing.sdc \ /home/luars/OpenROAD-flow-scripts/flow/designs/nangate45/gcd/constraint_relaxed.sdc ``` @@ -133,7 +133,7 @@ set_output_delay [expr $clk_period * $clk_io_pct] -clock $clk_name [all_outputs] Use the provided `run_demo.sh` script: ```bash -cd /home/luars/openroad-mcp/demo/orfs-gcd-timing +cd /home/luars/fsf-conference/demo/orfs-gcd-timing ./run_demo.sh ``` @@ -274,8 +274,8 @@ When helping users with timing closure in OpenROAD: Clock Period: 0.46 ns Target Frequency: 2174 MHz WNS: -0.05 ns ❌ -TNS: -0.53 ns ❌ -Setup Violations: 23 ❌ +TNS: -0.57 ns ❌ +Setup Violations: 33 ❌ Status: FAILED ```