How does ICC2 know which cells an ECO touched?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
Each changed cell carries the eco_change_status (ICC2) attribute, and its value says what kind of edit touched it. place_eco_cells -eco_changed_cells (ICC2) works on cells whose status is create_cell, change_link, add_buffer, size_cell or add_buffer_on_route. After legalization the status becomes eco_legalized, so the same cells are not picked up again.
Technical Explanation
- Values that mark a changed cell: create_cell, change_link, add_buffer, size_cell and add_buffer_on_route. The ICC2 guide lists the first four, and the command reference for
place_eco_cells(ICC2) adds add_buffer_on_route. - Who sets it:
eco_netlist(ICC2) sets it on the cells it changes, and the command reference says Tcl editing commands set it too. If the netlist was changed some other way, set it yourself withset_attribute(ICC2). - After placement:
place_eco_cells(ICC2), with or without-legalize_only, resets the status of changed cells to eco_legalized. With-no_legalizeit becomes eco_placed, and cells that were not changed keep their status. - Other commands read it too.
report_cell_feasible_space(ICC2) ignores ECO cells unless they are eco_legalized, andplace_freeze_silicon -cells(ICC2) maps only cells with is_fs_eco_add true and one of the changed values. - Why it matters:
-eco_changed_cellslets you place only what the ECO touched, leaving the rest of the placement alone. If a changed cell is missing its status, it is never placed; if an old cell still shows a changed value, it is moved again. - This page is about how ICC2 tracks the change. Comparing an ECO netlist with the golden netlist, and deciding which differences become edits, is covered on the eco-netlist page. The two meet here: every edit that
eco_netlist(ICC2) writes leaves a status value behind, and that value is what later placement steps select on.
What To Check
- Count of cells with each value before
place_eco_cells(ICC2). - That the count matches the number of edits in the change file.
- All changed cells at eco_legalized after placement.
- No unplaced cells left once placement finishes.
Command Checks & Actions
get_attribute [get_cells U1] eco_change_statusShows the ECO status of one cell.
get_cells -filter eco_change_status==add_bufferCollects all buffers added by ECO edits.
set_attribute [get_cells ECO17] eco_change_status create_cellMarks a cell as changed when it was edited outside eco_netlist.
place_eco_cells -eco_changed_cellsPlaces and legalizes only the changed cells.
report_cell_feasible_spaceReports remaining free space; counts only eco_legalized ECO cells as occupied.
Healthy, Suspicious & Hard-stop Results
- Healthy (illustrative): The change file has 57 edits and 57 cells carry changed values; after placement all 57 are eco_legalized.
- Suspicious (illustrative): More cells marked changed than the change file explains, often left over from an earlier round.
- Hard stop: Changed cells with no status, which
-eco_changed_cellswill skip, leaving them unplaced.
Common Mistake
The Trap: Building new cells with a hand-written script that bypasses the normal edit path, then running place_eco_cells -eco_changed_cells (ICC2). Cells whose status was never set are not placed. They sit at the origin or unplaced, and route_eco (ICC2) routes to them or reports opens, which takes an hour to trace back.
What The Interviewer Is Testing
- Knows the values that count as changed.
- Knows how legalization resets the status.
- Checks the attribute when the netlist was changed outside
eco_netlist(ICC2).
Follow-up Question & Model Response
"What happens if you run place_eco_cells -no_legalize and then run it again with -legalize_only?"
Candidate Model Response: The first run places the changed cells and sets their status to eco_placed. The command reference for place_eco_cells (ICC2) says -eco_changed_cells, with or without -legalize_only, selects only cells whose status is create_cell, add_buffer, change_link, size_cell or add_buffer_on_route, so eco_placed cells are not selected. The second step must be -legalize_only -cells with an explicit collection of the cells you placed. Afterwards, check that every one of them ends at eco_legalized.
Practical Example
Tapeout Scenario: An ECO script adds 40 buffers with add_buffer (ICC2) and resizes 17 cells with size_cell (ICC2) (illustrative). After sourcing it, get_cells -filter (ICC2) finds 40 cells at add_buffer and 17 at size_cell, 57 in total, matching the 57 edits. place_eco_cells -eco_changed_cells (ICC2) places them and all 57 move to eco_legalized. A later round adds 6 more buffers, and only those 6 carry a changed value, so only they are placed.
PnR Flow Mentor Guide
Master the Physical Design Implementation Flow
Read the complete 8-chapter PnR Flow Mentor Guide free on the web — library setup through placement, clock tree synthesis, routing, chip finishing, hierarchical implementation, and ECO, all the way to stream-out.

Continue practising