Show individual routers in cube_view SVG, fix row Y overlap

- cube_view now renders all 32 router nodes from cube_mesh.yaml
  instead of collapsed "router_mesh" placeholder
- Fix mesh_gen row Y position overlap (r1/r2 and r3/r4 had same Y)
  by adding hbm_gap spacing between PE rows and HBM zone
- Add noc_router to visualizer KIND_SIZE for proper sizing
- Update cube view tests for individual router nodes

339 passed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-04 18:22:38 -07:00
parent d2c92b8a18
commit 91085733ba
5 changed files with 395 additions and 183 deletions
+251 -83
View File
@@ -5,95 +5,201 @@
<rect x="40.0" y="40.0" width="476.0" height="392.0" rx="6" fill="none" stroke="#475569" stroke-width="2" stroke-dasharray="8,4"/> <rect x="40.0" y="40.0" width="476.0" height="392.0" rx="6" fill="none" stroke="#475569" stroke-width="2" stroke-dasharray="8,4"/>
<rect x="152.0" y="166.0" width="252.0" height="140.0" rx="4" fill="#d1fae5" stroke="#10b981" stroke-width="1.5" stroke-dasharray="6,3" opacity="0.5"/> <rect x="152.0" y="166.0" width="252.0" height="140.0" rx="4" fill="#d1fae5" stroke="#10b981" stroke-width="1.5" stroke-dasharray="6,3" opacity="0.5"/>
<text x="278.0" y="278.0" text-anchor="middle" font-family="monospace" font-size="11" fill="#047857" opacity="0.7">HBM</text> <text x="278.0" y="278.0" text-anchor="middle" font-family="monospace" font-size="11" fill="#047857" opacity="0.7">HBM</text>
<polyline points="82.0,82.0 82.0,144.0 334.0,144.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="82.0" x2="166.0" y2="82.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,144.0 82.0,144.0 82.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="124.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="166.0,82.0 166.0,154.0 334.0,154.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="82.0" x2="82.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,144.0 166.0,144.0 166.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="82.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<polyline points="390.0,82.0 390.0,164.0 334.0,164.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="82.0" x2="250.0" y2="82.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="362.0" y="161.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">4.0mm 256GB/s</text> <text x="208.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="334.0,236.0 334.0,144.0 390.0,144.0 390.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <line x1="166.0" y1="82.0" x2="166.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,82.0 474.0,174.0 334.0,174.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <text x="166.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<text x="404.0" y="171.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">4.0mm 256GB/s</text> <line x1="250.0" y1="82.0" x2="334.0" y2="82.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,144.0 474.0,144.0 474.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="292.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="82.0,390.0 82.0,338.0 334.0,338.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="250.0" y1="82.0" x2="250.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="208.0" y="335.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">4.0mm 256GB/s</text> <text x="250.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<polyline points="334.0,236.0 334.0,298.0 82.0,298.0 82.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <line x1="334.0" y1="82.0" x2="390.0" y2="82.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="166.0,390.0 166.0,348.0 334.0,348.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <text x="362.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text>
<text x="250.0" y="345.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">4.0mm 256GB/s</text> <line x1="334.0" y1="82.0" x2="334.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,298.0 166.0,298.0 166.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="334.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<polyline points="390.0,390.0 390.0,358.0 334.0,358.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="82.0" x2="474.0" y2="82.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,298.0 390.0,298.0 390.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="432.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="474.0,390.0 474.0,368.0 334.0,368.0 334.0,236.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="82.0" x2="390.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,298.0 474.0,298.0 474.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="390.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="334.0" y1="236.0" x2="222.0" y2="236.0" stroke="#10b981" stroke-width="1" opacity="0.8"/> <line x1="474.0" y1="82.0" x2="474.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="222.0" y1="236.0" x2="334.0" y2="236.0" stroke="#10b981" stroke-width="1" opacity="0.8"/> <text x="474.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<polyline points="446.0,194.0 446.0,200.0 334.0,200.0 334.0,236.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <line x1="82.0" y1="152.0" x2="166.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,200.0 446.0,200.0 446.0,194.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="124.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="334.0,236.0 110.0,236.0 110.0,194.0" fill="none" stroke="#a78bfa" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="152.0" x2="82.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,131.4 278.0,131.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="82.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="152.0" x2="250.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="208.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="278.0,56.8 278.0,131.4 334.0,131.4 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="152.0" x2="166.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,131.4 278.0,131.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="166.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="250.0" y1="152.0" x2="334.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="292.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="278.0,56.8 278.0,141.4 334.0,141.4 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="250.0" y1="152.0" x2="250.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,131.4 278.0,131.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="250.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">6.0mm</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="334.0" y1="152.0" x2="390.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="362.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text>
<polyline points="278.0,56.8 278.0,151.4 334.0,151.4 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="334.0" y1="152.0" x2="334.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,131.4 278.0,131.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="334.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">6.0mm</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="152.0" x2="474.0" y2="152.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="432.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="278.0,56.8 278.0,161.4 334.0,161.4 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="152.0" x2="390.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,310.6 278.0,310.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="390.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="474.0" y1="152.0" x2="474.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="474.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<polyline points="278.0,415.2 278.0,350.6 334.0,350.6 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="194.0" x2="166.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,310.6 278.0,310.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="124.0" y="190.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="194.0" x2="82.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="82.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="278.0,415.2 278.0,360.6 334.0,360.6 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="194.0" x2="390.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,310.6 278.0,310.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="278.0" y="190.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">8.0mm</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="194.0" x2="166.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="166.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="278.0,415.2 278.0,370.6 334.0,370.6 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="194.0" x2="474.0" y2="194.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,310.6 278.0,310.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="432.0" y="190.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="194.0" x2="390.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="390.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="278.0,415.2 278.0,380.6 334.0,380.6 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="474.0" y1="194.0" x2="474.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 488.0,221.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="474.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="278.0" x2="166.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="124.0" y="274.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="488.0,236.0 488.0,301.0 334.0,301.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="278.0" x2="82.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 488.0,221.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="82.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="278.0" x2="390.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="278.0" y="274.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">8.0mm</text>
<polyline points="488.0,236.0 488.0,311.0 334.0,311.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="166.0" y1="278.0" x2="166.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 488.0,221.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="166.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="278.0" x2="474.0" y2="278.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="432.0" y="274.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="488.0,236.0 488.0,321.0 334.0,321.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="390.0" y1="278.0" x2="390.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 488.0,221.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="390.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="474.0" y1="278.0" x2="474.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="474.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text>
<polyline points="488.0,236.0 488.0,331.0 334.0,331.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="82.0" y1="320.0" x2="166.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 68.0,221.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="124.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="82.0" y1="320.0" x2="82.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="82.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="166.0" y1="320.0" x2="250.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="208.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="166.0" y1="320.0" x2="166.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="166.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="250.0" y1="320.0" x2="334.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="292.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="250.0" y1="320.0" x2="250.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="250.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="334.0" y1="320.0" x2="390.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="362.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text>
<line x1="334.0" y1="320.0" x2="334.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="334.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="390.0" y1="320.0" x2="474.0" y2="320.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="432.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="390.0" y1="320.0" x2="390.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="390.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="474.0" y1="320.0" x2="474.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="474.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text>
<line x1="82.0" y1="390.0" x2="166.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="124.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="166.0" y1="390.0" x2="250.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="208.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="250.0" y1="390.0" x2="334.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="292.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<line x1="334.0" y1="390.0" x2="390.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="362.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text>
<line x1="390.0" y1="390.0" x2="474.0" y2="390.0" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<text x="432.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text>
<polyline points="82.0,82.0 82.0,67.0 82.0,67.0 82.0,82.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,82.0 82.0,67.0 82.0,67.0 82.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="82.0,82.0 222.0,82.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,82.0 82.0,144.0 68.0,144.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,144.0 82.0,144.0 82.0,82.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,341.0 334.0,341.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="82.0,82.0 82.0,54.4 278.0,54.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 68.0,221.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="278.0,56.8 278.0,64.4 82.0,64.4 82.0,82.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="166.0,82.0 166.0,67.0 166.0,67.0 166.0,82.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="166.0,82.0 166.0,67.0 166.0,67.0 166.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="166.0,82.0 222.0,82.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="166.0,82.0 166.0,54.4 278.0,54.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,56.8 278.0,54.4 166.0,54.4 166.0,82.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="390.0,82.0 390.0,54.4 278.0,54.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,56.8 278.0,54.4 390.0,54.4 390.0,82.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,82.0 474.0,144.0 488.0,144.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="488.0,236.0 488.0,144.0 474.0,144.0 474.0,82.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,82.0 474.0,54.4 278.0,54.4 278.0,56.8" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,56.8 278.0,64.4 474.0,64.4 474.0,82.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,152.0 82.0,179.0 68.0,179.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,179.0 82.0,179.0 82.0,152.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,351.0 334.0,351.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="390.0,82.0 390.0,102.0 390.0,102.0 390.0,152.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 68.0,221.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="390.0,152.0 390.0,102.0 390.0,102.0 390.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="390.0,152.0 222.0,152.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,82.0 474.0,102.0 474.0,102.0 474.0,152.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,152.0 474.0,102.0 474.0,102.0 474.0,82.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="474.0,152.0 222.0,152.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,152.0 474.0,179.0 488.0,179.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="488.0,236.0 488.0,179.0 474.0,179.0 474.0,152.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="446.0,194.0 446.0,179.0 82.0,179.0 82.0,194.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="82.0,194.0 82.0,179.0 446.0,179.0 446.0,194.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="110.0,194.0 82.0,194.0 82.0,278.0" fill="none" stroke="#a78bfa" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,390.0 82.0,340.0 82.0,340.0 82.0,320.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,320.0 82.0,340.0 82.0,340.0 82.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="82.0,320.0 222.0,320.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,320.0 82.0,263.0 68.0,263.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,263.0 82.0,263.0 82.0,320.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,361.0 334.0,361.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="166.0,390.0 166.0,340.0 166.0,340.0 166.0,320.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="334.0,236.0 334.0,221.0 68.0,221.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="166.0,320.0 166.0,340.0 166.0,340.0 166.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="166.0,320.0 222.0,320.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,320.0 474.0,263.0 488.0,263.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="488.0,236.0 488.0,263.0 474.0,263.0 474.0,320.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="82.0,390.0 82.0,298.0 68.0,298.0 68.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,298.0 82.0,298.0 82.0,390.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="68.0,236.0 68.0,371.0 334.0,371.0 334.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <polyline points="82.0,390.0 82.0,387.6 278.0,387.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,415.2 278.0,397.6 82.0,397.6 82.0,390.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="166.0,390.0 166.0,387.6 278.0,387.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,415.2 278.0,387.6 166.0,387.6 166.0,390.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="390.0,390.0 390.0,375.0 390.0,375.0 390.0,390.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="390.0,390.0 390.0,375.0 390.0,375.0 390.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="390.0,390.0 222.0,390.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="390.0,390.0 390.0,387.6 278.0,387.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,415.2 278.0,387.6 390.0,387.6 390.0,390.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,390.0 474.0,375.0 474.0,375.0 474.0,390.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,390.0 474.0,375.0 474.0,375.0 474.0,390.0" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/>
<polyline points="474.0,390.0 222.0,390.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,390.0 474.0,298.0 488.0,298.0 488.0,236.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="488.0,236.0 488.0,298.0 474.0,298.0 474.0,390.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="474.0,390.0 474.0,387.6 278.0,387.6 278.0,415.2" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<polyline points="278.0,415.2 278.0,397.6 474.0,397.6 474.0,390.0" fill="none" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/>
<rect x="250.0" y="40.0" width="56.0" height="33.6" rx="4" fill="#3b82f6" stroke="#475569" stroke-width="1"/> <rect x="250.0" y="40.0" width="56.0" height="33.6" rx="4" fill="#3b82f6" stroke="#475569" stroke-width="1"/>
<text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="10" fill="#ffffff">UCIe-N</text> <text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="10" fill="#ffffff">UCIe-N</text>
<rect x="250.0" y="40.0" width="56.0" height="33.6" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <rect x="250.0" y="40.0" width="56.0" height="33.6" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/>
@@ -140,8 +246,70 @@
<text x="222.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#ffffff">HBM CTRL</text> <text x="222.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#ffffff">HBM CTRL</text>
<rect x="82.0" y="177.2" width="56.0" height="33.6" rx="4" fill="#f59e0b" stroke="#475569" stroke-width="1"/> <rect x="82.0" y="177.2" width="56.0" height="33.6" rx="4" fill="#f59e0b" stroke="#475569" stroke-width="1"/>
<text x="110.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">SRAM</text> <text x="110.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">SRAM</text>
<rect x="306.0" y="219.2" width="56.0" height="33.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/> <rect x="65.2" y="70.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">ROUTER MESH</text> <text x="82.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R0C0</text>
<rect x="149.2" y="70.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R0C1</text>
<rect x="233.2" y="70.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R0C2</text>
<rect x="317.2" y="70.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R0C3</text>
<rect x="373.2" y="70.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R0C4</text>
<rect x="457.2" y="70.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R0C5</text>
<rect x="65.2" y="140.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R1C0</text>
<rect x="149.2" y="140.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R1C1</text>
<rect x="233.2" y="140.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R1C2</text>
<rect x="317.2" y="140.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R1C3</text>
<rect x="373.2" y="140.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R1C4</text>
<rect x="457.2" y="140.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R1C5</text>
<rect x="65.2" y="182.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R2C0</text>
<rect x="149.2" y="182.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R2C1</text>
<rect x="373.2" y="182.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R2C4</text>
<rect x="457.2" y="182.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R2C5</text>
<rect x="65.2" y="266.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R3C0</text>
<rect x="149.2" y="266.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R3C1</text>
<rect x="373.2" y="266.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R3C4</text>
<rect x="457.2" y="266.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R3C5</text>
<rect x="65.2" y="308.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R4C0</text>
<rect x="149.2" y="308.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R4C1</text>
<rect x="233.2" y="308.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R4C2</text>
<rect x="317.2" y="308.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R4C3</text>
<rect x="373.2" y="308.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R4C4</text>
<rect x="457.2" y="308.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R4C5</text>
<rect x="65.2" y="378.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R5C0</text>
<rect x="149.2" y="378.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R5C1</text>
<rect x="233.2" y="378.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R5C2</text>
<rect x="317.2" y="378.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R5C3</text>
<rect x="373.2" y="378.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R5C4</text>
<rect x="457.2" y="378.8" width="33.6" height="22.4" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">R5C5</text>
<rect x="56.8" y="68.0" width="50.4" height="28.0" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/> <rect x="56.8" y="68.0" width="50.4" height="28.0" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE0</text> <text x="82.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE0</text>
<rect x="140.8" y="68.0" width="50.4" height="28.0" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/> <rect x="140.8" y="68.0" width="50.4" height="28.0" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 36 KiB

+106 -76
View File
@@ -921,21 +921,26 @@ def _build_cube_view(spec: dict) -> ViewGraph:
label=name.upper().replace("_", " "), label=name.upper().replace("_", " "),
) )
# Router mesh representative node (collapsed for view) # Load mesh data early (needed for router nodes + PE distances)
router_spec = cube["components"]["noc_router"] mesh_data = spec.get("_mesh", {})
cx = cube_w / 2
cy = cube_h / 2
nodes["router_mesh"] = Node(
id="router_mesh", kind=router_spec["kind"], impl=router_spec["impl"],
attrs=router_spec["attrs"], pos_mm=(cx + 2.0, cy),
label="ROUTER MESH",
)
# PEs as opaque blocks (no per-PE xbar nodes) # Router nodes from cube_mesh.yaml (explicit in view)
router_spec = cube["components"]["noc_router"]
routers = mesh_data.get("routers", {})
for rkey, rval in routers.items():
if rval is None:
continue
rx, ry = rval["pos_mm"]
nodes[rkey] = Node(
id=rkey, kind=router_spec["kind"], impl=router_spec["impl"],
attrs=router_spec["attrs"], pos_mm=(rx, ry),
label=rkey.upper(),
)
# PEs as opaque blocks
corners = cube["pe_layout"]["corners"] corners = cube["pe_layout"]["corners"]
pe_per_corner = cube["pe_layout"]["pe_per_corner"] pe_per_corner = cube["pe_layout"]["pe_per_corner"]
corner_pos = _corner_pe_positions(cube_w, cube_h) corner_pos = _corner_pe_positions(cube_w, cube_h)
mesh_data = spec.get("_mesh", {})
pe_noc_distances = _compute_pe_noc_distances( pe_noc_distances = _compute_pe_noc_distances(
mesh_data, corner_pos, corners, pe_per_corner, mesh_data, corner_pos, corners, pe_per_corner,
) if mesh_data else {} ) if mesh_data else {}
@@ -950,76 +955,101 @@ def _build_cube_view(spec: dict) -> ViewGraph:
attrs={"corner": corner}, pos_mm=(px, py), attrs={"corner": corner}, pos_mm=(px, py),
label=f"PE{pe_idx}", label=f"PE{pe_idx}",
) )
# PE ↔ router_mesh (view representation)
pe_to_router_bw = clinks.get("pe_to_router_bw_gbs", 256.0)
view_edges.append(Edge(
src=pid, dst="router_mesh",
distance_mm=pe_noc_distances.get(pe_idx, 0.0),
bw_gbs=pe_to_router_bw,
kind="pe_to_router",
))
view_edges.append(Edge(
src="router_mesh", dst=pid,
distance_mm=clinks.get("noc_to_pe_cpu_mm", 0.0),
kind="command",
))
pe_idx += 1 pe_idx += 1
# router_mesh ↔ hbm_ctrl # View edges based on cube_mesh.yaml attach (mirrors _instantiate_cube logic)
pe_to_router_bw = clinks.get("pe_to_router_bw_gbs", 256.0)
hbm_to_router_bw = clinks.get("hbm_to_router_bw_gbs", 256.0) hbm_to_router_bw = clinks.get("hbm_to_router_bw_gbs", 256.0)
view_edges.append(Edge(
src="router_mesh", dst="hbm_ctrl",
distance_mm=0.0, bw_gbs=hbm_to_router_bw,
kind="router_to_hbm",
))
view_edges.append(Edge(
src="hbm_ctrl", dst="router_mesh",
distance_mm=0.0, bw_gbs=hbm_to_router_bw,
kind="hbm_to_router",
))
# router_mesh ↔ m_cpu
view_edges.append(Edge(
src="m_cpu", dst="router_mesh",
distance_mm=clinks.get("m_cpu_to_router_mm", 0.0),
kind="command",
))
view_edges.append(Edge(
src="router_mesh", dst="m_cpu",
distance_mm=clinks.get("m_cpu_to_router_mm", 0.0),
kind="command",
))
# router_mesh ↔ sram
sram_bw = clinks.get("sram_to_router_bw_gbs", 128.0) sram_bw = clinks.get("sram_to_router_bw_gbs", 128.0)
view_edges.append(Edge(
src="router_mesh", dst="sram",
distance_mm=0.0, bw_gbs=sram_bw,
kind="router_to_sram",
))
ucie_conn_bw_v = ucie_cfg.get("per_connection_bw_gbs", 128.0) ucie_conn_bw_v = ucie_cfg.get("per_connection_bw_gbs", 128.0)
for port in ucie_cfg["ports"]: n_rows = mesh_data.get("mesh", {}).get("rows", 6)
for ci in range(ucie_n_conn): n_cols = mesh_data.get("mesh", {}).get("cols", 6)
conn_id = f"ucie-{port}.conn{ci}"
view_edges.append(Edge( # Router ↔ router mesh edges
src="router_mesh", dst=conn_id, for r in range(n_rows):
distance_mm=0.0, bw_gbs=ucie_conn_bw_v, for c in range(n_cols):
kind="router_to_ucie_conn", rkey = f"r{r}c{c}"
)) if routers.get(rkey) is None:
view_edges.append(Edge( continue
src=conn_id, dst=f"ucie-{port}", src_pos = routers[rkey]["pos_mm"]
distance_mm=0.0, kind="ucie_internal", # Horizontal neighbor
)) for nc in range(c + 1, n_cols):
view_edges.append(Edge( nkey = f"r{r}c{nc}"
src=f"ucie-{port}", dst=conn_id, if routers.get(nkey) is None:
distance_mm=0.0, kind="ucie_internal", continue
)) dist = abs(routers[nkey]["pos_mm"][0] - src_pos[0])
view_edges.append(Edge( view_edges.append(Edge(
src=conn_id, dst="router_mesh", src=rkey, dst=nkey, distance_mm=round(dist, 2),
distance_mm=0.0, bw_gbs=ucie_conn_bw_v, kind="router_mesh",
kind="ucie_conn_to_router", ))
)) break
# Vertical neighbor
for nr in range(r + 1, n_rows):
nkey = f"r{nr}c{c}"
if routers.get(nkey) is None:
continue
dist = abs(routers[nkey]["pos_mm"][1] - src_pos[1])
view_edges.append(Edge(
src=rkey, dst=nkey, distance_mm=round(dist, 2),
kind="router_mesh",
))
break
# Component ↔ router edges from attach lists
for rkey, rval in routers.items():
if rval is None:
continue
for item in rval.get("attach", []):
if item.endswith(".dma"):
pe_prefix = item.rsplit(".", 1)[0]
pid = pe_prefix.replace("pe", "pe") # "pe0" → "pe0"
if pid in nodes:
view_edges.append(Edge(
src=pid, dst=rkey, distance_mm=0.0,
bw_gbs=pe_to_router_bw, kind="pe_to_router",
))
view_edges.append(Edge(
src=rkey, dst=pid, distance_mm=0.0,
kind="command",
))
elif item.endswith(".hbm"):
view_edges.append(Edge(
src=rkey, dst="hbm_ctrl", distance_mm=0.0,
bw_gbs=hbm_to_router_bw, kind="router_to_hbm",
))
elif item == "m_cpu":
view_edges.append(Edge(
src="m_cpu", dst=rkey, distance_mm=0.0, kind="command",
))
view_edges.append(Edge(
src=rkey, dst="m_cpu", distance_mm=0.0, kind="command",
))
elif item == "sram":
view_edges.append(Edge(
src="sram", dst=rkey, distance_mm=0.0,
bw_gbs=sram_bw, kind="router_to_sram",
))
elif item.startswith("ucie_"):
parts = item.split(".")
direction = parts[0].replace("ucie_", "").upper()
conn_num = parts[1].replace("c", "")
conn_id = f"ucie-{direction}.conn{conn_num}"
view_edges.append(Edge(
src=rkey, dst=conn_id, distance_mm=0.0,
bw_gbs=ucie_conn_bw_v, kind="router_to_ucie_conn",
))
view_edges.append(Edge(
src=conn_id, dst=rkey, distance_mm=0.0,
bw_gbs=ucie_conn_bw_v, kind="ucie_conn_to_router",
))
view_edges.append(Edge(
src=conn_id, dst=f"ucie-{direction}",
distance_mm=0.0, kind="ucie_internal",
))
view_edges.append(Edge(
src=f"ucie-{direction}", dst=conn_id,
distance_mm=0.0, kind="ucie_internal",
))
return ViewGraph( return ViewGraph(
name="cube", nodes=nodes, edges=view_edges, name="cube", nodes=nodes, edges=view_edges,
+8 -4
View File
@@ -111,6 +111,7 @@ def _compute_row_positions(
# Top half: evenly spaced from top PE y to just above HBM zone # Top half: evenly spaced from top PE y to just above HBM zone
top_pe_y = 1.5 top_pe_y = 1.5
hbm_gap = 1.5 # minimum gap between PE rows and HBM rows
hbm_top_y = cube_h / 2 - 1.5 # ~5.5 for h=14 hbm_top_y = cube_h / 2 - 1.5 # ~5.5 for h=14
hbm_bot_y = cube_h / 2 + 1.5 # ~8.5 for h=14 hbm_bot_y = cube_h / 2 + 1.5 # ~8.5 for h=14
bot_pe_y = cube_h - 1.5 bot_pe_y = cube_h - 1.5
@@ -119,21 +120,24 @@ def _compute_row_positions(
if rows_per_half == 1: if rows_per_half == 1:
top_rows = [top_pe_y] top_rows = [top_pe_y]
else: else:
step = (hbm_top_y - top_pe_y) / (rows_per_half - 1) if rows_per_half > 1 else 0 # End before HBM zone with gap
top_end = hbm_top_y - hbm_gap
step = (top_end - top_pe_y) / (rows_per_half - 1) if rows_per_half > 1 else 0
for i in range(rows_per_half): for i in range(rows_per_half):
top_rows.append(round(top_pe_y + i * step, 1)) top_rows.append(round(top_pe_y + i * step, 1))
# HBM rows # HBM rows
hbm_rows = [round(hbm_top_y, 1), round(hbm_bot_y, 1)] hbm_rows = [round(hbm_top_y, 1), round(hbm_bot_y, 1)]
# Bottom half: mirror of top # Bottom half: mirror of top, start after HBM zone with gap
bot_rows: list[float] = [] bot_rows: list[float] = []
if rows_per_half == 1: if rows_per_half == 1:
bot_rows = [bot_pe_y] bot_rows = [bot_pe_y]
else: else:
step = (bot_pe_y - hbm_bot_y) / (rows_per_half - 1) if rows_per_half > 1 else 0 bot_start = hbm_bot_y + hbm_gap
step = (bot_pe_y - bot_start) / (rows_per_half - 1) if rows_per_half > 1 else 0
for i in range(rows_per_half): for i in range(rows_per_half):
bot_rows.append(round(hbm_bot_y + i * step, 1)) bot_rows.append(round(bot_start + i * step, 1))
return top_rows + hbm_rows + bot_rows, rows_per_half return top_rows + hbm_rows + bot_rows, rows_per_half
+1
View File
@@ -62,6 +62,7 @@ _KIND_SIZE: dict[str, tuple[float, float]] = {
"cube": (6.0, 4.0), "cube": (6.0, 4.0),
"iochiplet": (4.0, 1.5), "iochiplet": (4.0, 1.5),
"switch": (5.0, 1.5), "switch": (5.0, 1.5),
"noc_router": (1.2, 0.8),
} }
+29 -20
View File
@@ -247,8 +247,14 @@ def test_sip_view_cube_positions():
def test_cube_view_has_all_components(): def test_cube_view_has_all_components():
v = _graph().cube_view v = _graph().cube_view
expected = {"ucie-N", "ucie-S", "ucie-W", "ucie-E", expected = {"ucie-N", "ucie-S", "ucie-W", "ucie-E",
"m_cpu", "hbm_ctrl", "router_mesh", "sram", "m_cpu", "hbm_ctrl", "sram",
"pe0", "pe1", "pe2", "pe3", "pe4", "pe5", "pe6", "pe7"} "pe0", "pe1", "pe2", "pe3", "pe4", "pe5", "pe6", "pe7",
"r0c0", "r0c1", "r0c2", "r0c3", "r0c4", "r0c5",
"r1c0", "r1c1", "r1c2", "r1c3", "r1c4", "r1c5",
"r2c0", "r2c1", "r2c4", "r2c5",
"r3c0", "r3c1", "r3c4", "r3c5",
"r4c0", "r4c1", "r4c2", "r4c3", "r4c4", "r4c5",
"r5c0", "r5c1", "r5c2", "r5c3", "r5c4", "r5c5"}
# Add UCIe connection nodes (4 ports x 4 connections) # Add UCIe connection nodes (4 ports x 4 connections)
for port in ("N", "S", "E", "W"): for port in ("N", "S", "E", "W"):
for ci in range(4): for ci in range(4):
@@ -259,17 +265,19 @@ def test_cube_view_has_all_components():
def test_cube_view_hbm_at_center(): def test_cube_view_hbm_at_center():
v = _graph().cube_view v = _graph().cube_view
assert v.nodes["hbm_ctrl"].pos_mm == (6.5, 7.0) assert v.nodes["hbm_ctrl"].pos_mm == (6.5, 7.0)
assert v.nodes["router_mesh"].pos_mm == (10.5, 7.0) assert "r0c0" in v.nodes # routers exist in cube view
assert v.width_mm == 17.0 assert v.width_mm == 17.0
assert v.height_mm == 14.0 assert v.height_mm == 14.0
def test_cube_view_pe_to_router_mesh(): def test_cube_view_pe_to_router():
"""PEs connect to router_mesh in cube view.""" """PEs connect to their assigned routers in cube view."""
v = _graph().cube_view v = _graph().cube_view
ves = {(e.src, e.dst) for e in v.edges} ves = {(e.src, e.dst) for e in v.edges}
for i in range(8): pe_router_map = {"pe0": "r0c0", "pe1": "r0c1", "pe2": "r1c4", "pe3": "r1c5",
assert (f"pe{i}", "router_mesh") in ves "pe4": "r4c0", "pe5": "r4c1", "pe6": "r5c4", "pe7": "r5c5"}
for pe, router in pe_router_map.items():
assert (pe, router) in ves, f"{pe} should connect to {router}"
# -- Views: PE ---------------------------------------------------------------- # -- Views: PE ----------------------------------------------------------------
@@ -383,32 +391,33 @@ def test_cross_cube_path_includes_conn():
# -- Cube view: edges --------------------------------------------------------- # -- Cube view: edges ---------------------------------------------------------
def test_cube_view_pe_to_router_mesh_edges(): def test_cube_view_pe_to_router_edges():
"""All PEs connect to router_mesh in cube view.""" """All PEs connect to their routers in cube view."""
v = _graph().cube_view v = _graph().cube_view
ves = {(e.src, e.dst) for e in v.edges} ves = {(e.src, e.dst) for e in v.edges}
for i in range(8): pe_router_map = {"pe0": "r0c0", "pe1": "r0c1", "pe2": "r1c4", "pe3": "r1c5",
assert (f"pe{i}", "router_mesh") in ves "pe4": "r4c0", "pe5": "r4c1", "pe6": "r5c4", "pe7": "r5c5"}
for pe, router in pe_router_map.items():
assert (pe, router) in ves, f"{pe} should connect to {router}"
def test_cube_view_sram(): def test_cube_view_sram():
v = _graph().cube_view v = _graph().cube_view
assert "sram" in v.nodes assert "sram" in v.nodes
ves = {(e.src, e.dst) for e in v.edges} ves = {(e.src, e.dst) for e in v.edges}
assert ("router_mesh", "sram") in ves assert ("sram", "r3c0") in ves
def test_cube_view_hbm_router_mesh(): def test_cube_view_hbm_router():
"""Cube view: hbm_ctrl connects to router_mesh.""" """Cube view: PE routers connect to hbm_ctrl."""
v = _graph().cube_view v = _graph().cube_view
ves = {(e.src, e.dst) for e in v.edges} ves = {(e.src, e.dst) for e in v.edges}
assert ("router_mesh", "hbm_ctrl") in ves assert ("r0c0", "hbm_ctrl") in ves # PE0's router → HBM
assert ("hbm_ctrl", "router_mesh") in ves
def test_cube_view_m_cpu_router_mesh(): def test_cube_view_m_cpu_router():
"""Cube view: m_cpu connects to router_mesh.""" """Cube view: m_cpu connects to its router r2c0."""
v = _graph().cube_view v = _graph().cube_view
ves = {(e.src, e.dst) for e in v.edges} ves = {(e.src, e.dst) for e in v.edges}
assert ("router_mesh", "m_cpu") in ves assert ("m_cpu", "r2c0") in ves
assert ("m_cpu", "router_mesh") in ves assert ("r2c0", "m_cpu") in ves