François 90502c0762 Dashboard + palette + analyze screen; consolidated categorization rules.
UI restructuring:

- Dashboard (`screen_dashboard.cpp`, `screen_idx = 6`) is the new home
  screen at boot. Reads Overview / Health / Analysis / Modules from
  the current System every frame; per-module rows list parts grouped
  by `connector_type` and a Power/Gnd inference summary (yellow when
  any name-Power signal is refuted). Scrollable via PgUp/PgDn/Home/End.
  Letter shortcuts: `c`=console, `s`=search, `p`=plug (alias of
  connect), `t`=set-type, `e`=explore, `n`=net, `a`=analyze, `q`=quit.
- Global Ctrl-P palette (`screen_palette.cpp`) — fuzzy-finds over
  registered commands + module / signal names. Activation runs the
  bare command or jumps to the matching screen with state seeded.
- Unified analyze screen (`screen_analyze.cpp`, `screen_idx = 7`):
  tabbed layout (`Issues / Groups / Types`), Tab or ←→ to switch
  tabs, ↑/↓ to navigate the focused list. Replaces the previous
  shell-bouncing `[v]erify` shortcut — `verify` content is now in
  the Issues tab. Types tab attaches the decision rationale to each
  signal row (fan-out / voltage / hard floor).
- Context help panel: `RenderHelpPanel(title, entries)` in
  `tui_helpers.{hpp,cpp}` rendered on the right of every screen.
- Console (former "log") rename: screen 0 is `[c]onsole` in the UI
  and "console" in its help-panel title. The underlying screen and
  the shell prompt are unchanged.
- Esc from any non-home screen returns to the dashboard. The
  dashboard itself swallows Esc; quit via `q` / the `quit` command.
  `quit` now calls `screen_ptr->Exit()` directly so it works from
  any screen including via the palette.

Signal type inference:

- `Signal::type` defaults to `Other` — auto-inference no longer
  happens at construction.
- `infer_signal_types(System*)` is called at the end of every load.
  Three rules: GndShield from name alone; Power requires name match
  + a hard fan-out floor (< 3 pins = always Other, regardless of
  name or voltage) + at least one positive structural signal
  (fan-out ≥ 4 OR voltage pattern in the name like `3V3`, `5V`).
- Thresholds exposed in `analysis.hpp` (`POWER_FANOUT_HARD_FLOOR`,
  `POWER_FANOUT_CONFIRM_MIN`, `has_voltage_pattern`) so the analyze
  screen can render the same rationale without duplicating logic.
- `set-signal-type` still wins; save/restore round-trips the type.

Analysis groups & anomalies:

- New `GroupKind::DiffBus` — ≥ 2 diff pairs sharing the same
  outer-stem with consecutive integer indices are aggregated into a
  single bus (`MDI[0..3]_P/N`). `MDI0` and `PCIE_TX_0` index forms
  both accepted. Solo pairs under a bus-able stem fall back to
  `DiffPair`.
- New `AnomalyKind::DiffBusGap` for missing lanes.

Documentation:

- `DESIGN.md`: dedicated "Categorization rules (normative)" section
  consolidating signal type, NC origin, signal groups, anomalies,
  component kind, and connector wiring rules with exact thresholds
  and decision order.
- `doc/user/analysis.md` (new): user-facing version of the same
  rules in plain language. Linked from `doc/user/index.md`.

Tests: +6 new cases (62 total). Adjusted `test_persist.cpp` to set
the signal type explicitly in the fixture (no more auto-inference).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 20:23:33 +02:00
2025-03-21 18:47:49 +01:00
2025-03-21 18:51:19 +01:00
2026-05-08 20:38:30 +02:00

essim — system digital twin

Interactive simulator for the inter-card connections inside a system. Built around a domain model of modules → parts → pins / signals → connections, with importers for Mentor Graphics, Altium and ODS pinout sheets, a TUI shell with scripting, snapshots and BFS net analysis.

Status: early work-in-progress.

Quick start

cmake -S . -B build
cmake --build build -j
./build/essim

Requirements:

  • A C++17 compiler.
  • CMake 3.14+.
  • System packages: libzip and pugixml (Arch: pacman -S libzip pugixml).
  • FTXUI (v6.1.9) and doctest (v2.4.11) are fetched at configure time via FetchContent.

Inside the shell, type help for the live command list — or read the auto-generated reference at doc/user/commands.md. A worked bring-up script is at test/system.essim; load it with source test/system.essim.

Tests

./build/essim_tests
# or
ctest --test-dir build

Skip building tests entirely:

cmake -S . -B build -DBUILD_TESTING=OFF

Documentation

  • doc/user/ — user guide, command reference, scripting.
  • doc/api/ — auto-generated C++ API reference.
  • DESIGN.md — implementation notes (domain conventions, TUI internals, gotchas).
  • doc/README.md — how the doc pipeline is wired.

Regenerate auto-generated parts after substantive code changes:

cmake --build build --target doc      # needs doxygen + python3

Project layout

src/system/   domain model (Module/Part/Pin/Signal, Connection, Transform, …)
src/imports/  Mentor / Altium / ODS netlist importers
src/tui/      FTXUI shell (commands, screens, completion, history)
tests/        doctest suite
doc/          api/ + user/ Markdown trees, Doxyfile.in, gen_api_md.py
test/         sample netlists + system.essim bring-up script

Full layout & rationale in DESIGN.md.

Licence

Copyright (c) 2026 François Dausseur

Licensed under the European Union Public Licence (EUPL), Version 1.2 — the "Licence". You may not use this work except in compliance with the Licence. You may obtain a copy of the Licence in the LICENSE file or at https://joinup.ec.europa.eu/software/page/eupl.

Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licence for the specific language governing permissions and limitations under the Licence.

SPDX-License-Identifier: EUPL-1.2

Description
Embedded System Simulation
Readme EUPL-1.2 3.8 MiB
Languages
C++ 98.2%
CMake 1.8%