A freeze-silicon ECO needs a cell type with no matching spare. What now?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
By default ICC2 maps an ECO cell only to a spare with the same library cell name, so a type with no matching spare stays unmapped. Find those cells with check_freeze_silicon (ICC2), then let create_freeze_silicon_leq_change_list (ICC2) write a script that replaces each one with a logically equivalent spare or a combination of up to two spares. Review the script, source it, and map again.
Technical Explanation
- The mapping rule is strict. When the tool maps an ECO cell, it looks for a spare cell with the same library cell name; if there is none, the ECO cell remains unmapped. A NAND2 of the right function but a different drive strength name does not count.
check_freeze_silicon(ICC2) is the feasibility report. It lists ECO cells and spare cells per library cell, so you see the unmapped types beforeplace_freeze_silicon(ICC2) fails on them.create_freeze_silicon_leq_change_list -cells $unmapped -output leq.tcl(ICC2) writes a Tcl script of netlist edits. Each ECO cell is replaced by one spare with the same logical function and a different library cell name, or by a combination of up to two spare cells that together give the same function.- The output is a proposal, not a done deal. The ICC2 UG says to view the file, edit it if needed, and then source it. Check that the replacement is timing-safe, because a two-cell version of a gate is slower than the original.
- Programmable spare cells avoid much of this problem. A PSC can be wired to perform different functions, and part of a PSC left unused is backfilled with smaller spares for later ECOs.
- Prevent it upstream. PrimeTime fixing in freeze silicon mode only uses spare cells for new cells, so keep the
-buffer_listfor fixing to the buffer types that exist as spares. - For sizing,
size_cell(ICC2) in freeze silicon mode looks for a compatible spare within five times the unit site height and skips the change if none is found.-max_distance_to_spare_cellwidens that search, at the cost of longer routes.
What To Check
- Unmapped ECO cells and their library cell types in check_freeze_silicon.
- Each LEQ replacement in the generated script, including two-cell combinations.
- Timing of paths through replaced cells after sourcing the script.
- Remaining spare count per type after mapping, for the next ECO.
Command Checks & Actions
check_freeze_siliconIdentifies ECO cells with no matching spare.
create_freeze_silicon_leq_change_list -cells $unmapped -output leq.tclWrites a script replacing each unmapped cell with LEQ spares.
source leq.tclApplies the reviewed replacements.
place_freeze_siliconMaps the replaced cells onto spare cells.
report_timing -pba_mode exhaustiveRe-checks the paths through replaced cells after extraction.
Healthy, Suspicious & Hard-stop Results
- Healthy (illustrative): Three unmapped cells, each replaced by one same-function spare, and timing on those paths still positive after extraction.
- Suspicious (illustrative): An XOR built from two spares on a path with only 12 ps of setup slack left.
- Hard stop: An ECO cell with no single or two-cell equivalent among the spares. The ECO needs a different fix or a base-layer change.
Common Mistake
The Trap: Hand-editing the netlist to swap the missing cell for "something close", such as a different-function cell plus an inverter picked by eye, without running equivalence checking. The mapping passes, but the logic is wrong on one input combination, and the metal fix ships a functional bug that Formality would have caught in minutes.
What The Interviewer Is Testing
- Knowing the default same-name mapping rule.
- Can you use the LEQ flow and describe its one-cell and two-cell outputs?
- Checking timing and equivalence after a replacement, not only mapping.
Follow-up Question & Model Response
"What checks do you run after sourcing the LEQ change list?"
Candidate Model Response: I rerun check_freeze_silicon (ICC2) to confirm every ECO cell now has a feasible spare, then map with place_freeze_silicon (ICC2). After routing and extraction I run PrimeTime on the affected paths in all scenarios, since a two-cell replacement adds a stage. I also run Formality between the pre-ECO reference with the intended change and the post-ECO netlist, because the replacement is a netlist edit and has to be proven equivalent.
Practical Example
Tapeout Scenario: A functional ECO needs 11 new cells (illustrative). check_freeze_silicon (ICC2) shows 8 mappable and 3 unmapped: two AO21 and one XNOR2, with no spare of those names. create_freeze_silicon_leq_change_list (ICC2) maps each AO21 to one spare of the same function under a different name, and the XNOR2 to an XOR2 spare plus an inverter spare. After sourcing and mapping, extraction shows the XNOR2 path at +18 ps setup in the worst scenario, and Formality reports the design equivalent.
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