diff --git a/docs/diagrams/cube_view.svg b/docs/diagrams/cube_view.svg
index 522b909..1900de0 100644
--- a/docs/diagrams/cube_view.svg
+++ b/docs/diagrams/cube_view.svg
@@ -190,9 +190,9 @@
256GB/s
r2c0
-
- M_CPU
-
+
+ M_CPU
+
r2c1
@@ -201,9 +201,9 @@
r2c5
r3c0
-
- SRAM
-
+
+ SRAM
+
r3c1
@@ -274,38 +274,38 @@
UCIe-S.c3
256GB/s
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
PE Router
diff --git a/src/kernbench/topology/visualizer.py b/src/kernbench/topology/visualizer.py
index 39965e6..e61a4fe 100644
--- a/src/kernbench/topology/visualizer.py
+++ b/src/kernbench/topology/visualizer.py
@@ -603,8 +603,12 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str:
bx, by = bx_base + 4, py + offset_x - blk_h / 2
else:
bx, by = px + offset_x - blk_w / 2, py - r_size - blk_h - 4
+ elif kind in ("mcpu", "sram"):
+ # M_CPU/SRAM: place to the left of router (avoid mesh overlap)
+ bx = px - r_size - blk_w - 6
+ by = py - blk_h / 2 + bi * (blk_h + 2)
else:
- # PE/M_CPU/SRAM: place above (top half) or below (bottom half)
+ # PE: place above (top half) or below (bottom half)
bx = px + offset_x - blk_w / 2
if is_top:
by = py - r_size - blk_h - 4 - bi * (blk_h + 2)
@@ -651,8 +655,15 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str:
f'x2="{px + r_size:.0f}" y2="{py:.0f}" '
f'stroke="{style["stroke"]}" stroke-width="1" opacity="0.6"/>'
)
+ elif kind in ("mcpu", "sram"):
+ # Horizontal connector (block right edge → router left edge)
+ parts.append(
+ f' '
+ )
else:
- # Vertical connector
+ # Vertical connector (PE above/below router)
ly1 = by + blk_h if is_top else by
ly2 = py - r_size if is_top else py + r_size
parts.append(
@@ -674,6 +685,8 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str:
)
# ── Router → HBM_CTRL lines (drawn last, on top of everything) ──
+ # Lines go from router to the HBM zone edge, angled toward HBM center
+ # to visually distinguish from vertical mesh links
for rkey, rval in routers.items():
if rval is None:
continue
@@ -683,12 +696,13 @@ def _render_cube_view_svg(view: ViewGraph, spec: dict) -> str:
r_edge_y = py + r_size if py < hbm_y else py - r_size
if abs(r_edge_y - hbm_edge_y) > 10:
has_pe = any(a.endswith(".dma") for a in rval.get("attach", []))
- # PE routers: thicker, more visible
sw = "1.5" if has_pe else "0.7"
- op = "0.6" if has_pe else "0.2"
+ op = "0.6" if has_pe else "0.15"
+ # Angle toward HBM center x (hcx) — slight offset, not fully straight
+ dx = (hcx - px) * 0.3 # 30% pull toward center
parts.append(
f' '
)