diff --git a/docs/diagrams/cube_view.svg b/docs/diagrams/cube_view.svg
index 051a1ac..98326fa 100644
--- a/docs/diagrams/cube_view.svg
+++ b/docs/diagrams/cube_view.svg
@@ -109,8 +109,8 @@
2.0mm
3.0mm
-
-
+
+
@@ -120,8 +120,8 @@
-
-
+
+
@@ -143,11 +143,11 @@
-
-
+
+
-
-
+
+
@@ -156,15 +156,15 @@
-
-
+
+
-
-
+
+
@@ -182,15 +182,15 @@
-
-
+
+
-
-
+
+
@@ -310,20 +310,20 @@
R5C4
R5C5
-
- PE0
-
- PE1
-
- PE2
-
- PE3
-
- PE4
-
- PE5
-
- PE6
-
- PE7
+
+ PE0
+
+ PE1
+
+ PE2
+
+ PE3
+
+ PE4
+
+ PE5
+
+ PE6
+
+ PE7
\ No newline at end of file
diff --git a/src/kernbench/topology/builder.py b/src/kernbench/topology/builder.py
index 3b2297e..a6173bc 100644
--- a/src/kernbench/topology/builder.py
+++ b/src/kernbench/topology/builder.py
@@ -946,13 +946,17 @@ def _build_cube_view(spec: dict) -> ViewGraph:
) if mesh_data else {}
pe_idx = 0
+ pe_offset_y = 1.2 # mm offset to avoid overlapping router node
for corner in corners:
+ is_top = corner in ("NW", "NE")
for ci in range(pe_per_corner):
pid = f"pe{pe_idx}"
px, py = corner_pos[corner][ci]
+ # Offset PE above (top) or below (bottom) its router
+ py_view = py - pe_offset_y if is_top else py + pe_offset_y
nodes[pid] = Node(
id=pid, kind="pe", impl="",
- attrs={"corner": corner}, pos_mm=(px, py),
+ attrs={"corner": corner}, pos_mm=(px, py_view),
label=f"PE{pe_idx}",
)
pe_idx += 1
diff --git a/src/kernbench/topology/visualizer.py b/src/kernbench/topology/visualizer.py
index c02b18f..92149af 100644
--- a/src/kernbench/topology/visualizer.py
+++ b/src/kernbench/topology/visualizer.py
@@ -157,7 +157,7 @@ def _compute_node_sizes(
w_mm, h_mm = _KIND_SIZE.get(node.kind, (_DEFAULT_NODE_W, _DEFAULT_NODE_H))
# For cube view, use smaller PE nodes
if view.name == "cube" and node.kind == "pe":
- w_mm, h_mm = 1.8, 1.0
+ w_mm, h_mm = 1.4, 0.7
if view.name == "pe":
w_mm, h_mm = 2.5, 1.4
sizes[nid] = (w_mm * scale, h_mm * scale)