fix: direct-config param override crash, stale routing STA lifecycle, and sizer crash diagnostics - #283
Merged
Conversation
Direct config/PDK parameters (maps_to=None) are applied through their explicit config target and have no legacy backend projection. _backend_leaf_keys now returns an empty tuple for them instead of calling .items() on None, and a diverging direct-config override reports its canonical parameter name rather than an invented backend leaf key. Covers both --set runs and project-level ecc.toml [params] runs, with registry-wide regressions over every schema mapping shape.
The routing path and save_data still called release_sta/init_sta/ report_timing, an STA lifecycle that ecc-tools removed on 2026-07-29 (1a4440525) and that no longer exists on ECCToolsModule or the raw binding. Enabling route.RT.-enable_timing therefore crashed the routing step with AttributeError before the router started. iRT's timing mode is self-contained: RTInterface builds its own timing engine from the shared db config (lib paths, SDC set by load_data), so the Python-side pre-init is removed rather than ported. save_data's report_timing block was unreachable (every caller passed False) and is dropped together with the parameter; the unused is_rt_timing_enable wrapper follows.
Timing-opt failures now distinguish a fatal signal (signal=SIGABRT(6)) from a plain tool exit (exit_code=N) and surface the first native fatal banner from the step log (e.g. glibc buffer overflow), so tool crashes, external kills, and timeouts remain separable in the wrapper evidence.
Emin017
approved these changes
Sep 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What Changed
fix(cli): direct-config/PDK parameters (maps_to=None, e.g.place.random_seed,route.RT.*) crashed every divergence check withAttributeError: 'NoneType' object has no attribute 'items'— bothecc run --setand project-levelecc param set+ run, before any EDA step started._backend_leaf_keysnow returns an empty tuple for them (they are applied through their explicitconfig_target), and a diverging direct-config override reports its canonical parameter name instead of an invented backend leaf key.fix(ecc): timing-driven routing (route.RT.-enable_timing=1) crashed the routing step withAttributeError: 'ECCToolsModule' object has no attribute 'release_sta'. The STA pre-init block (andsave_data's unreachablereport_timingblock) referenced an ecc-tools lifecycle removed on 2026-07-29 (1a4440525). Removed rather than ported: iRT'sRTInterfacebuilds its own timing engine from the shared db config (lib paths/SDC set byload_data), verified against the pinned submodule source. The unusedis_rt_timing_enablewrapper is dropped with it.feat(sizer): Timing-opt failures now distinguish a fatal signal (signal=SIGABRT(6)) from a plain exit (exit_code=N) and surface the first native fatal banner from the step log, keeping tool crashes, external kills, and timeouts separable in wrapper evidence.Before/after for the CLI crash (fresh manifest project):
Scope
uv.lock, or release artifacts.Runtime And Packaging Impact
ecc-toolsorecc-dreamplacedependency changedNotes:
exit code=%dtotermination reason+fatal_log_line; it is log text only, no machine-readable contract. Theconfig_layer_divergedwarning can now include canonical parameter names for direct-config keys (previously this path crashed instead of warning).-enable_timing=0is unchanged; the enabled path goes from guaranteed crash to running through iRT's self-contained timing engine.Validation
List the commands you ran. Mark checks that are not applicable as N/A.
uv run pytest test/uv run ruff check chipcompiler testuv run ruff format --check chipcompiler testecc --help,ecc --version,ecc version --json(via local release-format bundle build, plus tarball extract smoke)nix run .#cli -- --helpExact commands:
Manual flow smoke (real gcd design, rtl2gds preset, repo venv):
ecc run --set place.random_seed=3001 --from Synth --to place→ success;config/dreamplace_ecc.jsonand the DreamPlace parameter dump containrandom_seed: 3001.ecc run --set route.RT.-enable_timing=1 --from Synth --to route→ success after the STA fix; router runs in timing mode (enable_timinghonored, timing table rendered), route outputs produced.ecc param set place.random_seed 3001+ecc runon existing workspace → success with the by-designparams_ignored_on_existing_runwarning; on a fresh workspace the value reaches the generated DreamPlace config.ecc param set route.RT.-enable_timing 1+ecc runon existing workspace → success; fresh workspace generates"-enable_timing": "1"inconfig/route_ecc.jsonand completes through route.Skipped checks and reason:
uv run pytest test/(integration included): run locally as-m "not integration"; the integration suite runs in CI with a fresh PDK/yosys/Sizer setup. One local non-integration failure is pre-existing and environment-caused:test_pyplacedb_macro_writeback.py::test_macro_writeback_commits_only_frozen_candidatesfails against this machine's stale locally-builtecc_py(older than the submodule's macro-writeback-orientation fix) and fails identically on unmodified main.nix/or packaging input changed.Checklist