Skip to content

web: show bump footprints and logical inter-die links in 3D - #11897

Open
naveenvenk17 wants to merge 7 commits into
The-OpenROAD-Project:masterfrom
naveenvenk17:nv-web-interdie-links-11048
Open

naveenvenk17 wants to merge 7 commits into
The-OpenROAD-Project:masterfrom
naveenvenk17:nv-web-interdie-links-11048

Conversation

@naveenvenk17

@naveenvenk17 naveenvenk17 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

The 3D viewer shows chip bodies but leaves out their interconnects. This adds placed bump footprints from ODB geometry and logical links between bumps on each inter-die net.

Bumps, links and chip bodies have separate visibility controls. The geometry follows chiplet transforms and stacking offsets, including True Z mode. Bumps are instanced and links are batched. These links show connectivity, not routed wires or TSV geometry.

I merged upstream and regenerated the browser assets. I also fixed the grid-layout resize feedback loop and camera fitting on load, reset and resize.

Browser testing caught another bug: hierarchical designs without a top-level block omitted their database scale from the tech response. The app then used 1000 DBU per micron for a design using 2000. The serializer now returns the actual positive database scale. New tests exercise the real tech handler for hierarchical, flat and empty databases.

Testing on a Linux GCP VM, with test-result caching disabled:

  • All 63 selected web and asset checks passed.
  • All nine native interconnect cases passed in seven fresh runs, including 20,000 bumps and 5,000 four-terminal nets. Every transformed footprint and logical endpoint is checked.
  • Chromium passed 60 captures covering visibility controls, True Z, rotation, pan, zoom, reset, dock resize and portrait component resizing. Geometry and canvas pixels were checked, and representative screenshots were inspected.
  • The stress scene passed 30 rebuilds in each desktop and portrait scope, with disposal checks and stable geometry/texture counts. Idle checks found no continuing resize loop.

Browser coverage used the exact regenerated bundle and fresh native fixture replay with software WebGL. It is not a live C++ network-server test, a GPU memory or speed benchmark, or a claim of full-app mobile support. Portrait coverage is the original bundled 3D component.

This is part of #11048 and replaces #11847.

Carry forward the reviewed changes from The-OpenROAD-Project#11847 under the correct contributor account.
The source tree matches f9a5e95.

Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>
@naveenvenk17
naveenvenk17 requested a review from a team as a code owner October 21, 2026 14:14
@naveenvenk17
naveenvenk17 requested a review from gadfort October 21, 2026 14:14
@github-actions

Copy link
Copy Markdown
Contributor

This PR exceeds the recommended size of 1000 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces 3D interconnect visualization for the chiplet viewer, including bump footprints and logical net links. It adds new logic in the backend to extract and format this data, updates the frontend 3D viewer to render these meshes with visibility controls, and implements robust camera fitting logic. The reviewer identified several potential null pointer dereferences and type errors in the new implementation, suggesting necessary safety checks to prevent crashes.

Comment on lines +4260 to +4261
for (const ChipletNode& node : nodes) {
for (odb::dbChipNet* net : node.chip->getChipNets()) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

Potential null pointer dereference. node.chip can be nullptr (as checked in handleGet3DData on line 4326). If node.chip is null, calling node.chip->getChipNets() will result in a crash. A null check should be added before accessing getChipNets().

  for (const ChipletNode& node : nodes) {
    if (node.chip == nullptr) {
      continue;
    }
    for (odb::dbChipNet* net : node.chip->getChipNets()) {

Comment on lines +4239 to +4244
for (odb::dbChipBumpInst* bump_inst : region_inst->getChipBumpInsts()) {
odb::dbInst* inst = bump_inst->getChipBump()->getInst();
if (inst == nullptr || !inst->isPlaced()) {
continue;
}
odb::Rect footprint = inst->getBBox()->getBox();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Potential null pointer dereference. bump_inst->getChipBump() and inst->getBBox() can return nullptr in certain database states or incomplete designs. Accessing them without null checks can lead to server crashes. It is safer to add null checks before dereferencing them.

Suggested change
for (odb::dbChipBumpInst* bump_inst : region_inst->getChipBumpInsts()) {
odb::dbInst* inst = bump_inst->getChipBump()->getInst();
if (inst == nullptr || !inst->isPlaced()) {
continue;
}
odb::Rect footprint = inst->getBBox()->getBox();
for (odb::dbChipBumpInst* bump_inst : region_inst->getChipBumpInsts()) {
odb::dbChipBump* bump = bump_inst->getChipBump();
if (bump == nullptr) {
continue;
}
odb::dbInst* inst = bump->getInst();
if (inst == nullptr || !inst->isPlaced()) {
continue;
}
odb::dbBox* bbox = inst->getBBox();
if (bbox == nullptr) {
continue;
}
odb::Rect footprint = bbox->getBox();

Comment on lines +581 to +582
_fitCameraDistance() {
const b = this._sceneBounds;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

If this._sceneBounds is null or undefined (for example, during initialization or before a design is loaded), accessing properties on b will throw a TypeError. Adding a guard clause to return a default distance prevents potential crashes.

Suggested change
_fitCameraDistance() {
const b = this._sceneBounds;
_fitCameraDistance() {
const b = this._sceneBounds;
if (!b) {
return 1000;
}

Regenerated against the current upstream merge and checked for idempotence on the GCP VM. Only the missing Bison registry checksum is added; no dependency versions change.

Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>
Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>
@naveenvenk17

Copy link
Copy Markdown
Contributor Author

I checked these against the traversal and ODB constructors. Grouping nodes can have no block, but the collected nodes still have a chip. Region and bump instances are created with their owning objects, and an instance's bounding box is allocated at creation. The existing nullable placement instance is already checked here.

For the camera, scene bounds are set before the initial fit. Reset and resize both guard the unloaded state. The grouping-node and camera lifecycle cases are in the viewer tests, so I kept the existing contracts rather than silently skipping valid net data.

Keep the feature tree unchanged and refresh pull-request CI after the missing registry checksum was added to master.

Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>

@vvbandeira vvbandeira left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

approved from devops team side

Regenerate the browser bundles from the merged source. Keep the bump and logical-link viewer and its resize-loop regression.

Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>
Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>
Use the database scale when the top chip has no block. Leave flat-block responses and empty databases unchanged.

Cover the native tech response for hierarchical, flat and empty designs, and require replay fixtures to carry the database scale.

Signed-off-by: Naveen Venkat <81929600+naveenvenk17@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants