Other Formats
OpenROAD as a Recursive Colony Agent
Physical design infrastructure that mirrors nexus within its own domain
Abstract
OpenROAD is the leading open-source physical design platform, providing a complete RTL-to-GDSII flow with a No-Human-In-Loop (NHIL) philosophy. Its architecture—a central orchestrator, shared knowledge store (OpenDB), and autonomous tool agents—is not merely similar to nexus. It is a recursive instance of the same pattern: OpenROAD is an agent within nexus while simultaneously acting as nexus within its own physical design colony. This document describes the recursive agent structure and the integration pathway through the Cypher-SQL translation layer.
The Recursive Agent Pattern
The same architectural pattern repeats at every scale. From the outside, every agent is a simple consumer of nexus Intent and producer of nexus Fact. From the inside, every agent is itself a nexus with its own blackboard, detectors, and scheduler.
nexus sends Intent: “synthesize this RTL.” OpenROAD receives the Intent, runs its internal OODA (synthesis → floorplanning → placement → CTS → routing → timing/DRC), and returns Fact: “layout complete, 3 timing violations.”
Internally, OpenROAD has its own blackboard (OpenDB), its own detectors (timing analyser, DRC checker, congestion estimator), and its own scheduler (the OpenRoad singleton orchestrating Yosys, TritonCTS, TritonRoute). It produces its own Facts (timing slack, cell density, wire-length distribution) that are consumed by its own internal agents.
This is not abstraction leakage. It is the structural observation principle applied recursively. Every domain that can be described as a state space with constraints and observations is amenable to the same pattern.
Integration Through the Storage Trait
The existing storage architecture provides the integration point without any core changes. A new storage/opendb/ crate implements ColdStorage via:
StorageRead— read design state (cell count, timing, routing)FactCapable— write timing violations as FactsFilterCapable— filtered reads (e.g., “cells with slack < 0”)CypherCapable— Cypher translated to OpenDB’s SQL dialect
The Cypher-SQL translator already handles the dialect switching. The only work is a thin adapter that maps OpenDB’s schema to the existing interface.
nexus Cypher query
↓ (translate.rs → SQL dialect)
OpenDB SQL ─── SQLite SQL ─── DuckDB SQL
↓ ↓ ↓
OpenROAD PnR FIH storage Parquet export
Storage Trait to OpenDB Schema Mapping
The adapter maps nexus storage traits to OpenDB’s database schema as follows:
| Storage Trait | OpenDB Table | Mapping |
|---|---|---|
StorageRead::read_state |
CELL, PIN, NET |
Aggregate cell count, net count, instance count into BoardState |
FactCapable::submit_fact |
TIMING_VIOLATION, DRC_VIOLATION |
Each timing or DRC violation becomes a Fact with origin = “openroad” |
FilterCapable::read_state_filtered |
CELL WHERE slack < threshold |
SQL WHERE clause generated by translate.rs |
CypherCapable::query_plan |
All tables | Cypher MATCH (c:CELL) WHERE c.slack < 0 RETURN c → SQL |
OpenDB’s schema is relational and SQL-queryable. The Cypher-SQL translator already has a dialect dispatch that selects SQL dialect based on backend type. Adding an OpenDB dialect variant requires:
- A new
SqlDialect::OpenDBenum variant intranslate.rs - Mapping Cypher node labels (CELL, PIN, NET, TIMING_VIOLATION) to OpenDB table names
- Mapping Cypher property paths to OpenDB column references
The translator’s existing cypher_sql module already handles all three concerns for DuckDB and SQLite. OpenDB adds a fourth dialect target without changing the translation logic.
Data Flow: Intent to Fact
Intent (nexus → OpenROAD):
{ "action": "place_and_route",
"input": "path/to/synthesized.v",
"constraints": { "target_freq_mhz": 100 } }
OpenROAD internal OODA:
1. Read synthesized netlist
2. Floorplanning → Placement → CTS → Routing → Timing
3. Write GDSII + timing report
Fact (OpenROAD → nexus):
{ "status": "complete",
"gds_path": "output/layout.gds",
"timing_violations": [
{ "path": "...", "slack_ps": -50, "severity": "setup" },
{ "path": "...", "slack_ps": -12, "severity": "hold" }
],
"cell_count": 12450,
"area_um2": 0.045 }
Every Fact produced by OpenROAD is consumed by nexus GapDetector and ContradictionDetector. Timing violations become gaps. Area constraints that exceed budget become contradictions. The detection layer triggers new Intent generation without human intervention.
Position in the Open-Source EDA Landscape
OpenROAD is the undisputed leader in open-source physical design. It is the only open-source tool delivering a complete RTL-to-GDSII automated flow with 24-hour turnaround. Its track record exceeds 600 tapeouts on SkyWater 130nm and GlobalFoundries 180nm. It forms the physical design core of OpenLane and LibreLane.
| Tool | Role | Relationship to nexus |
|---|---|---|
| OpenROAD | RTL-to-GDSII physical design | Agent + internal nexus |
| Yosys | RTL synthesis | Source consumed by OpenROAD agent |
| OpenLane | Integrated ASIC flow | Consumes OpenROAD |
| Coriolis | Independent P&R | Alternative agent candidate |
No other open-source tool matches OpenROAD’s combination of breadth (full flow), autonomy (NHIL), and production track record.
The Recursive Principle
nexus does not need to understand OpenROAD’s internal complexity. It only needs the capability trait interface that every agent exposes. OpenROAD’s OpenDB becomes one implementation of ColdStorage. The Cypher-SQL translator was designed for this.
The same pattern applies to all agents. ev is a nexus inside its own verification domain. OpenROAD is a nexus inside its own physical design domain. Each colony operates autonomously and communicates through the shared FIH Blackboard. It is the structural observation principle scaling across domains.