Cube-view SVG: detailed topology validation rendering

- Dedicated cube_view renderer showing 6×6 router grid with attachments
- PE blocks drawn next to their router (above/below)
- HBM pseudo channel port bar (64 ports, color-coded by PE owner)
- Per-PE BW annotations on HBM links
- Router color-coded by type (PE/M_CPU/SRAM/UCIe/relay)
- Title shows mode, channel count, per-PE and total BW
- Legend for all component types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-04 22:03:38 -07:00
parent 5c6abe6d12
commit e94f1de078
3 changed files with 548 additions and 331 deletions
+257 -327
View File
@@ -1,329 +1,259 @@
<svg xmlns="http://www.w3.org/2000/svg" width="556" height="472" viewBox="0 0 556 472"> <svg xmlns="http://www.w3.org/2000/svg" width="970" height="900" viewBox="0 0 970 900">
<title>cube</title> <title>cube</title>
<rect width="556" height="472" fill="#f8fafc"/> <rect width="970" height="900" fill="#0f172a"/>
<text x="278" y="18" text-anchor="middle" font-family="monospace" font-size="14" font-weight="bold" fill="#1e293b">CUBE VIEW</text> <text x="485" y="22" text-anchor="middle" font-family="monospace" font-size="14" font-weight="bold" fill="#94a3b8">CUBE TOPOLOGY — 17.0×14.0mm | 6×6 Router Mesh | n_to_one mode | 64 pseudo-ch</text>
<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"/> <text x="485" y="40" text-anchor="middle" font-family="monospace" font-size="10" fill="#64748b">Per-PE: 8 ch × 32.0 GB/s = 256.0 GB/s | Cube total: 64 × 32.0 = 2048.0 GB/s</text>
<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="60" y="60" width="850.0" height="700.0" rx="6" fill="none" stroke="#475569" stroke-width="2" stroke-dasharray="8,4"/>
<text x="278.0" y="278.0" text-anchor="middle" font-family="monospace" font-size="11" fill="#047857" opacity="0.7">HBM</text> <rect x="260" y="285" width="450" height="250" rx="6" fill="#052e16" stroke="#047857" stroke-width="2" opacity="0.6"/>
<line x1="82.0" y1="82.0" x2="166.0" y2="82.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <text x="485" y="395" text-anchor="middle" font-family="monospace" font-size="11" font-weight="bold" fill="#047857">HBM_CTRL | 64 pseudo channels</text>
<text x="124.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <text x="485" y="412" text-anchor="middle" font-family="monospace" font-size="9" fill="#05966988">Total BW: 2048 GB/s</text>
<line x1="82.0" y1="82.0" x2="82.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="285.0" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<text x="82.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <rect x="291.2" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<line x1="166.0" y1="82.0" x2="250.0" y2="82.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="297.5" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<text x="208.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="303.8" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<line x1="166.0" y1="82.0" x2="166.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="310.0" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<text x="166.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <rect x="316.2" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<line x1="250.0" y1="82.0" x2="334.0" y2="82.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="322.5" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<text x="292.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="328.8" y="425" width="5.8" height="8" fill="#3b82f6" opacity="0.7"/>
<line x1="250.0" y1="82.0" x2="250.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="335.0" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<text x="250.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <rect x="341.2" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<line x1="334.0" y1="82.0" x2="390.0" y2="82.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="347.5" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<text x="362.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text> <rect x="353.8" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<line x1="334.0" y1="82.0" x2="334.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="360.0" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<text x="334.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <rect x="366.2" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<line x1="390.0" y1="82.0" x2="474.0" y2="82.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="372.5" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<text x="432.0" y="78.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="378.8" y="425" width="5.8" height="8" fill="#60a5fa" opacity="0.7"/>
<line x1="390.0" y1="82.0" x2="390.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="385.0" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<text x="390.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <rect x="391.2" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<line x1="474.0" y1="82.0" x2="474.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="397.5" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<text x="474.0" y="113.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <rect x="403.8" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<line x1="82.0" y1="152.0" x2="166.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="410.0" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<text x="124.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="416.2" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<line x1="82.0" y1="152.0" x2="82.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="422.5" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<text x="82.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <rect x="428.8" y="425" width="5.8" height="8" fill="#8b5cf6" opacity="0.7"/>
<line x1="166.0" y1="152.0" x2="250.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="435.0" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<text x="208.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="441.2" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<line x1="166.0" y1="152.0" x2="166.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="447.5" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<text x="166.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <rect x="453.8" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<line x1="250.0" y1="152.0" x2="334.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="460.0" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<text x="292.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="466.2" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<line x1="250.0" y1="152.0" x2="250.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="472.5" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<text x="250.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">6.0mm</text> <rect x="478.8" y="425" width="5.8" height="8" fill="#a78bfa" opacity="0.7"/>
<line x1="334.0" y1="152.0" x2="390.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="485.0" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<text x="362.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text> <rect x="491.2" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<line x1="334.0" y1="152.0" x2="334.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="497.5" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<text x="334.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">6.0mm</text> <rect x="503.8" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<line x1="390.0" y1="152.0" x2="474.0" y2="152.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="510.0" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<text x="432.0" y="148.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="516.2" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<line x1="390.0" y1="152.0" x2="390.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="522.5" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<text x="390.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <rect x="528.8" y="425" width="5.8" height="8" fill="#f59e0b" opacity="0.7"/>
<line x1="474.0" y1="152.0" x2="474.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="535.0" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<text x="474.0" y="169.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <rect x="541.2" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<line x1="82.0" y1="194.0" x2="166.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="547.5" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<text x="124.0" y="190.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="553.8" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<line x1="82.0" y1="194.0" x2="82.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="560.0" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<text x="82.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="566.2" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<line x1="166.0" y1="194.0" x2="390.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="572.5" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<text x="278.0" y="190.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">8.0mm</text> <rect x="578.8" y="425" width="5.8" height="8" fill="#fbbf24" opacity="0.7"/>
<line x1="166.0" y1="194.0" x2="166.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="585.0" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<text x="166.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="591.2" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<line x1="390.0" y1="194.0" x2="474.0" y2="194.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="597.5" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<text x="432.0" y="190.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="603.8" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<line x1="390.0" y1="194.0" x2="390.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="610.0" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<text x="390.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="616.2" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<line x1="474.0" y1="194.0" x2="474.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="622.5" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<text x="474.0" y="232.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="628.8" y="425" width="5.8" height="8" fill="#ef4444" opacity="0.7"/>
<line x1="82.0" y1="278.0" x2="166.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="635.0" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<text x="124.0" y="274.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <rect x="641.2" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<line x1="82.0" y1="278.0" x2="82.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="647.5" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<text x="82.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <rect x="653.8" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<line x1="166.0" y1="278.0" x2="390.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="660.0" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<text x="278.0" y="274.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">8.0mm</text> <rect x="666.2" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<line x1="166.0" y1="278.0" x2="166.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <rect x="672.5" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<text x="166.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <rect x="678.8" y="425" width="5.8" height="8" fill="#f87171" opacity="0.7"/>
<line x1="390.0" y1="278.0" x2="474.0" y2="278.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <text x="485" y="445" text-anchor="middle" font-family="monospace" font-size="7" fill="#05966988">64 ports | 8 per PE (color-coded)</text>
<text x="432.0" y="274.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="135" y1="135" x2="285" y2="135" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="390.0" y1="278.0" x2="390.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="135" y1="135" x2="135" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="390.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <line x1="285" y1="135" x2="435" y2="135" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="474.0" y1="278.0" x2="474.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="285" y1="135" x2="285" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="474.0" y="295.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">1.5mm</text> <line x1="435" y1="135" x2="585" y2="135" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="82.0" y1="320.0" x2="166.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="435" y1="135" x2="435" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="124.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="585" y1="135" x2="685" y2="135" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="82.0" y1="320.0" x2="82.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="585" y1="135" x2="585" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="82.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <line x1="685" y1="135" x2="835" y2="135" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="166.0" y1="320.0" x2="250.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="685" y1="135" x2="685" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="208.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="835" y1="135" x2="835" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="166.0" y1="320.0" x2="166.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="135" y1="260" x2="285" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="166.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <line x1="135" y1="260" x2="135" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="250.0" y1="320.0" x2="334.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="285" y1="260" x2="435" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="292.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="285" y1="260" x2="285" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="250.0" y1="320.0" x2="250.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="435" y1="260" x2="585" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="250.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <line x1="435" y1="260" x2="435" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="334.0" y1="320.0" x2="390.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="585" y1="260" x2="685" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="362.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text> <line x1="585" y1="260" x2="585" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="334.0" y1="320.0" x2="334.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="685" y1="260" x2="835" y2="260" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="334.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <line x1="685" y1="260" x2="685" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="390.0" y1="320.0" x2="474.0" y2="320.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="835" y1="260" x2="835" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="432.0" y="316.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="135" y1="335" x2="285" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="390.0" y1="320.0" x2="390.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="135" y1="335" x2="135" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="390.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <line x1="285" y1="335" x2="685" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="474.0" y1="320.0" x2="474.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="285" y1="335" x2="285" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="474.0" y="351.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.5mm</text> <line x1="685" y1="335" x2="835" y2="335" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="82.0" y1="390.0" x2="166.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="685" y1="335" x2="685" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="124.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="835" y1="335" x2="835" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="166.0" y1="390.0" x2="250.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="135" y1="485" x2="285" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="208.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="135" y1="485" x2="135" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="250.0" y1="390.0" x2="334.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="285" y1="485" x2="685" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="292.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="285" y1="485" x2="285" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="334.0" y1="390.0" x2="390.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="685" y1="485" x2="835" y2="485" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="362.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">2.0mm</text> <line x1="685" y1="485" x2="685" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="390.0" y1="390.0" x2="474.0" y2="390.0" stroke="#a78bfa" stroke-width="0.5" opacity="0.4"/> <line x1="835" y1="485" x2="835" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<text x="432.0" y="386.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#64748b">3.0mm</text> <line x1="135" y1="560" x2="285" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<polyline points="82.0,48.4 82.0,50.2 82.0,50.2 82.0,82.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="135" y1="560" x2="135" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<polyline points="82.0,82.0 82.0,50.2 82.0,50.2 82.0,48.4" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <line x1="285" y1="560" x2="435" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<polyline points="82.0,82.0 222.0,82.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <line x1="285" y1="560" x2="285" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<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"/> <line x1="435" y1="560" x2="585" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<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="435" y1="560" x2="435" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="585" y1="560" x2="685" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="585" y1="560" x2="585" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<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"/> <line x1="685" y1="560" x2="835" y2="560" stroke="#475569" stroke-width="1" opacity="0.4"/>
<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="685" y1="560" x2="685" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="835" y1="560" x2="835" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="135" y1="685" x2="285" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<polyline points="166.0,48.4 166.0,50.2 166.0,50.2 166.0,82.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="285" y1="685" x2="435" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<polyline points="166.0,82.0 166.0,50.2 166.0,50.2 166.0,48.4" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <line x1="435" y1="685" x2="585" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<polyline points="166.0,82.0 222.0,82.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <line x1="585" y1="685" x2="685" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<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"/> <line x1="685" y1="685" x2="835" y2="685" stroke="#475569" stroke-width="1" opacity="0.4"/>
<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"/> <circle cx="135" cy="135" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="135" y="138" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r0c0</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="135" y="155" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE0, UCIe×2</text>
<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"/> <line x1="135" y1="145" x2="135" y2="285" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<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"/> <text x="147" y="215" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="285" cy="135" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="285" y="138" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r0c1</text>
<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"/> <text x="285" y="155" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE1, UCIe×1</text>
<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="285" y1="145" x2="285" y2="285" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="297" y="215" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="435" cy="135" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="435" y="138" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r0c2</text>
<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"/> <circle cx="585" cy="135" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="585" y="138" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r0c3</text>
<line x1="278.0" y1="56.8" x2="278.0" y2="56.8" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="685" cy="135" r="10" fill="#8b5cf6" stroke="#6d28d9" stroke-width="1.5"/>
<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"/> <text x="685" y="138" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r0c4</text>
<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"/> <text x="685" y="155" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">UCIe×1</text>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="835" cy="135" r="10" fill="#8b5cf6" stroke="#6d28d9" stroke-width="1.5"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="835" y="138" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r0c5</text>
<polyline points="390.0,48.4 390.0,85.2 390.0,85.2 390.0,152.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <text x="835" y="155" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">UCIe×2</text>
<polyline points="390.0,152.0 390.0,85.2 390.0,85.2 390.0,48.4" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <circle cx="135" cy="260" r="10" fill="#8b5cf6" stroke="#6d28d9" stroke-width="1.5"/>
<polyline points="390.0,152.0 222.0,152.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <text x="135" y="263" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r1c0</text>
<polyline points="474.0,48.4 474.0,85.2 474.0,85.2 474.0,152.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <text x="135" y="280" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">UCIe×1</text>
<polyline points="474.0,152.0 474.0,85.2 474.0,85.2 474.0,48.4" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <circle cx="285" cy="260" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<polyline points="474.0,152.0 222.0,152.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <text x="285" y="263" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r1c1</text>
<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"/> <circle cx="435" cy="260" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="435" y="263" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r1c2</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="585" cy="260" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="585" y="263" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r1c3</text>
<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"/> <circle cx="685" cy="260" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<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"/> <text x="685" y="263" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r1c4</text>
<polyline points="110.0,194.0 82.0,194.0 82.0,278.0" fill="none" stroke="#a78bfa" stroke-width="1" opacity="0.8"/> <text x="685" y="280" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE2</text>
<polyline points="82.0,423.6 82.0,356.8 82.0,356.8 82.0,320.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="685" y1="270" x2="685" y2="285" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<polyline points="82.0,320.0 82.0,356.8 82.0,356.8 82.0,423.6" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="697" y="278" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<polyline points="82.0,320.0 222.0,320.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <circle cx="835" cy="260" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<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"/> <text x="835" y="263" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r1c5</text>
<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"/> <text x="835" y="280" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE3, UCIe×1</text>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <line x1="835" y1="270" x2="835" y2="285" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="847" y="278" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<polyline points="166.0,423.6 166.0,356.8 166.0,356.8 166.0,320.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <circle cx="135" cy="335" r="10" fill="#f59e0b" stroke="#d97706" stroke-width="1.5"/>
<polyline points="166.0,320.0 166.0,356.8 166.0,356.8 166.0,423.6" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="135" y="338" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r2c0</text>
<polyline points="166.0,320.0 222.0,320.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <text x="135" y="355" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">M_CPU</text>
<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"/> <circle cx="285" cy="335" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="285" y="338" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r2c1</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="685" cy="335" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="685" y="338" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r2c4</text>
<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"/> <circle cx="835" cy="335" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="835" y="338" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r2c5</text>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="135" cy="485" r="10" fill="#f59e0b" stroke="#d97706" stroke-width="1.5"/>
<line x1="68.0" y1="236.0" x2="68.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="135" y="488" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r3c0</text>
<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"/> <text x="135" y="505" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">SRAM</text>
<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"/> <circle cx="285" cy="485" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="285" y="488" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r3c1</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="685" cy="485" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="685" y="488" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r3c4</text>
<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"/> <circle cx="835" cy="485" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="835" y="488" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r3c5</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="135" cy="560" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<polyline points="390.0,423.6 390.0,391.8 390.0,391.8 390.0,390.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <text x="135" y="563" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r4c0</text>
<polyline points="390.0,390.0 390.0,391.8 390.0,391.8 390.0,423.6" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="135" y="580" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE4, UCIe×1</text>
<polyline points="390.0,390.0 222.0,390.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <line x1="135" y1="570" x2="135" y2="535" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<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"/> <text x="147" y="552" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<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"/> <circle cx="285" cy="560" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="285" y="563" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r4c1</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="285" y="580" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE5</text>
<polyline points="474.0,423.6 474.0,391.8 474.0,391.8 474.0,390.0" fill="none" stroke="#f97316" stroke-width="1" opacity="0.8"/> <line x1="285" y1="570" x2="285" y2="535" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<polyline points="474.0,390.0 474.0,391.8 474.0,391.8 474.0,423.6" fill="none" stroke="#f59e0b" stroke-width="1" opacity="0.6"/> <text x="297" y="552" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<polyline points="474.0,390.0 222.0,390.0 222.0,236.0" fill="none" stroke="#10b981" stroke-width="0.5" opacity="0.3"/> <circle cx="435" cy="560" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="435" y="563" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r4c2</text>
<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"/> <circle cx="585" cy="560" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="585" y="563" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r4c3</text>
<line x1="488.0" y1="236.0" x2="488.0" y2="236.0" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <circle cx="685" cy="560" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<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"/> <text x="685" y="563" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r4c4</text>
<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"/> <circle cx="835" cy="560" r="10" fill="#8b5cf6" stroke="#6d28d9" stroke-width="1.5"/>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="835" y="563" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r4c5</text>
<line x1="278.0" y1="415.2" x2="278.0" y2="415.2" stroke="#94a3b8" stroke-width="1" opacity="0.8"/> <text x="835" y="580" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">UCIe×1</text>
<rect x="261.2" y="47.0" width="33.6" height="19.6" rx="4" fill="#3b82f6" stroke="#475569" stroke-width="1"/> <circle cx="135" cy="685" r="10" fill="#8b5cf6" stroke="#6d28d9" stroke-width="1.5"/>
<text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="7" fill="#ffffff">UCIe-N</text> <text x="135" y="688" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r5c0</text>
<rect x="266.8" y="49.8" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="135" y="705" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">UCIe×2</text>
<text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-N C0</text> <circle cx="285" cy="685" r="10" fill="#8b5cf6" stroke="#6d28d9" stroke-width="1.5"/>
<rect x="266.8" y="49.8" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="285" y="688" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r5c1</text>
<text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-N C1</text> <text x="285" y="705" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">UCIe×1</text>
<rect x="266.8" y="49.8" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <circle cx="435" cy="685" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-N C2</text> <text x="435" y="688" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r5c2</text>
<rect x="266.8" y="49.8" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <circle cx="585" cy="685" r="10" fill="#334155" stroke="#475569" stroke-width="1.5"/>
<text x="278.0" y="60.8" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-N C3</text> <text x="585" y="688" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r5c3</text>
<rect x="261.2" y="405.4" width="33.6" height="19.6" rx="4" fill="#3b82f6" stroke="#475569" stroke-width="1"/> <circle cx="685" cy="685" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<text x="278.0" y="419.2" text-anchor="middle" font-family="monospace" font-size="7" fill="#ffffff">UCIe-S</text> <text x="685" y="688" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r5c4</text>
<rect x="266.8" y="408.2" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="685" y="705" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE6, UCIe×1</text>
<text x="278.0" y="419.2" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-S C0</text> <line x1="685" y1="695" x2="685" y2="535" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<rect x="266.8" y="408.2" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="697" y="615" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<text x="278.0" y="419.2" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-S C1</text> <circle cx="835" cy="685" r="10" fill="#3b82f6" stroke="#1d4ed8" stroke-width="1.5"/>
<rect x="266.8" y="408.2" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="835" y="688" text-anchor="middle" font-family="monospace" font-size="7" font-weight="bold" fill="white">r5c5</text>
<text x="278.0" y="419.2" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-S C2</text> <text x="835" y="705" text-anchor="middle" font-family="monospace" font-size="6" fill="#94a3b8">PE7, UCIe×2</text>
<rect x="266.8" y="408.2" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <line x1="835" y1="695" x2="835" y2="535" stroke="#10b981" stroke-width="1.5" opacity="0.5" stroke-dasharray="4,3"/>
<text x="278.0" y="419.2" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-S C3</text> <text x="847" y="615" font-family="monospace" font-size="6" fill="#10b98188">256GB/s</text>
<rect x="471.2" y="226.2" width="33.6" height="19.6" rx="4" fill="#3b82f6" stroke="#475569" stroke-width="1"/> <rect x="120" y="103" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<text x="488.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#ffffff">UCIe-E</text> <text x="135" y="116" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE0</text>
<rect x="476.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <line x1="135" y1="121" x2="135" y2="125" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<text x="488.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-E C0</text> <rect x="270" y="103" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<rect x="476.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="285" y="116" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE1</text>
<text x="488.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-E C1</text> <line x1="285" y1="121" x2="285" y2="125" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<rect x="476.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <rect x="670" y="228" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<text x="488.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-E C2</text> <text x="685" y="241" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE2</text>
<rect x="476.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <line x1="685" y1="246" x2="685" y2="250" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<text x="488.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-E C3</text> <rect x="820" y="228" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<rect x="51.2" y="226.2" width="33.6" height="19.6" rx="4" fill="#3b82f6" stroke="#475569" stroke-width="1"/> <text x="835" y="241" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE3</text>
<text x="68.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#ffffff">UCIe-W</text> <line x1="835" y1="246" x2="835" y2="250" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<rect x="56.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <rect x="120" y="574" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<text x="68.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-W C0</text> <text x="135" y="587" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE4</text>
<rect x="56.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <line x1="135" y1="574" x2="135" y2="570" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<text x="68.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-W C1</text> <rect x="270" y="574" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<rect x="56.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <text x="285" y="587" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE5</text>
<text x="68.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-W C2</text> <line x1="285" y1="574" x2="285" y2="570" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<rect x="56.8" y="229.0" width="22.4" height="14.0" rx="4" fill="#e2e8f0" stroke="#475569" stroke-width="1"/> <rect x="670" y="699" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<text x="68.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#1e293b">UCIe-W C3</text> <text x="685" y="712" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE6</text>
<rect x="426.4" y="184.2" width="39.2" height="19.6" rx="4" fill="#f59e0b" stroke="#475569" stroke-width="1"/> <line x1="685" y1="699" x2="685" y2="695" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<text x="446.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">M CPU</text> <rect x="820" y="699" width="30" height="18" rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>
<rect x="196.8" y="224.8" width="50.4" height="22.4" rx="4" fill="#10b981" stroke="#475569" stroke-width="1"/> <text x="835" y="712" text-anchor="middle" font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">PE7</text>
<text x="222.0" y="240.0" text-anchor="middle" font-family="monospace" font-size="7" fill="#ffffff">HBM CTRL</text> <line x1="835" y1="699" x2="835" y2="695" stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>
<rect x="90.4" y="184.2" width="39.2" height="19.6" rx="4" fill="#f59e0b" stroke="#475569" stroke-width="1"/> <rect x="60" y="865" width="10" height="10" rx="2" fill="#3b82f6" stroke="#475569" stroke-width="0.5"/>
<text x="110.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">SRAM</text> <text x="74" y="874" font-family="monospace" font-size="8" fill="#94a3b8">PE Router</text>
<rect x="68.0" y="72.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/> <rect x="147" y="865" width="10" height="10" rx="2" fill="#f59e0b" stroke="#475569" stroke-width="0.5"/>
<text x="82.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R0C0</text> <text x="161" y="874" font-family="monospace" font-size="8" fill="#94a3b8">M_CPU / SRAM</text>
<rect x="152.0" y="72.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/> <rect x="255" y="865" width="10" height="10" rx="2" fill="#8b5cf6" stroke="#475569" stroke-width="0.5"/>
<text x="166.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R0C1</text> <text x="269" y="874" font-family="monospace" font-size="8" fill="#94a3b8">UCIe</text>
<rect x="236.0" y="72.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/> <rect x="307" y="865" width="10" height="10" rx="2" fill="#334155" stroke="#475569" stroke-width="0.5"/>
<text x="250.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R0C2</text> <text x="321" y="874" font-family="monospace" font-size="8" fill="#94a3b8">Relay</text>
<rect x="320.0" y="72.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/> <rect x="366" y="865" width="10" height="10" rx="2" fill="#10b981" stroke="#475569" stroke-width="0.5"/>
<text x="334.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R0C3</text> <text x="380" y="874" font-family="monospace" font-size="8" fill="#94a3b8">HBM Link</text>
<rect x="376.0" y="72.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/> <rect x="446" y="865" width="10" height="10" rx="2" fill="#475569" stroke="#475569" stroke-width="0.5"/>
<text x="390.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R0C4</text> <text x="460" y="874" font-family="monospace" font-size="8" fill="#94a3b8">Mesh Link</text>
<rect x="460.0" y="72.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="86.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R0C5</text>
<rect x="68.0" y="142.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R1C0</text>
<rect x="152.0" y="142.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R1C1</text>
<rect x="236.0" y="142.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R1C2</text>
<rect x="320.0" y="142.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R1C3</text>
<rect x="376.0" y="142.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R1C4</text>
<rect x="460.0" y="142.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="156.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R1C5</text>
<rect x="68.0" y="184.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R2C0</text>
<rect x="152.0" y="184.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R2C1</text>
<rect x="376.0" y="184.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R2C4</text>
<rect x="460.0" y="184.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="198.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R2C5</text>
<rect x="68.0" y="268.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R3C0</text>
<rect x="152.0" y="268.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R3C1</text>
<rect x="376.0" y="268.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R3C4</text>
<rect x="460.0" y="268.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="282.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R3C5</text>
<rect x="68.0" y="310.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R4C0</text>
<rect x="152.0" y="310.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R4C1</text>
<rect x="236.0" y="310.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R4C2</text>
<rect x="320.0" y="310.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R4C3</text>
<rect x="376.0" y="310.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R4C4</text>
<rect x="460.0" y="310.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="324.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R4C5</text>
<rect x="68.0" y="380.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R5C0</text>
<rect x="152.0" y="380.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R5C1</text>
<rect x="236.0" y="380.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="250.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R5C2</text>
<rect x="320.0" y="380.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="334.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R5C3</text>
<rect x="376.0" y="380.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R5C4</text>
<rect x="460.0" y="380.2" width="28.0" height="19.6" rx="4" fill="#f97316" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="394.0" text-anchor="middle" font-family="monospace" font-size="8" fill="#1e293b">R5C5</text>
<rect x="62.4" y="38.6" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="52.4" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE0</text>
<rect x="146.4" y="38.6" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="52.4" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE1</text>
<rect x="370.4" y="38.6" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="52.4" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE2</text>
<rect x="454.4" y="38.6" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="52.4" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE3</text>
<rect x="62.4" y="413.8" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="82.0" y="427.6" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE4</text>
<rect x="146.4" y="413.8" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="166.0" y="427.6" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE5</text>
<rect x="370.4" y="413.8" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="390.0" y="427.6" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE6</text>
<rect x="454.4" y="413.8" width="39.2" height="19.6" rx="4" fill="#94a3b8" stroke="#475569" stroke-width="1"/>
<text x="474.0" y="427.6" text-anchor="middle" font-family="monospace" font-size="10" fill="#1e293b">PE7</text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 25 KiB

+289 -1
View File
@@ -89,7 +89,10 @@ def emit_diagrams(graph: TopologyGraph, out_dir: Path) -> list[Path]:
for name, view in views: for name, view in views:
if view is None: if view is None:
continue continue
svg = _render_view_svg(view) if name == "cube_view":
svg = _render_cube_view_svg(view, graph.spec)
else:
svg = _render_view_svg(view)
path = out_dir / f"{name}.svg" path = out_dir / f"{name}.svg"
path.write_text(svg, encoding="utf-8") path.write_text(svg, encoding="utf-8")
created.append(path) created.append(path)
@@ -380,3 +383,288 @@ def _label_font_size(box_width: float, label: str) -> int:
def _escape(text: str) -> str: def _escape(text: str) -> str:
"""Escape XML special characters.""" """Escape XML special characters."""
return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;") return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
# ── Cube-specific renderer ──────────────────────────────────────────
def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str:
"""Render cube view with topology validation detail.
Shows: 6×6 router grid, PE attachments, HBM pseudo channel ports,
M_CPU/SRAM positions, UCIe connections, BW annotations.
"""
mesh_data = spec.get("_mesh", {})
routers = mesh_data.get("routers", {})
n_rows = mesh_data.get("mesh", {}).get("rows", 6)
n_cols = mesh_data.get("mesh", {}).get("cols", 6)
cube = spec.get("cube", {})
mm = cube.get("memory_map", {})
clinks = cube.get("links", {})
cube_w = cube.get("geometry", {}).get("cube_mm", {}).get("w", 17.0)
cube_h = cube.get("geometry", {}).get("cube_mm", {}).get("h", 14.0)
channels_per_pe = mm.get("hbm_channels_per_pe", 8)
channel_bw = mm.get("hbm_channel_bw_gbs", 32.0)
total_ch = mm.get("hbm_pseudo_channels", 64)
mode = mm.get("hbm_mapping_mode", "n_to_one")
agg_bw = channels_per_pe * channel_bw
scale = 50 # px per mm
pad = 60
w_px = int(cube_w * scale + 2 * pad)
h_px = int(cube_h * scale + 2 * pad + 80) # extra for legend
parts: list[str] = []
parts.append(_svg_header(w_px, h_px, "cube"))
# Background
parts.append(f' <rect width="{w_px}" height="{h_px}" fill="#0f172a"/>')
# Title
parts.append(
f' <text x="{w_px // 2}" y="22" text-anchor="middle" '
f'font-family="monospace" font-size="14" font-weight="bold" fill="#94a3b8">'
f'CUBE TOPOLOGY — {cube_w}×{cube_h}mm | {n_rows}×{n_cols} Router Mesh | '
f'{mode} mode | {total_ch} pseudo-ch</text>'
)
# Subtitle
parts.append(
f' <text x="{w_px // 2}" y="40" text-anchor="middle" '
f'font-family="monospace" font-size="10" fill="#64748b">'
f'Per-PE: {channels_per_pe} ch × {channel_bw} GB/s = {agg_bw} GB/s | '
f'Cube total: {total_ch} × {channel_bw} = {total_ch * channel_bw} GB/s</text>'
)
# Cube boundary
bx, by = pad, pad
parts.append(
f' <rect x="{bx}" y="{by}" width="{cube_w * scale}" height="{cube_h * scale}" '
f'rx="6" fill="none" stroke="#475569" stroke-width="2" stroke-dasharray="8,4"/>'
)
def mm2px(x_mm: float, y_mm: float) -> tuple[float, float]:
return pad + x_mm * scale, pad + y_mm * scale
# ── HBM zone background (centered, 9×5mm) ──
hbm_x, hbm_y = mm2px(4.0, 4.5)
hbm_w, hbm_h = 9.0 * scale, 5.0 * scale
parts.append(
f' <rect x="{hbm_x:.0f}" y="{hbm_y:.0f}" '
f'width="{hbm_w:.0f}" height="{hbm_h:.0f}" '
f'rx="6" fill="#052e16" stroke="#047857" stroke-width="2" opacity="0.6"/>'
)
# HBM label
hcx, hcy = mm2px(8.5, 7.0)
parts.append(
f' <text x="{hcx:.0f}" y="{hcy - 15:.0f}" text-anchor="middle" '
f'font-family="monospace" font-size="11" font-weight="bold" fill="#047857">'
f'HBM_CTRL | {total_ch} pseudo channels</text>'
)
parts.append(
f' <text x="{hcx:.0f}" y="{hcy + 2:.0f}" text-anchor="middle" '
f'font-family="monospace" font-size="9" fill="#05966988">'
f'Total BW: {total_ch * channel_bw:.0f} GB/s</text>'
)
# ── Pseudo channel port indicators (horizontal bar inside HBM zone) ──
port_bar_y = hcy + 15
port_bar_w = 8.0 * scale # slightly narrower than HBM zone
port_bar_x = hcx - port_bar_w / 2
port_w = port_bar_w / total_ch
for i in range(total_ch):
pe_owner = i // channels_per_pe
# Color by PE owner
colors = ["#3b82f6", "#60a5fa", "#8b5cf6", "#a78bfa",
"#f59e0b", "#fbbf24", "#ef4444", "#f87171"]
c = colors[pe_owner % len(colors)]
px = port_bar_x + i * port_w
parts.append(
f' <rect x="{px:.1f}" y="{port_bar_y:.0f}" '
f'width="{max(port_w - 0.5, 1):.1f}" height="8" '
f'fill="{c}" opacity="0.7"/>'
)
# Port bar label
parts.append(
f' <text x="{hcx:.0f}" y="{port_bar_y + 20:.0f}" text-anchor="middle" '
f'font-family="monospace" font-size="7" fill="#05966988">'
f'{total_ch} ports | {channels_per_pe} per PE (color-coded)</text>'
)
# ── Router mesh links ──
for r in range(n_rows):
for c in range(n_cols):
rkey = f"r{r}c{c}"
if routers.get(rkey) is None:
continue
rx, ry = routers[rkey]["pos_mm"]
sx, sy = mm2px(rx, ry)
# Horizontal neighbor
for nc in range(c + 1, n_cols):
nkey = f"r{r}c{nc}"
if routers.get(nkey) is None:
continue
nx, ny = routers[nkey]["pos_mm"]
dx, dy = mm2px(nx, ny)
parts.append(
f' <line x1="{sx:.0f}" y1="{sy:.0f}" '
f'x2="{dx:.0f}" y2="{dy:.0f}" '
f'stroke="#475569" stroke-width="1" opacity="0.4"/>'
)
break
# Vertical neighbor
for nr in range(r + 1, n_rows):
nkey = f"r{nr}c{c}"
if routers.get(nkey) is None:
continue
nx, ny = routers[nkey]["pos_mm"]
dx, dy = mm2px(nx, ny)
parts.append(
f' <line x1="{sx:.0f}" y1="{sy:.0f}" '
f'x2="{dx:.0f}" y2="{dy:.0f}" '
f'stroke="#475569" stroke-width="1" opacity="0.4"/>'
)
break
# ── Router nodes ──
r_size = 10 # px radius
pe_routers: dict[str, str] = {} # rkey → pe label
for rkey, rval in routers.items():
if rval is None:
continue
rx, ry = rval["pos_mm"]
px, py = mm2px(rx, ry)
attach = rval.get("attach", [])
# Determine router type by attachments
has_pe = any(a.endswith(".dma") for a in attach)
has_mcpu = "m_cpu" in attach
has_sram = "sram" in attach
has_ucie = any(a.startswith("ucie_") for a in attach)
if has_pe:
fill, stroke = "#3b82f6", "#1d4ed8"
pe_name = [a for a in attach if a.endswith(".dma")][0].split(".")[0]
pe_routers[rkey] = pe_name.upper()
elif has_mcpu:
fill, stroke = "#f59e0b", "#d97706"
elif has_sram:
fill, stroke = "#f59e0b", "#d97706"
elif has_ucie:
fill, stroke = "#8b5cf6", "#6d28d9"
else:
fill, stroke = "#334155", "#475569"
parts.append(
f' <circle cx="{px:.0f}" cy="{py:.0f}" r="{r_size}" '
f'fill="{fill}" stroke="{stroke}" stroke-width="1.5"/>'
)
# Router label
parts.append(
f' <text x="{px:.0f}" y="{py + 3:.0f}" text-anchor="middle" '
f'font-family="monospace" font-size="7" font-weight="bold" fill="white">'
f'{rkey}</text>'
)
# Attachment labels below router
label_parts = []
if has_pe:
label_parts.append(pe_routers[rkey])
if has_mcpu:
label_parts.append("M_CPU")
if has_sram:
label_parts.append("SRAM")
ucie_items = [a for a in attach if a.startswith("ucie_")]
if ucie_items:
label_parts.append(f"UCIe×{len(ucie_items)}")
if label_parts:
parts.append(
f' <text x="{px:.0f}" y="{py + r_size + 10:.0f}" text-anchor="middle" '
f'font-family="monospace" font-size="6" fill="#94a3b8">'
f'{", ".join(label_parts)}</text>'
)
# ── PE → HBM connection line (for PE routers) ──
if has_pe:
# Draw line from router to HBM zone edge
target_y = hbm_y if py < hbm_y else hbm_y + hbm_h
parts.append(
f' <line x1="{px:.0f}" y1="{py + r_size:.0f}" '
f'x2="{px:.0f}" y2="{target_y:.0f}" '
f'stroke="#10b981" stroke-width="1.5" opacity="0.5" '
f'stroke-dasharray="4,3"/>'
)
# BW annotation
bw_y = (py + r_size + target_y) / 2
parts.append(
f' <text x="{px + 12:.0f}" y="{bw_y:.0f}" '
f'font-family="monospace" font-size="6" fill="#10b98188">'
f'{agg_bw:.0f}GB/s</text>'
)
# ── PE blocks (drawn next to their router) ──
pe_w, pe_h = 30, 18 # px
for rkey, rval in routers.items():
if rval is None:
continue
attach = rval.get("attach", [])
pe_dma = [a for a in attach if a.endswith(".dma")]
if not pe_dma:
continue
pe_name = pe_dma[0].split(".")[0] # "pe0"
pe_label = pe_name.upper()
rx, ry = rval["pos_mm"]
px, py = mm2px(rx, ry)
# Position PE block: top-half PEs above router, bottom-half below
is_top = ry < cube_h / 2
pe_x = px - pe_w / 2
pe_y = py - r_size - pe_h - 4 if is_top else py + r_size + 4
parts.append(
f' <rect x="{pe_x:.0f}" y="{pe_y:.0f}" '
f'width="{pe_w}" height="{pe_h}" '
f'rx="3" fill="#2d1f3d" stroke="#a855f7" stroke-width="1"/>'
)
parts.append(
f' <text x="{px:.0f}" y="{pe_y + pe_h / 2 + 4:.0f}" text-anchor="middle" '
f'font-family="monospace" font-size="8" font-weight="bold" fill="#a855f7">'
f'{pe_label}</text>'
)
# PE ↔ router link
link_y1 = pe_y + pe_h if is_top else pe_y
link_y2 = py - r_size if is_top else py + r_size
parts.append(
f' <line x1="{px:.0f}" y1="{link_y1:.0f}" '
f'x2="{px:.0f}" y2="{link_y2:.0f}" '
f'stroke="#a855f7" stroke-width="1.5" opacity="0.7"/>'
)
# ── Legend ──
ly = h_px - 35
legend_items = [
("#3b82f6", "PE Router"),
("#f59e0b", "M_CPU / SRAM"),
("#8b5cf6", "UCIe"),
("#334155", "Relay"),
("#10b981", "HBM Link"),
("#475569", "Mesh Link"),
]
lx = pad
for color, label in legend_items:
parts.append(
f' <rect x="{lx}" y="{ly}" width="10" height="10" rx="2" '
f'fill="{color}" stroke="#475569" stroke-width="0.5"/>'
)
parts.append(
f' <text x="{lx + 14}" y="{ly + 9}" '
f'font-family="monospace" font-size="8" fill="#94a3b8">'
f'{label}</text>'
)
lx += len(label) * 7 + 24
parts.append("</svg>")
return "\n".join(parts)
+2 -3
View File
@@ -34,14 +34,13 @@ def test_svg_output_is_deterministic(tmp_path):
def test_cube_svg_contains_hbm_ctrl(tmp_path): def test_cube_svg_contains_hbm_ctrl(tmp_path):
_emit(tmp_path) _emit(tmp_path)
svg = (tmp_path / "cube_view.svg").read_text() svg = (tmp_path / "cube_view.svg").read_text()
assert "HBM CTRL" in svg assert "HBM_CTRL" in svg
def test_cube_svg_contains_ucie_ports(tmp_path): def test_cube_svg_contains_ucie_ports(tmp_path):
_emit(tmp_path) _emit(tmp_path)
svg = (tmp_path / "cube_view.svg").read_text() svg = (tmp_path / "cube_view.svg").read_text()
for port in ("UCIe-N", "UCIe-S", "UCIe-W", "UCIe-E"): assert "UCIe" in svg
assert port in svg
def test_cube_svg_contains_pe_nodes(tmp_path): def test_cube_svg_contains_pe_nodes(tmp_path):