From 29242ae016f52736d63531b14937af2515c66fbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Wed, 3 Jun 2026 18:38:58 +0200 Subject: [PATCH] dashboard: nest the dropped-NC detail under the NC row MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The detail block was rendered after *all* health rows, so it dangled below the new model: row instead of the NC: row it explains — its indentation read as broken. Build it into health_rows right after the NC row, with a tree marker (↳ dropped (only 1 pin on the net):) and consistent nesting. Co-Authored-By: Claude Opus 4.8 --- src/tui/screen_dashboard.cpp | 41 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/tui/screen_dashboard.cpp b/src/tui/screen_dashboard.cpp index 75e4b13..4c65a8c 100644 --- a/src/tui/screen_dashboard.cpp +++ b/src/tui/screen_dashboard.cpp @@ -149,6 +149,26 @@ Component Tui::BuildDashboardScreen() { "NC: " + std::to_string(orph_total) + " orphan pin(s) (" + std::to_string(orph_imported) + " imported, " + std::to_string(orph_dropped) + " dropped)")); + // Detail nested directly under the NC row it explains. "dropped" = the + // pin was the only one on its net, so essim detached it (a heuristic; + // listing them lets the user spot a false positive). Imported NCs were + // explicit in the netlist, so they are not expanded. + if (orph_dropped > 0) { + health_rows.push_back( + text(" ↳ dropped (only 1 pin on the net):") | dim); + for (auto &dkv : dropped_by_module) { + std::sort(dkv.second.begin(), dkv.second.end(), NaturalLess); + std::string csv; + for (size_t i = 0; i < dkv.second.size(); ++i) { + if (i) csv += ", "; + csv += dkv.second[i]; + } + health_rows.push_back(hbox({ + text(" " + dkv.first + ": ") | bold, + text(csv) | dim, + })); + } + } // Model-driven checks (BSDL pin specs, JTAG chain, source conflicts), // reusing the nets computed above. @@ -253,27 +273,6 @@ Component Tui::BuildDashboardScreen() { lines.push_back(separator()); lines.push_back(text(" Health") | bold); for (auto &h : health_rows) lines.push_back(std::move(h)); - // Detail rows for the dropped-singleton NCs. Imported NCs are not - // expanded — they were already explicit in the netlist. Dropped NCs - // come from a heuristic, so listing them gives the user a chance to - // spot a false positive. - if (orph_dropped > 0) { - lines.push_back(hbox({ - text(" dropped — net has only 1 pin (NC):") | dim, - })); - for (auto &dkv : dropped_by_module) { - std::sort(dkv.second.begin(), dkv.second.end(), NaturalLess); - std::string csv; - for (size_t i = 0; i < dkv.second.size(); ++i) { - if (i) csv += ", "; - csv += dkv.second[i]; - } - lines.push_back(hbox({ - text(" " + dkv.first + ": ") | bold, - text(csv), - })); - } - } lines.push_back(separator()); lines.push_back(text(" Analysis") | bold); lines.push_back(hbox({text(" • ") | dim,