feat(cli): add ecc macro manual placement and rename macro_location.tcl - #285
Merged
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.
- rename the macro-placement Tcl handoff to macro_location.tcl (legacy
macro_localtion.tcl files migrate automatically when a workspace opens)
- add the macro.placements parameter (json list of {instance, x, y,
orientation} in microns, instances committed fixed) rendered into
config/macro_location.tcl on workspace creation and every config refresh
- add the ecc macro set/remove/show command group with project and
workspace scopes; workspace scope reuses the parameter transaction
(snapshot + refresh + invalidation from macroPlacement)
- skip DreamPlace in macroPlacement when manual placements are set; the
step keeps its load/save flow and postFloorplan commits the macros from
the generated file
- update config reference, user guide, tutorial, and floorplan-flow docs
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
Manual hard-macro placement via CLI, plus the handoff file rename. The top two commits are the feature; the bottom three are the
yell/fix_configfixes this branch carries (no open PR existed for them).ecc macro set/remove/showcommand group and themacro.placementsparameter (JSON list of{instance, x, y, orientation}in microns, instances committedfixed). Project scope stores it inecc.toml [params.macro]; workspace scope writeshome/params.tomlthrough the existing parameter transaction (snapshot + refresh + invalidation frommacroPlacement).macro.placementsintoconfig/macro_location.tclon workspace creation and on every config refresh; an empty parameter leaves the file untouched so DreamPlace's own handoff survives.macro_localtion.tcl→macro_location.tcl; workspaces still carrying the legacy filename are migrated automatically when opened.macro.placementsis non-empty,macroPlacementkeeps its load/save flow but skips DreamPlace macro placement;postFloorplancommits the macros from the generated file, so the flow chain is unchanged.yell/fix_config: direct-config param overrides no longer crash divergence checks (3653f34), stale STA pre-init dropped from timing-driven routing (9d23a19), Sizer records the native crash signal and first fatal log line (0d282fe).Scope
uv.lock, or release artifacts.Runtime And Packaging Impact
ecc-toolsorecc-dreamplacedependency changedNotes:
ecc macrocommands; the workspace handoff file is renamed with automatic migration of the legacy filename, so existing workspaces keep working.ecc-toolssubmodule already contains the parser/writer for the command-prefixed handoff format (e2751b03b). Prebuiltecc-toolsbinaries older than that commit reject the format, so deployments must buildecc-toolsfrom the current pin.Validation
List the commands you ran. Mark checks that are not applicable as N/A.
uv run pytest test/— 2573 passed, 3 skipped, 1 deselected, 4 xfaileduv run ruff check chipcompiler test— all checks passeduv run ruff format --check chipcompiler test— clean (854d1c1)ecc --help,ecc --version,ecc version --json— N/Anix run .#cli -- --help— N/Aecc macro setfor all 16 instances, thenecc run --from preFloorplan --to postFloorplan: all three steps Success; themacroPlacementsubflow records macro placement in 0s with no DreamPlace artifacts and the generated Tcl untouched; the postFloorplan DEF has all 16 instances+ FIXEDat exactly the CLI-specified micron coordinates (R0 → N) with the configured halos.Skipped checks and reason:
Checklist
Remaining risk: none known in the Python paths; runtime environments must use an
ecc-toolsbuild from the current submodule pin (see the note above).