flowchart LR A["Initial Placement 🎲"] --> B{optimize round} B -->|axis = x| C["howard(x) 🌀"] C --> C2["legalize(y) 🧩"] C2 --> C3["pads 📍"] B -->|axis = y| D["howard(y) 🌀"] D --> D2["legalize(x) 🧩"] D2 --> D3["pads 📍"] C3 --> E{worst improved?} D3 --> E E -->|Yes ✅| B E -->|No ❌| F["restore 📸 + io_assign"] F --> G[End] style A fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440 style B fill:#ffcdd2,stroke:#c62828,stroke-width:3px,color:#2e3440 style C fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#2e3440 style D fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#2e3440 style C2 fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style D2 fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style C3 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#2e3440 style D3 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#2e3440 style F fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#2e3440
flowchart LR B["baseline 🐢\n16.0 s"] --> S1["#1 no Fraction\n7.6 s"] S1 --> S2["#2 one adjacency\n7.1 s"] S2 --> S3["#3 gate matching\n6.5 s"] S3 --> S4["#4 O(log deg) slots ⚡\n2.3 s"] style B fill:#ffcdd2,stroke:#c62828,stroke-width:3px,color:#2e3440 style S1 fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440 style S2 fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440 style S3 fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#2e3440 style S4 fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#2e3440
graph TD N["NnsPlacer 🏛️"] --> W["WireLengthModel 🧩\ncost / worst / HPWL"] N --> L["Legalizer 🧩\nLocal / Global"] N --> H["_HowardsCost 🔌"] N --> A["_optimize_axis(axis) 📐"] style N fill:#fff3e0,stroke:#e65100,stroke-width:3px,color:#2e3440 style W fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style L fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px,color:#2e3440 style H fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#2e3440 style A fill:#e3f2fd,stroke:#1565c0,stroke-width:3px,color:#2e3440