<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jack Luar</title>
    <description>The latest articles on DEV Community by Jack Luar (@luarss).</description>
    <link>https://dev.to/luarss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3618093%2Feea86d38-02c5-4b37-b3e2-b60b2e71b6f6.png</url>
      <title>DEV Community: Jack Luar</title>
      <link>https://dev.to/luarss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luarss"/>
    <language>en</language>
    <item>
      <title>OpenROAD MCP: Let AI Close Your Timing</title>
      <dc:creator>Jack Luar</dc:creator>
      <pubDate>Thu, 19 Feb 2026 12:15:02 +0000</pubDate>
      <link>https://dev.to/luarss/openroad-mcp-let-ai-close-your-timing-47h6</link>
      <guid>https://dev.to/luarss/openroad-mcp-let-ai-close-your-timing-47h6</guid>
      <description>&lt;p&gt;Here's a situation every VLSI engineer knows. You're staring at debug logs. There are 23 setup violations. WNS is -0.05 ns. The clock period is 0.46 ns and the design just won't close.&lt;/p&gt;

&lt;p&gt;You already know the answer is probably in the constraints. But confirming that means reading the critical paths, estimating what the design can actually 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 and asked the right question.&lt;/p&gt;

&lt;p&gt;That's the loop I wanted to break. So I built &lt;strong&gt;OpenROAD MCP&lt;/strong&gt; — a server that lets AI assistants like Claude Code talk directly to a live OpenROAD process.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Actually Does
&lt;/h2&gt;

&lt;p&gt;Instead of explaining it abstractly, here's a real example you can run yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo: Closing Timing on nangate45/gcd
&lt;/h3&gt;

&lt;p&gt;The nangate45/gcd design ships with a 0.46 ns clock constraint that fails timing out of the box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WNS: -0.05 ns
TNS: -0.53 ns
Setup violations: 23
Status: FAILED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With OpenROAD MCP installed, open Claude Code and type:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Create an OpenROAD session, load the nangate45 GCD design from ORFS, and tell me where the timing failures are."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI creates a session, loads the design, and runs &lt;code&gt;report_checks&lt;/code&gt; and &lt;code&gt;report_clock_min_period&lt;/code&gt;. It reads the critical path output — the worst offender is a 0.42 ns path through &lt;code&gt;dpath.a_reg&lt;/code&gt; that the 0.46 ns constraint (after I/O delay deductions) only allows 0.37 ns for — and comes back with a diagnosis:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The 0.46 ns clock period is too aggressive for this design. The minimum achievable period is approximately 0.51 ns. I recommend relaxing the constraint to 0.52 ns."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You tell it to make the change. It writes an updated SDC, reruns the flow, and reports back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WNS: ~0.00 ns
TNS: ~0.00 ns
Setup violations: 4 (negligible slack)
Status: PASSED
Tradeoff: -12% frequency (1914 MHz vs 2174 MHz target)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full demo files — original SDC, relaxed SDC, and a run script — are in &lt;a href="https://github.com/luarss/openroad-mcp/tree/main/demo/orfs-gcd-timing" rel="noopener noreferrer"&gt;&lt;code&gt;demo/orfs-gcd-timing/&lt;/code&gt;&lt;/a&gt; in the repo.&lt;/p&gt;

&lt;p&gt;That whole loop — load, analyze, diagnose, fix, verify — in one conversation. No copy-pasting report output into a chat window. No context switching. The AI has the live design state and reasons over it directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;OpenROAD expects an interactive terminal. Using a plain subprocess pipe gives you buffering issues, broken prompts, and unreliable output. Instead, OpenROAD MCP creates a &lt;strong&gt;PTY (pseudo-terminal)&lt;/strong&gt; for each session — OpenROAD sees a real terminal and behaves exactly as it would in an interactive shell. Background threads drain stdout continuously; a queue accumulates output until the prompt returns.&lt;/p&gt;

&lt;p&gt;Sessions persist across commands. You load LEF, then Liberty, then Verilog, then SDC — building up design state exactly as you would manually. The &lt;code&gt;SessionManager&lt;/code&gt; 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.&lt;/p&gt;

&lt;p&gt;The MCP server exposes tools for creating and managing sessions, executing Tcl commands, and reading ORFS report images (congestion maps, routing density plots) as data the AI can reason about. Full tool list is in the &lt;a href="https://github.com/luarss/openroad-mcp" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio openroad-mcp &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  uvx &lt;span class="nt"&gt;--from&lt;/span&gt; git+https://github.com/luarss/openroad-mcp openroad-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then try the GCD timing demo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Create an OpenROAD session, load the nangate45 GCD design from ORFS, and tell me where the timing failures are."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The demo files and expected output are in &lt;code&gt;demo/orfs-gcd-timing/&lt;/code&gt; in the repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Want to Know
&lt;/h2&gt;

&lt;p&gt;If you work with OpenROAD, I want to hear where this breaks. What are some of your pain points making AI work with your workflow?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/luarss/openroad-mcp" rel="noopener noreferrer"&gt;github.com/luarss/openroad-mcp&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:jluar@precisioninno.com"&gt;jluar@precisioninno.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
