Skip to content
Ch 08 / 8 Chapter 8: ECO Flow
← Prev
Detailed Design Analysis ECO Flow ICC2 Implementation Mentor Guide

Detailed Design Analysis

ECO Flow in ICC2: A Mentor Guide

What changed, how little can I disturb, and how do I prove I disturbed nothing else. The five ECO flows, spare cells and freeze silicon, the PrimeTime signoff loop, incremental signoff, ECO Fusion, and minimal-disturbance placement, taught the way a senior engineer would explain a repair to a new hire at their desk. The final chapter of the guide.

Teaching project: Nimbus‑8 Stage 8 of 8 — final chapter Zero experience → working engineer
Part 1 — What an ECO is, and which flow you are in

The chip is finished. Then something changes.

This is the last chapter of the guide, and it starts from a different place than the other seven. Nimbus‑8 is routed. It is finished. Chapter 6 signed off its density and its fill. Chapter 7 closed its hierarchy and handed off a checkpoint named nimbus8_top_hier_closed_v1. And then a late setup violation shows up on a u_sens_tile boundary path, or a functional bug is found, or a DRC escape turns up in a re-check. The chip has to change, without going back to floorplan and starting over.

The IC Compiler II User Guide defines an ECO — an engineering change order — as an incremental change to a complete or nearly complete design, used to fix functional, timing, noise and crosstalk violations without re-synthesizing, re-placing and re-routing everything. Read that definition twice, because both halves matter. It is incremental: you touch as little as possible. And it fixes real problems: functional bugs, timing violations, noise, crosstalk. An ECO is not a redesign wearing a smaller name.

The spine of this chapter

Every ECO you will ever run answers three questions, in this order, and this chapter is organized around them exactly:

What changed, how little can I disturb, and how do I prove I disturbed nothing else.
  • What changed — identifying the delta between what you have and what you need. eco_netlist, netlist editing commands, PrimeTime change lists. Parts 2 through 4.
  • How little can I disturb — the whole minimal-impact toolkit: which flow you are in, spare cells, freeze silicon, legalization modes, displacement thresholds. Parts 5 through 9.
  • How do I prove I disturbed nothing else — recording, reporting, reverting, re-timing, and the closure gate. Parts 10 through 12.

A reader who finishes this chapter should be able to answer all three questions about any ECO they are handed. Refer back to this spine as each Part opens.

Why this chapter closes the series

Chapter 7 ended by handing off to ECO Flow by name. That was not an accident. Repairing a chip correctly demands everything the previous seven chapters taught. Placement legality comes from Chapter 4. Clock trees you must not disturb come from Chapter 5. Routing you must minimally reroute comes from Chapter 6. Fill and spare cells come from Chapter 7's chip-finishing. Block boundaries that constrain where an ECO may land come from Chapter 7's hierarchical implementation. This chapter makes those callbacks explicit as they come up.

Which of the five flows are you in?

Before you type a single command, answer one question: what are you still allowed to change? That single question, asked correctly, sorts every ECO into one of five flows, and the flow decides every command you type after this page.

Figure 1 — Which ECO flow am I in? A vertical chain of four yes/no questions -- not taped out, metal only, who found the violation, iterating -- each peeling off one leaf naming a flow and its first command, ending with five leaves total.
Read it: Start at the top question. If the design has not taped out, you are in the generic ECO flow: eco_netlist then place_eco_cells, because you can still add and move cells freely. If it has taped out, the next question is whether only metal may change: if so, you are in the freeze-silicon flow, starting with check_freeze_silicon. If silicon and metal can both change, the next question is who found the violation. PrimeTime finding it during signoff puts you in the signoff ECO flow (fix_eco_drc, fix_eco_timing). ICC2 finding it during its own optimization, with the loop iterating, puts you in incremental signoff ECO (record_signoff_eco_changes). A one-shot or in-tool fix puts you in ECO Fusion (eco_opt).
The five ECO flows, at a glance
FlowWhen you are in itFirst commandTaught in
Generic ECO flowPre-tapeout, cells may still be added and movedeco_netlistPart 2
Freeze silicon ECOTaped out, only metal and via layers may changecheck_freeze_siliconPart 6
Signoff ECOPrimeTime signoff found the violationfix_eco_drcPart 7
Incremental signoff ECOThe signoff loop is iterating and re-running it in full is too slowrecord_signoff_eco_changes -startPart 8
ECO FusionA one-shot or in-tool fix invoking PrimeTime from inside ICC2eco_optPart 9

The worked ECO this chapter uses throughout

One concrete example runs through every part and every figure: a late setup violation on a u_sens_tile boundary path, found in the func_ss_0p72v_125c scenario at −0.008 ns. The fix is one buffer insert (eco_cell_1) plus one cell upsize (u_sens_tile/U88), alongside a small functional change adding a two-input gate on the sensor-enable path. Small enough to draw completely, real enough to teach the whole flow. Every figure that shows an ECO shows this one.

Is the design ready to take an ECO?

Before the first command in Part 2, a real ECO starts with a readiness check. Is the netlist in sync with the layout? Is there spare capacity nearby? Is the freeze-silicon mode set correctly for the flow you chose in Figure 1? Has the change file been reviewed, and is a baseline timing snapshot archived to compare against later? Dashboard 1 is that check, applied to the worked ECO.

Dashboard 1 — ECO readiness

An ECO is cheap to start and expensive to undo badly. This board exists so the decision to commit a change is made on evidence, not on habit.

ECO readiness dashboard — is u_sens_tile ready to take this ECO? (part 1 of 2)
ItemEvidenceSource command / reportThresholdStatusRequired action
Netlist and layout in sync
1. Working netlist matches golden reference0 unexpected diffs outside the intended ECOeco_netlist -write_changes0 unexpected diffsPASS
2. Layout reopens clean from the signoff checkpointnimbus8_sens_tile_finished_v1 reopens with 0 errorscheckpoint reopen0 errors on reopenPASS
3. Baseline timing archived before any editWNS -0.008 ns (func_ss_0p72v_125c), TNS -0.008 ns, archivedreport_timingArchived before the first ECO commandPASS
4. Scenarios loaded match signoff setfunc_ss_0p72v_125c, func_ff_0p88v_m40c both loadedscenario list reviewBoth signoff scenarios presentPASS
ECO readiness dashboard — is u_sens_tile ready to take this ECO? (continued — part 2 of 2)
ItemEvidenceSource command / reportThresholdStatusRequired action
Spare-cell inventory and freeze-silicon mode
5. Spare-cell inventory sufficient for this ECO1 spare buffer-compatible cell within 5 µmspare-cell inventory query≥ 1 compatible spare within the displacement budgetPASS
6. Spare-cell inputs verified tied100% of inventoried spares have non-clock inputs tiednetlist scan100% tiedPASS
7. eco_freeze_silicon_mode set correctly for this flowoff — this ECO is pre-tapeout, silicon may changedesign.eco_freeze_silicon_modeMatches the flow chosen in Figure 1PASS
8. PSC utilisation headroom (if freeze silicon later)62% of PSCs unprogrammed, chip-levelPSC inventoryHeadroom recorded even when not this ECO's flowPASS
9. Spare-cell distribution near the violationLocal spacing 71 µm against a 38 µm block average (Figure 9)local density queryLocal spacing within 1.5x the block averageREVIEWPlacement may need allow_move_other_cells locally if minimum_physical_impact rejects the first choice; watch Dashboard 5 after placement.
Change list reviewed
10. Change file read before sourcingpt_eco.tcl reviewed: 1 add_buffer, 1 size_cellmanual reviewReviewed by a named engineer before sourcePASS
11. Change file signature matches current blockrecord_signoff_eco_changes signature check passesrecord_signoff_eco_changes -start -inputSignature consistentPASS
12. Early data checks clear before the ECO0 BLOCKER, 0 REVIEW outstanding on the base designreport_early_data_checks0 BLOCKER at ECO startPASS

Readiness verdict: 11 PASS, 1 REVIEW, 0 BLOCKER → GO, with one item to close before placement.

Read it: Read gate 9 first — the only REVIEW. The spare-cell distribution near the violation is thinner than the block average, which is exactly the gap that turns a minimum_physical_impact placement into a rejected cell.

Field values are this chapter's illustrative teaching data.

Part 2 — Generic ECO flow

The four-step flow you use before tapeout

The generic ECO flow is the default: use it whenever you can still add cells and move existing ones, which is any time before tapeout. It is four steps, and every other flow in this chapter is a variation built to handle a constraint the generic flow does not have to worry about.

  1. Update the netlist. Identify and apply the logical change — Part 3 covers this in depth.
  2. place_eco_cells. Place and legalize the new or changed cells.
  3. Add filler. Rebuild filler cells around the change so density stays correct.
  4. route_eco. Route the new or modified nets.

That is the whole flow. Everything this chapter adds after Part 2 — freeze silicon, the PrimeTime loop, incremental tracking, ECO Fusion — is this same four-step shape, adapted for one added constraint: silicon frozen, a second tool finding violations, or a loop that must run many times cheaply.

Filler cells and -post_eco

Standard-cell rows are packed with filler cells wherever there is no real logic, so the row is continuous for manufacturing and so density stays inside the window Chapter 6 signed off. An ECO opens a gap in that row to make room for a new cell, which means fillers have to come out before placement and go back in after. Doing that for the whole design every time is wasteful: only the touched cells need new fillers and re-checked DRC.

create_stdcell_fillers -post_eco and remove_stdcell_fillers_with_violation both exist to scope this work down to what changed. The -post_eco option tells create_stdcell_fillers to run its DRC checking only on cells placed by the ECO, not on every filler in the design.

Figure 2 — Filler cells around an ECO Three panels: fillers removed to make room, the ECO cell placed in the opened gap, fillers reinserted, with density before and after in the ledger and a callout of which cells the post-ECO DRC check actually covers.
Read it: Panel 1 shows the gap opened by removing three fillers from the row. Panel 2 shows eco_cell_1 placed into that gap in green. Panel 3 shows the row refilled: two of the three original fillers return, and the third's site is now occupied by the real cell. With -post_eco, only that one real cell gets DRC-checked, not the whole row.
Cost ledger — filler cells around an ECO
Fillers removed to open the gap3
Fillers reinserted2 (1 site now occupied by the ECO cell)
Cells DRC-checked with -post_eco1 (the new cell) vs. all cells without it
Density before / after61.4% / 61.3% M1 (unchanged within rounding)

What route_eco actually touches

route_eco routes only the nets an ECO created or modified — it does not rip up and reroute the block. Drawing that boundary explicitly is worth doing once, so “minimal” is visible instead of assumed.

Figure 3 — route_eco blast radius One small region before and after route_eco: the ECO nets rerouted in solid metal, untouched nets drawn faint, and a dashed boundary marking exactly what the router touched.
Read it: Two untouched nets run faint, top and bottom, across the whole region. A dashed red boundary, labelled “what route_eco touched,” encloses only the small area where the ECO's new segments were drawn in solid M3 and M4. Everything outside that boundary is exactly as it was before the ECO.
Cost ledger — route_eco blast radius
Nets rerouted2
Nets left untouched46 (same region, not shown faint beyond frame)
Vias added2
DRC markers created0

Callback: chip finishing planted this for you

Chapter 6 signed off Nimbus‑8's density with a specific fill strategy: track-based fill on M2 through M7, pattern-based on M8 and M9, floating on M2 through M5, tied to VSS on M6 through M9. Every one of those decisions constrains what an ECO may do to fill near a change. Removing and rebuilding fillers with -post_eco respects that strategy by construction: it calls the same fill-generation logic Chapter 6 used, not a new rule for the ECO case.

The generic ECO flow, worked Verified

The four steps, applied to the worked ECO: one buffer insert on a u_sens_tile boundary net.

  1. 1Update the netlist: add_buffer on the violating net (Part 4 covers the option family in full).
  2. 2Place and legalize the new cell:
    icc2_shell> place_eco_cells -eco_changed_cells \
      -legalize_mode minimum_physical_impact \
      -displacement_threshold 3.0
  3. 3Rebuild filler around the change only:
    icc2_shell> create_stdcell_fillers -lib_cells {FILL1 FILL2 FILL4} \
      -post_eco
  4. 4Route the new and modified nets:
    icc2_shell> route_eco
Part 3 — What changed: identifying the delta

Before you fix anything, know exactly what is different

The first spine question is “what changed.” Answering it well, before you touch anything, is the single best habit this chapter teaches. eco_netlist is the command that answers it formally, by comparing your working design against a golden reference and writing the difference out as a file you can read before you run it.

Comparing against a golden reference

eco_netlist performs a name-based netlist comparison between the working design and a golden input, in one of two ways: -by_verilog_file against a golden Verilog file, or -by_block against a golden block. -golden_lib, -working_block and -working_lib say exactly which design and library each side comes from.

eco_netlist Verified

Comparing the working u_sens_tile against a golden block after the functional gate is added.

  1. 1Compare against the golden block and write the change file:
    icc2_shell> eco_netlist -by_block golden_sens_tile \
      -golden_lib nimbus8_golden_lib \
      -working_block u_sens_tile -working_lib nimbus8_lib \
      -write_changes sens_tile_eco.tcl
  2. 2Read the file before you source it. This is the habit that separates a controlled ECO from an accident: sens_tile_eco.tcl is plain Tcl, and every line in it is a command you would recognize — create_cell, connect_net, change_link. Open it. Confirm it says what you expect.
  3. 3Source it once you have confirmed it: icc2_shell> source sens_tile_eco.tcl

By default, eco_netlist ignores some categories of difference not usually part of a functional ECO: physical-only cells, timing-ECO changes, and power/ground differences. -compare_physical_only_cells and -extract_timing_eco_changes turn that ignoring off — use them when your golden reference might predate a round of changes you want the comparison to see.

Netlist editing commands, for small changes

Not every change needs a golden reference and a formal comparison. For a small, well-understood edit — one gate, one connection — issue the netlist editing commands directly. create_cell instantiates a new cell from a library reference; connect_net and disconnect_net rewire pins; size_cell rebinds a cell to a different library variant (Part 4 covers this one in depth); and change_link swaps what a hierarchical instance points to.

Design-planning ECO scripts

Three commands from the design-planning flow generate ECO scripts for changes that are structural rather than purely logical — moving where a net lives in the hierarchy, or exposing spare capacity as real ports:

Design-planning ECO script generators
CommandWhat it generatesTypical use
write_split_net_ecoA script that moves the branch-out of a multi-fanout net up to the top levelA net's fanout has outgrown its current hierarchical home
write_push_down_ecoA script that moves a tree of standard cells down from the top physical level into the overlapping blocks belowLogic was placed at the top level but logically belongs inside a block
write_spare_ports_ecoA script that creates dummy feedthrough ports on named cells for future useReserving port capacity ahead of an ECO you expect but have not designed yet

write_push_down_eco Verified

Moving a cluster of top-level cells down into the block that overlaps them physically.

  1. 1Generate the push-down scripts, one per block, into a directory:
    icc2_shell> write_push_down_eco [get_cells U0] -dir push_down_eco_scripts
  2. 2Source the top block's script, which calls the others in the correct order:
    icc2_shell> source ./push_down_eco_scripts/nimbus8_top.tcl

What this ECO actually is, inventoried

Once the delta is identified, write it down as a table before you place anything: cells added, removed, resized; buffers inserted; nets touched. Keep functional changes visibly separate from timing changes — Part 8 shows that separation is not optional once incremental signoff tracking is involved.

Dashboard 2 — change inventory

Every number here should trace to one line in the change file. If it does not, the inventory is wrong, not the change file.

Change inventory dashboard — what this ECO actually is
ItemEvidenceSource command / reportThresholdStatusRequired action
Cells added, removed, resized
1. Cells created (new instances)1 — eco_cell_1, a bufferadd_bufferMatches change-file create_cell/add_buffer linesPASS
2. Cells resized1 — u_sens_tile/U88, upsized one drive strengthsize_cellMatches change-file size_cell linesPASS
3. Cells removed0netlist diffMatches change file (0 removals this ECO)PASS
4. Fillers displaced by the ECO3 removed, 2 reinserted (1 site now occupied)create_stdcell_fillers -post_ecoReconciles: removed = reinserted + occupiedPASS
Functional versus timing changes
5. Functional change (spec fix)1 — two-input AND gate added on the sensor-enable pathnetlist edit, logged separatelyTracked apart from timing-only changesPASS
6. Timing-driven changes2 — the buffer insert and the upsizefix_eco_timing -type setupTracked apart from the functional changePASS
Nets touched
7. Nets split1 — the boundary net, split by the buffer insertadd_bufferMatches change filePASS
8. Nets rerouted2 — the two segments of the split netroute_ecoMatches Figure 14's blast-radius boundaryPASS
9. Nets left untouched, same region46 of 48 nets in the local windowroute_eco reportUntouched count matches the reportPASS

Inventory verdict: 2 timing-driven changes, 1 functional change, 3 nets touched, 0 unaccounted → matches the change file exactly.

Read it: Row 5 is the one to notice: the functional change (a two-input gate for a spec fix) is tracked separately from the two timing changes, because Part 8 makes exactly this separation the line that stops incremental-signoff tracking.

Field values are this chapter's illustrative teaching data.

Part 4 — Making the change: resize, buffer, fanout

Three edits cover almost every ECO you will make

Once you know what changed, most ECOs come down to three kinds of edit: resize a cell, insert a buffer, or split an overloaded fanout. Figure 4 shows the worked ECO's buffer insert as real geometry. This Part gives you the three commands behind it, verified option by option.

Figure 4 — Before and after one buffer insert Two panels at identical scale and coordinates: the same nine-site standard-cell row, same tracks. Left: eight named cells and one empty site, the violating net routed direct above it. Right: the same eight named cells in the same sites, plus eco_cell_1 placed in the row in the site that was empty, with a short pin up to the split net.
Read it: Both panels show the same nine-site row (the same eight named cells, in the same sites) and the same M2 track grid. On the left, one site is empty and one net runs direct across the row above it. On the right, eco_cell_1, a buffer, is placed directly in that one free site, with a short pin connecting it up to the net: two shorter segments replace the one long one. ECO cell offset: 0 — zero neighbours displaced.
Cost ledger — before/after one buffer insert
Cells added1 (eco_cell_1, a buffer)
Sites consumed1 (the site empty in both panels)
ECO cell offset0 µm — placed directly in the free site
Neighbours displaced0
Wire length delta+3.4 µm (illustrative)

Resizing: size_cell

size_cell rebinds a leaf cell to a new library cell with a different drive strength, or other properties — the classic upsize-for-setup or downsize-for-power move. The cell being resized must already be in scope, at or below the current instance.

size_cell Verified

Upsizing u_sens_tile/U88, the second half of the worked ECO's timing fix.

  1. 1Rebind to a stronger drive-strength variant:
    icc2_shell> size_cell u_sens_tile/U88 -lib_cell BUFX4_nimbus8_lib
  2. 2Optionally bound how far the tool may search for a spare cell that could realize the resize instead of a fresh placement, or turn that search off entirely: -max_distance_to_spare_cell or -not_spare_cell_aware.

Buffering: add_buffer and add_buffer_on_route

add_buffer adds a buffer cell on the nets connected to specified pins — the simple, pre-route form. add_buffer_on_route does the same thing on nets with real routed geometry, and carries the larger option family, because it has to decide where along the route the buffer lands.

add_buffer_on_route Verified

Splitting the boundary net at a physically sensible point along its real route.

  1. 1Insert on the violating net, letting the tool choose the split point:
    icc2_shell> add_buffer_on_route [get_nets sens_ready_net] \
      -lib_cell BUFX2_nimbus8_lib
  2. 2Constrain the search along the route with -max_distance_to_route, -repeater_distance, -first_distance and -last_distance, and let the tool choose a legal site with -snap_to_sites or an exact one with -location. -max_distance_for_incomplete_route bounds how far the buffer may sit from a route that has not finished detail routing.
  3. 3Keep the new instance and net names predictable with -cell_prefix and -net_prefix — the defaults are eco_cell and eco_net, exactly what Figure 5 shows on real geometry.
  4. 4Choose whether the buffer may land over an existing cell with -respect_blockages, and if so, which cells it may or may not land over with -allow_insertion_over_cell or -dont_allow_insertion_over_cell.

Splitting an overloaded fanout: split_fanout

Some violations are not about one net's routed length but about one driver serving too many loads. split_fanout reduces a driver's fanout by inserting a repeater cell, the standard fix for a max-fanout or max-capacitance violation that a single resize cannot clear.

split_fanout Verified

Reducing an overloaded driver's fanout by inserting one repeater cell.

  1. 1Select the driver, then bound the fanout:
    icc2_shell> split_fanout -driver [get_pins u_sens_tile/U40/Z] \
      -max_fanout 12 -lib_cell BUFX2_nimbus8_lib
  2. 2-driver or -net pick the target (mutually exclusive); -loads (plural) names the exact pins to move onto the new repeater instead of a fanout count, and is itself mutually exclusive with -max_fanout.
  3. 3-hierarchy and -on_route are also mutually exclusive: -hierarchy adds a repeater on the loads crossing into a named hierarchy, -on_route buffers by routing topology instead of logical connectivity.
  4. 4The rest match add_buffer_on_route's naming and placement-legality options: -respect_blockages, -max_distance_for_incomplete_route, -net_prefix, -cell_prefix, plus -same_net_connection_only to keep every moved load on the same original net.

Naming the results: -cell_prefix and -net_prefix

Every command in this Part that creates a cell defaults to a readable naming convention: new cells get the prefix eco_cell, new nets get eco_net, both followed by a running number. A cell an ECO resizes, by contrast, keeps its original instance name — size_cell rebinds a reference, it does not create a new instance.

Figure 5 — The ECO cell naming convention, on real geometry One placed buffer and its net, both labelled with the default eco_cell / eco_net prefixes, next to a size_cell change on an existing instance whose name does not change.
Read it: On the left, eco_cell_1 sits in teal in the row, with its net labelled eco_net_1 above the route leaving it — both new names, both from the default prefixes. To the right, the amber cell is labelled u_sens_tile/U88 (resized): the same instance name it had before the ECO, because size_cell changed what the instance is bound to, not what it is called.
Cost ledger — ECO cell naming convention, on real geometry
New cell prefixeco_cell (default)
New net prefixeco_net (default)
Resized existing cellkeeps its original instance name

Not every ECO is timing or DRC: a crosstalk fix

Some violations are neither a slack number nor a DRC rule — they are noise. A victim net running too close to a switching aggressor can pick up enough coupled delta delay to fail timing that would otherwise pass, and the fix is not a buffer or a resize but a shield.

Figure 6 — A crosstalk / SI-driven ECO Two adjacent M4 nets before and after a shielding ECO: before, a victim net runs bare beside an aggressor; after, a grounded shield wire is added between them, with delta delay before and after in the ledger.
Read it: Both panels show the same two M4 nets, labelled aggressor and victim, on the same track grid. In the before panel, they run adjacent with nothing between them. In the after panel, a grounded VSS shield wire, labelled shield, is inserted directly between them, consuming one track.
Cost ledger — a crosstalk / SI-driven ECO
Delta delay before shield+22 ps (illustrative)
Delta delay after shield+3 ps
Tracks consumed by the shield1
Part 5 — Spare cells: the ECO you plan for before you need it

The ECO toolkit that starts before there is anything to fix

Every command in Parts 2 through 4 assumes there is somewhere for a new cell to go. Spare cells make that true ahead of time, planted by Chapter 6's chip-finishing pass and by floorplan design planning: the same discipline that set density is what plants spare capacity.

Three ways to get spare cells into a design

  • Manual instantiation — place named spare-function instances by hand, the way you would place any other cell, when you know exactly what function you will need later.
  • add_spare_cells — inserts spare cells programmatically, from a named library cell reference and an instance count, or from a raw cell count.
  • Programmable spare cells via create_stdcell_fillers — gate-array-style fillers that are not committed to one function until an ECO programs them.

add_spare_cells Verified

Inserting a batch of buffer-compatible spares across u_sens_tile.

  1. 1Name the batch and reference the library cell:
    icc2_shell> add_spare_cells -cell_name sens_spare \
      -lib_cell [get_lib_cells nimbus8_lib/BUFX2] -num_instances 24
  2. 2Scope where they go with -hier_cell, -boundary or -voltage_areas, and exclude blockage types they should not sit under with -ignore_blockage_types.
  3. 3Choose the distribution: -density_aware_ratio biases spares toward where real cells already are; -random_distribution spreads them uniformly. Set how spare inputs are tied with -input_pin_connect_type tie_low | tie_high | open.

The four criteria that make a cell “spare”

The tool does not treat every idle-looking cell as a spare. A cell is recognized as spare when it meets all four of these:

  1. It is not a physical-only cell — a spare has a real logical function waiting to be used, unlike a filler or tap cell.
  2. All of its inputs, except a clock pin if it has one, are either unconnected or tied to a constant.
  3. Its output is unconnected.
  4. It is a real placed instance, occupying real sites, not a paper placeholder.
Figure 7 — A spare cell, close up One spare cell in its row: inputs tied to the VSS rail, output unconnected, clock pin connected, with the four recognition criteria annotated directly on the geometry.
Read it: spare_cell_014 sits in the row like any other cell. Its two non-clock inputs are tied to VSS with a short metal stub. Its output pin has no wire leaving it at all. Its clock pin, if present, stays connected — a spare cell's function needs a live clock the moment it is mapped, so that connection is never the one left open.
Cost ledger — a spare cell, close up
Recognition criteria met4 of 4
Inputs tied2 of 2, to VSS
Outputunconnected
Leakage cost of leaving it tied0.4 µW (illustrative)

Distributing spares: spread_spare_cells

spread_spare_cells spreads spare cells — typically ones that arrived through a Verilog ECO or manual netlist editing, not yet placed — evenly across a rectilinear region, with the same distribution controls as add_spare_cells: -density_aware_ratio, -random_distribution, -boundary, -voltage_areas, -ignore_blockage_types.

Figure 8 — Spare-cell distribution across the die Two panels of the Nimbus-8 core with spare cells scattered: density-aware distribution on the left, following the existing standard-cell placement, and uniform random distribution on the right, with spare count, mean spacing and coverage ledgered for each.
Read it: Both panels place the same 14 spares. The left panel's density-aware placement clusters toward the denser background shading, where real logic already concentrates — that is where a future ECO is statistically most likely to need one. The right panel's random placement ignores that shading entirely, landing spares in empty regions as readily as busy ones.
Cost ledger — spare-cell distribution across the die
Density-aware: spare count14 (this region, illustrative)
Density-aware: mean spacing38 µm
Random: mean spacing51 µm, higher variance
Coverage inside 50um of any cell clusterdensity-aware 100% / random 71%

Programmable spare cells: gate-array fillers

A fixed-function spare cell can only ever become the one function it was instantiated as. A programmable spare cell (PSC) is different: it is a gate-array-style filler shape that can be programmed, by metal and via connections alone, into any one of several compatible functions at ECO time. The psc_type_id attribute is what pairs a standard cell with the family of PSC shapes that can realize it — when you place a PSC, you are reserving a function family, not one fixed function.

Figure 9 — Programmable spare cell (gate-array filler) A PSC before and after programming, with the psc_type_id pairing shown. Contrast with a fixed-function spare cell's single realisable logic function.
Read it: The left panel shows an unprogrammed PSC, dashed outline, carrying psc_type_id=7. The right panel shows the same physical shape after being programmed into an AND2 gate — a compatible function under the same id, realized entirely by the metal wiring drawn around it, not by any change to the shape itself.
Cost ledger — programmable spare cell (gate-array filler)
Functions one PSC can realiseup to 4, by psc_type_id family
Functions a fixed-function spare can realise1
Extra silicon area per PSC vs. fixed spare~1.15x (illustrative)
Part 6 — Freeze silicon: when only metal may change

The chip has taped out. Silicon is frozen. Metal is not.

Once a design has taped out, the diffusion, poly and contact layers exist in silicon, permanently. A freeze-silicon ECO is what you run when the fix must live entirely in metal and vias — rewiring already-manufactured transistors into a new function, never creating one.

Turning the mode on

design.eco_freeze_silicon_mode is the application option that tells ICC2 it is operating under this constraint. With it set, placement and legalization commands stop assuming they can create new silicon and start assuming every fix has to land on an existing spare.

Checking feasibility before you commit

check_freeze_silicon performs feasibility analysis on ECO-cell-to-spare-cell mapping for the current design, before you place anything. It takes no arguments — it reads the ECO cells and spare cells already present and reports whether a mapping is even possible.

check_freeze_silicon Verified

Confirming mapping feasibility before committing the worked ECO to a freeze-silicon flow.

  1. 1Set the mode: icc2_shell> set_app_options -name design.eco_freeze_silicon_mode -value true
  2. 2Check feasibility with no arguments: icc2_shell> check_freeze_silicon
  3. 3Read the report. A cell that comes back unmappable is a decision point, not an error to work around — see Figure 10.
Figure 10 — Freeze-silicon mapping decision A vertical decision chain: an ECO cell arrives, checks for a same-name spare nearby, then a logically equivalent spare, naming the command at each branch and the unmapped outcome as the final leaf.
Read it: Every ECO cell in a freeze-silicon flow answers two questions in order. Is there a same-name spare nearby? If yes, map_freeze_silicon maps it directly. If no, is there a logically equivalent spare — a different-named cell that computes the same function? If yes, create_freeze_silicon_leq_change_list builds a change list for it. If neither, the cell is unmapped, and the decision becomes an engineering call about a new mask set, not a tool command.

Placing and mapping: place_freeze_silicon

place_freeze_silicon places new ECO cells by swapping out spare cells. Two options let you separate placement from mapping, which is the careful engineer's move: check QoR with cells placed near their targets before committing to which spare each one consumes.

place_freeze_silicon Verified

Trial-placing before committing, using -no_spare_cell_swapping to preview.

  1. 1Trial map, without swapping any spare cell yet:
    icc2_shell> place_freeze_silicon -cells [get_cells eco_cell_1] \
      -no_spare_cell_swapping -write_map_file trial_map.txt
    This moves ECO cells to their targeted spare locations without committing the swap — a preview you can analyze and remap if the result looks wrong.
  2. 2Commit only the mapping decision, once you are satisfied: -map_spare_cells_only.
  3. 3Control how close a mapped cell may sit to a filler with -min_filler_distance, and which PSC filler library cells recover unused white space between mapped cells with -lib_cells_for_filler_recovery.

Manual mapping: map_freeze_silicon

When you already know exactly which spare an ECO cell should become, map_freeze_silicon maps it directly: -eco_cell and -spare_cell name the pair, or -map_file reads a whole mapping from a file. -filler_map_strategy chooses how leftover white space packs once cells are mapped — pack_left, pack_right, pack_top, pack_bottom or closest. -advanced_nodes switches on additional rule checking appropriate to advanced process nodes, and can be paired with -skip_rule_check when that checking is not wanted for a specific call.

map_freeze_silicon Verified

Manually mapping the worked ECO's buffer onto a named spare.

  1. 1Map by name, with an explicit fill strategy:
    icc2_shell> map_freeze_silicon -eco_cell eco_cell_1 \
      -spare_cell u_sens_tile/spare_cell_014 \
      -filler_map_strategy closest

The LEQ path, when no same-name spare exists

When the mapping decision in Figure 10 lands on “logically equivalent spare,” the command is create_freeze_silicon_leq_change_list. It writes a Tcl change list for ECO cells that need a logic-equivalence match rather than an exact same-name spare. The cells it operates on must be leaf cells with is_fs_eco_add true, and an eco_change_status of create_cell, add_buffer, add_buffer_on_route, change_link or size_cell.

create_freeze_silicon_leq_change_list Verified

Building and reading the LEQ change list, the same read-before-you-source discipline as Part 3.

  1. 1Write the change list:
    icc2_shell> create_freeze_silicon_leq_change_list \
      -cells [get_cells eco_cell_1] -output leq_changes.tcl
  2. 2Read leq_changes.tcl before sourcing it, the same as any other ECO change file.
  3. 3Source it once confirmed: icc2_shell> source leq_changes.tcl

Rules for mapping onto PSCs

set_programmable_spare_cell_mapping_rule creates a mapping rule that governs how place_freeze_silicon is allowed to map onto programmable spare cells. -psc_type_id or -compatible select which PSC id families a rule applies to; further options control power-rail overlap behavior (-dont_overlap_pg_stripe_layer, -partial_overlap_pg_stripe_layer) and multi-height PSC handling (-multi_height_split, -multi_height_merge).

Figure 11 — Freeze silicon: ECO cell mapped onto a spare Before and after at identical coordinates. Silicon layers identical in both panels, called out explicitly. Only the metal and via layers above change: the spare's tie-off is removed and it is rewired into the ECO cell's function.
Read it: Both panels show the same physical cell, labelled SILICON (unchanged) in grey in both. Before, its input is tied to VSS with a short metal stub — no function. After, that tie is removed and metal is rewired above the same cell into a real net connection. The cell outline itself never moves or changes between panels; only the two upper layers do.
Cost ledger — freeze silicon: ECO cell mapped onto a spare
Silicon (diffusion/poly) layers changed0
Metal/via layers changedM2, M3 only
Mask layers touched2 of the full mask set
Mask cost vs. a new tapeout~1 mask set vs. all layers
Dashboard 3 — freeze-silicon mapping board

This board would govern if the same ECO arrived after tapeout, when only metal may change. It is illustrative for that scenario, built on the same u_sens_tile numbers.

Freeze-silicon mapping board — ECO cells against spare capacity
ItemEvidenceSource command / reportThresholdStatusRequired action
Mapping outcome
1. ECO cells requiring mapping1 (the buffer insert)check_freeze_siliconPASS
2. Mapped, same-name spare1map_freeze_siliconPASS
3. Mapped, LEQ change list0create_freeze_silicon_leq_change_listPASS
4. Unmapped, requiring review0engineering review0 for this ECO to avoid a new mask setPASS
PSC utilisation and mask layers
5. PSC utilisation, chip-level38% programmed, 62% headroomPSC inventory≤ 70% programmedPASS
6. Mask layers touched2 (M2, M3 — metal and via only)freeze-silicon change summary0 diffusion/poly layers touchedPASS

Mapping verdict, freeze-silicon scenario: 1 of 1 ECO cells mapped same-name → 0 new mask layers required.

Read it: Row 1 is the whole story: because a same-name spare exists within the displacement budget, this ECO never needs the LEQ path (Figure 5's second branch) or an unmapped review (the third).

Field values are this chapter's illustrative teaching data; this board describes a freeze-silicon variant of the worked ECO, not the pre-tapeout flow used in Parts 2-5.

Part 7 — Signoff ECO: the PrimeTime loop

This is a two-tool chapter. Here is where the two tools hand off.

Signoff timing on Nimbus‑8 runs in PrimeTime, not ICC2. When PrimeTime's signoff analysis finds a violation — the worked ECO's −0.008 ns setup path on func_ss_0p72v_125c — the fix has to happen in PrimeTime too, because that is where the timing model lives. But the layout lives in ICC2. This Part is the loop that keeps both tools' pictures of the design true at once.

Shell discipline for this Part. Every command block below is marked with the shell it actually runs in. pt_shell> means PrimeTime. icc2_shell> means ICC2. Do not run a fix_eco_* command at an icc2_shell> prompt — it does not exist there.

Figure 12 — The two-tool loop ICC2 and PrimeTime as two columns with StarRC as a third participant between them; arrows labelled with the file that travels on each: the change-list Tcl file from PrimeTime to ICC2, and the updated netlist plus parasitics back from ICC2 through StarRC to PrimeTime.
Read it: PrimeTime's column runs fix_eco_drc, fix_eco_timing, write_changes, and sends a change-list file, pt_eco.tcl, to ICC2. ICC2 runs place_eco_cells, route_eco, create_stdcell_fillers, and its updated netlist and placement go through StarRC for re-extraction, producing updated parasitics that flow back to PrimeTime. Neither tool ever reads the other's internal database directly — every arrow is a real file.

The three PrimeTime fixing commands

The three core commands, all PrimeTime, all mandatory reading before you run your first signoff ECO:

fix_eco_drc PrimeTime

Fixing electrical-rule and noise violations, without regard to timing by default.

  1. 1Run at a pt_shell> prompt: pt_shell> fix_eco_drc
  2. 2It fixes max_transition, max_capacitance, max_fanout, static-noise, SI-bottleneck delta-delay and cell-electromigration violations by cell sizing and buffer or inverter-pair insertion.
  3. 3Crosstalk delta-delay fixing needs an explicit threshold, because there is no natural “delta-delay slack” to target automatically: pt_shell> fix_eco_drc -type delta_delay -delta_delay_threshold 0.02

fix_eco_timing PrimeTime

Fixing the worked ECO's setup violation. The -type option is mandatory — there is no combined default.

  1. 1Fix setup, primarily by sizing (buffers are not inserted by default here, since more data-path delay is exactly what you do not want on a setup fix):
    pt_shell> fix_eco_timing -type setup
  2. 2Fix hold, by sizing and by inserting buffers or load cells (more delay is exactly what a hold fix needs):
    pt_shell> fix_eco_timing -type hold
  3. 3For a very small hold violation, prefer a dedicated load-capacitance cell over a buffer, using -load_cell_list — see the sidebar below.

fix_eco_power PrimeTime

Recovering power and area on paths with slack to spare, without introducing new violations.

  1. 1Run with the default selection method, minimize area: pt_shell> fix_eco_power
  2. 2Downsizes on positive-setup-slack paths and removes buffers on positive-hold-slack paths — it spends margin the design already has, it does not create new margin.

Exporting the fix: write_changes

write_changes exports whatever fix_eco_drc, fix_eco_timing and fix_eco_power did as a Tcl change list, ready for ICC2 to source. pt_shell> write_changes -output pt_eco.tcl is the file Figure 12 shows crossing from PrimeTime to ICC2.

Logic-only versus physically aware

PrimeTime's ECO fixing can run in two modes. Logic-only works from the netlist and parasitics alone, with no placement awareness. Physically aware mode additionally reads real placement data, so fixes land only where physical room genuinely exists, and the change list records exact coordinates for fast, predictable implementation. Physically aware mode needs set_eco_options pointed at the design's physical data, and offers three placement strategies through -physical_mode:

-physical_mode strategies
ValueBehaviorWhen to choose it
occupied_siteAggressive — may place or resize over existing neighbor cells, moving them laterEarly-stage, high-utilization ECO where room is scarce
open_siteConservative — places only where room already exists, avoids moving existing cellsLate-stage, low-utilization ECO where minimal disturbance matters most
freeze_siliconPlaces changes only onto pre-placed programmable spare cellsPost-tapeout, when silicon may not change — the Part 6 flow

A preview before committing: estimate_eco

estimate_eco gives a fast, approximate preview of a proposed size or buffer change's timing effect, before you pay for a full incremental update and a real report_timing re-evaluation — not exact, but fast enough to screen candidates before choosing one.

The fixing order, and why it is that order

Power recovery, then DRC and noise, then setup, then hold, then a final leakage-only power recovery — not arbitrary, but following directly from what each step is allowed to break.

Figure 13 — Fix priority order Five steps in a flowchart: power recovery, DRC and noise fixing, setup fixing, hold fixing, final leakage recovery, with two constraint labels on the arrows: DRC fixing can degrade timing; setup and hold fixing never degrade DRC.
Read it: Five boxes, top to bottom, connected by arrows. The label beside the second-to-third arrow reads “DRC fixing can degrade timing” in red — a warning that DRC fixes are allowed to cost you some setup or hold margin. The label beside the third box reads “setup/hold never degrade DRC” in green — a guarantee that once DRC is clean, timing fixes will not reopen it.

The ICC2 side of the handoff

Once the change list arrives, ICC2's job is to source it and then place, fill and route exactly as the generic flow does, with one addition: legalization is explicitly told to minimize disturbance.

Sourcing a PrimeTime change list Verified

Applying pt_eco.tcl to the ICC2 design.

  1. 1Source the change list: icc2_shell> source pt_eco.tcl
  2. 2Legalize the changed cells, minimally:
    icc2_shell> place_eco_cells -legalize_mode minimum_physical_impact \
      -eco_changed_cells -legalize_only -displacement_threshold 10
  3. 3Rebuild filler and reroute, exactly as in Part 2: create_stdcell_fillers -post_eco, then route_eco.
Dashboard 4 — signoff ECO loop board

A single closing number hides whether the loop converged quickly or barely made it. This board keeps every iteration on the page.

Signoff ECO loop board — convergence, iteration by iteration
ItemEvidenceSource command / reportThresholdStatusRequired action
Iteration 1 (fix_eco_timing -type setup, then place/route)
1. WNS, func_ss_0p72v_125c, before fix-0.008 nsreport_timingPASS
2. WNS, func_ss_0p72v_125c, after fix + place/route+0.004 nsreport_timingWNS ≥ 0PASS
3. TNS, func_ss_0p72v_125c0 nsreport_qorTNS = 0PASS
4. DRC violations, this iteration0fix_eco_drc (not invoked, none present)0PASS
Iteration 2 (confirmation pass after re-extraction)
5. WNS, func_ss_0p72v_125c+0.004 ns (unchanged)report_timingWNS ≥ 0, stable across iterationsPASS
6. WNS, func_ff_0p88v_m40c+0.017 ns (was +0.019 ns pre-ECO, the expected small hold shift)report_timingWNS ≥ 0PASS
7. Power delta+0.6 µW dynamic (1 added buffer, illustrative)check_pt_qor -type power≤ 5 µW for a single-buffer ECOPASS

Loop verdict: converged in 2 iterations, both scenarios clean → signoff ECO loop closed.

Read it: Compare iteration 1 to iteration 2 on row 2: WNS moves from -0.008 ns to +0.004 ns in one pass, and DRC stays at 0 throughout, which is the fix-priority order (Figure 4) working as designed — DRC was never touched because it was never violated.

Field values are this chapter's illustrative teaching data.

Part 8 — Incremental signoff ECO: making the loop cheap

The loop from Part 7 works. It does not always work cheaply enough.

A signoff ECO list is rarely one violation; it is often dozens, and running the full Part 7 loop — full extraction, full timing update — for each one is a schedule problem on a design Nimbus‑8's size. Incremental signoff ECO is the same loop, scoped to only what changed each time.

Figure 14 — The incremental loop, against the full loop Two identical-scale loop diagrams. Left: full loop, every stage shaded to show full re-extraction and re-timing. Right: incremental loop, only the changed portion shaded, the rest greyed as unchanged and skipped.
Read it: Both loops share the same four stages: change, extract, time, fix. The full loop, left, shades every stage red — each one runs in full, on the whole design, every iteration. The incremental loop, right, shades only the “change” stage; the rest run scoped to the delta, which is why they are drawn in the lighter, unshaded tone.

Recording, with a signature check: record_signoff_eco_changes

record_signoff_eco_changes records ECO changes for the incremental signoff flow across three calls: -start, an optional -init, and -stop.

record_signoff_eco_changes Verified

Recording the worked ECO's changes for incremental extraction.

  1. 1Start recording, checking the PrimeTime ECO Tcl file's signature against the current block before sourcing it:
    icc2_shell> record_signoff_eco_changes -start -input pt_eco.tcl
    If the signatures are inconsistent, or either side has no signature at all, the check fails and the command errors out — on success it automatically sources the file for you.
  2. 2Continue working — place, route, further PrimeTime timing ECO passes — while recording stays active.
  3. 3Stop recording and write the incremental design data, optionally in DEF form and compressed: icc2_shell> record_signoff_eco_changes -stop -def -compress

Incremental extraction and incremental timing

Once record_signoff_eco_changes -stop has written the incremental design data, StarRC extracts only the changed portion of the design instead of the whole block, and PrimeTime updates timing incrementally against that partial extraction. A full-design extraction and analysis is reserved for the final signoff pass, not repeated on every intermediate iteration.

Part 9 — ECO Fusion: PrimeTime inside ICC2

One command, both tools, no manual handoff

eco_opt is an ICC2 command that invokes PrimeTime timing and PrimeTime ECO under the hood, brings the changes back, and runs incremental place and route — the whole Part 7 loop, in one call. It is worth learning the manual loop first, in Parts 7 and 8, precisely so you can tell whether eco_opt did the right thing.

Setting up the PrimeTime connection: set_pt_options

Before eco_opt can invoke PrimeTime, ICC2 needs to know where PrimeTime lives and how to configure the session it starts. set_pt_options carries that configuration.

set_pt_options Verified

Pointing ECO Fusion at the PrimeTime executable and a pre-link setup script.

  1. 1Set the executable path:
    icc2_shell> set_pt_options -pt_exec /tools/synopsys/primetime/bin/pt_shell
  2. 2Add host distribution for parallel processing with -host_option, and per-scenario constraint or script overrides with -scenario_scripts / -scenario_constraints.
  3. 3Run setup before and after PrimeTime links the design with -pre_link_script and -post_link_script, and let PrimeTime pick up its own local configuration from .synopsys_pt.setup in the working directory, exactly as it would in a standalone PrimeTime session.

StarRC inside the fusion flow

Extraction mode for the fusion flow is controlled by the extract.starrc_mode application option, defaulting to fusion_adv, with in-design and none as alternatives. set_starrc_options -config loads and validates a configuration file for running StarRC signoff extraction inside the PT ECO Fusion flow. The file names the StarXtract executable location, a corner-to-nxtgrd mapping file, a layer mapping file and a command file. -validate true checks that setup is correct before it is used.

The command itself: eco_opt

eco_opt optimizes the current routed design with PrimeTime timing and PrimeTime ECO. Run with no options, it defaults to fixing {setup hold drc total_power buffer_removal} — the full priority order from Part 7, in one call.

eco_opt Verified

Running the default fix set, then a preview-only run, on the worked ECO's block.

  1. 1Run with the default fixing types:
    icc2_shell> eco_opt -types {setup hold}
    icc2_shell> check_pt_qor
  2. 2Choose analysis effort with -pba_mode none | path | exhaustive, the same graph-based-versus-path-based tradeoff covered in the PrimeTime User Guide.
  3. 3Choose the physical strategy with -physical_mode open_site | occupied_site — note that eco_opt's own list does not include freeze_silicon the way fix_eco_timing's does; run a freeze-silicon ECO through the Part 6/7 manual path, not through eco_opt.
  4. 4Preview without committing: icc2_shell> eco_opt -types setup -write_change_file_only writes the PrimeTime ECO changes to a file instead of sourcing them — useful for review, but be aware the design status in ICC2 and in PrimeTime diverge until you do source it.
  5. 5Supply a fully custom PrimeTime script instead of the built-in fix types with -eco_script, which ignores -types entirely when given.

Checking the result: check_pt_qor

check_pt_qor checks PrimeTime QoR — timing and power — against the current state. -type scopes the check to global_timing, summary, max_delay, min_delay, max_transition, max_capacitance, power or noise; -reset clears a prior baseline, and -report_script runs a custom reporting script.

The convergence warning: matching postroute settings

ECO Fusion's convenience depends on ICC2's postroute timing settings genuinely matching PrimeTime's. If they diverge, ECO Fusion will converge on a result that looks clean inside the fusion flow and disagrees with a standalone PrimeTime signoff run — which defeats the entire purpose of running signoff in PrimeTime in the first place.

check_consistency_settings Verified

Confirming ICC2's postroute settings agree with PrimeTime before trusting ECO Fusion's convergence.

  1. 1Compare against PrimeTime: icc2_shell> check_consistency_settings -tool pt
  2. 2Valid -tool values are pt, icc, icc2, pp / primepower, starrc and fusion_extraction — this command compares settings between ICC2 and any of PrimeTime, StarRC, PrimePower or IC Compiler, and also between Fusion extraction and StarRC in-design extraction.
  3. 3Generate a correction script instead of applying changes silently: -script fix_consistency.tcl, and review it before running -apply.

ECO Fusion power integrity

ECO Fusion extends past timing and DRC into voltage-drop-aware ECOs. rail.database is the application option pointing at a RedHawk-generated rail analysis database. analyze_rail -voltage_drop dynamic_vcd | dynamic_vectorless runs the drop analysis, and eco_opt -type power_integrity fixes what it finds — a fixing type that cannot be combined with the ordinary setup/hold/DRC types in the same call.

Part 10 — How little can I disturb: ECO placement

The heart of the chapter

place_eco_cells derives each ECO cell's placement from connectivity and delay, then legalizes it to the closest unoccupied site, leaving existing cells untouched by default. Every option this Part covers is a way of relaxing or tightening that default, and every one is a real trade between disturbing more and failing to place at all.

Choosing which cells to place

Three mutually exclusive ways to select the target cells: -cells names a specific collection; -unplaced_cells takes every cell with no location yet; -eco_changed_cells takes every cell whose eco_change_status attribute is create_cell, add_buffer, change_link, size_cell or add_buffer_on_route. That third option is exactly the set of edits Parts 3 and 4 taught you to make.

The three legalize modes, as a spectrum of disturbance

-legalize_mode takes one of three values, and the TCR's own description of each is worth reading verbatim, because it corrects a natural assumption: the default is not a fourth mode sitting alongside the other three. It is one of the three, named free_site_only.

The three legalize modes
ModeBehaviorNotes
free_site_only (default)Legalizes ECO cells on free sites only, without moving any other existing cellCombine with -displacement_threshold to reject cells whose displacement would be too large rather than force a placement
minimum_physical_impactTries free_site_only first; for any cell exceeding -displacement_threshold, falls back to moving existing cells for just that cellRequires -legalize_only; the practical middle ground for most signoff ECOs
allow_move_other_cellsLegalizes every ECO cell on its nearest legal location, moving whatever existing cells are in the wayCannot be combined with -displacement_threshold — there is no threshold to reject against, because moving cells is always allowed
Figure 15 — The three legalize modes, same ECO cell Three panels, one coordinate frame. An ECO cell needs a site. Panel A free_site_only: no free site inside the threshold, cell rejected. Panel B minimum_physical_impact: free site found further, cell placed, nothing moved. Panel C allow_move_other_cells: existing cells shifted, displaced neighbours tinted distinctly.
Read it: Panel A shows the ECO cell in a dashed red outline — rejected, because no free site exists inside the displacement threshold. Panel B shows the same cell placed in teal on a free site slightly further out, with every other cell in the row unmoved. Panel C shows the same cell placed at its ideal location, and one neighbor pushed aside, tinted amber — the displaced neighbor is the lesson of this panel, not the ECO cell itself.
Cost ledger — the three legalize modes, same ECO cell
A: default + threshold0 placed, 1 rejected (epl_legalizer_rejected_cells)
B: minimum_physical_impact1 placed, ECO cell offset 2.1 µm, 0 neighbours displaced
C: allow_move_other_cells1 placed, 1 neighbour displaced 0.6 µm

Displacement thresholds, drawn as bands

-displacement_threshold sets the distance, in microns, beyond which the command will not legalize a cell — it keeps the cell's pre-legalization location instead and reports the rejected cell count. -max_displacement_threshold must be paired with it, and must be greater than or equal to it: it builds a collection, epl_max_displacement_cells, of ECO cells whose displacement exceeds even that outer band. That collection is a subset of the broader epl_legalizer_rejected_cells collection every rejected cell lands in.

Figure 16 — Displacement threshold, drawn One ECO cell's ideal location marked as a point, two concentric distance bands at the threshold and the max threshold, and the actual legal site the cell lands on, with dimension arrows giving real values.
Read it: The teal dot at centre is the ECO cell's ideal location. The amber band marks -displacement_threshold; the red band marks -max_displacement_threshold. The green dot is the actual legal site the tool found, dimensioned against the ideal location. Because that dot falls inside the amber band, the cell is placed, not rejected. A cell landing outside the red band would be added to epl_max_displacement_cells — not just rejected, but flagged as disruptive enough to reconsider the change itself.
Cost ledger — displacement threshold, drawn
ECO cell offset (ideal location to actual site)2.1 µm
-displacement_threshold3.0 µm (this ECO)
-max_displacement_threshold8.0 µm (this ECO)
Resultinside threshold — placed, not rejected

Finding room before you need it: report_cell_feasible_space

report_cell_feasible_space reports feasible site spaces, scoped by -voltage_areas or -boundary, and can ignore specific filler references with -ignore_filler_references. Run it before committing to a change, to know whether the local neighborhood even has room, rather than discovering the answer from a rejected-cell report after the fact.

Shaping the coarse placement: net weight and virtual connections

Before legalization, place_eco_cells does a coarse, connectivity-based placement that decides roughly where each ECO cell should land. Three mechanisms let you shape that coarse placement:

  • -fixed_connection_net_weight — weights nets connected to a fixed point (an I/O pad or macro) more heavily, so the coarse placement pulls the ECO cell closer to that fixed point.
  • -honor_user_net_weight, paired with set_eco_placement_net_weight -nets ... -weight ... (and inspected with report_eco_placement_net_weight) — lets you set arbitrary per-net weights yourself before placement runs.
  • -use_virtual_connection, paired with create_virtual_connection -name ... -pins ... — lets you define connections that do not exist in the real netlist, purely to bias the coarse placement, for cases where the real connectivity does not reflect the physical proximity you actually want.

All three support -channel_aware coarse placement, which additionally accounts for routing channels when deciding where an ECO cell should land.

place_eco_cells, the worked ECO's placement Verified

Legalizing the buffer insert with the middle-ground mode and a tolerance level.

  1. 1Place and legalize with the minimal-disturbance mode:
    icc2_shell> place_eco_cells -eco_changed_cells \
      -legalize_mode minimum_physical_impact -legalize_only \
      -displacement_threshold 3.0 -max_displacement_threshold 8.0 \
      -displacement_tolerance_level low
  2. 2-displacement_tolerance_level low | high is usable only with -legalize_mode minimum_physical_impact. low is the default: prefer minimum displacement of the ECO cell itself, tolerating more movement of existing cells to get it. high reverses the preference: tolerate more ECO-cell displacement to keep existing cells still. Setting this option runs minimum_physical_impact with the application option eco.placement.optimized_legalization set to true.
  3. 3Bound how far the ripple of moved cells may extend with -moveable_distance, usable only with minimum_physical_impact or allow_move_other_cells: only cells within this distance of an unlegalized ECO cell become movable at all.

Two more options round out the toolkit. -remove_filler_references tells legalization it may ignore and overlap unfixed filler cells of the named references, opening room without treating filler as an obstacle. And set_eco_placement_net_weight -reset clears any user net weights left over from a previous ECO, so they do not silently bias the next one.

Part 11 — How do I prove I disturbed nothing else

The third spine question, answered with evidence

Parts 1 through 10 taught you how to make a minimal change. This Part is about proving, in numbers, that it stayed minimal. The commands here answer the chapter's third and final spine question directly.

Check before you place, not after: report_eco_physical_changes

report_eco_physical_changes reports the cell displacements and individual net-length changes resulting from size_cell, add_buffer and add_buffer_on_route. Run it before placement, on the change list you are about to source, not after placement has already happened. That ordering is deliberate: a report run after the fact can only tell you what already happened, while a report run before tells you what is about to.

report_eco_physical_changes Verified

Screening the change list for large displacement before committing to placement.

  1. 1Run before placement, filtered to changes above a minimum displacement worth reviewing:
    icc2_shell> report_eco_physical_changes -min_displacement 2.0
  2. 2Scope to specific cells with -cells, or by net-length ratio with -min_net_length_ratio, to find changes that will make a net disproportionately longer, not just displace a cell far.
  3. 3Ignore filler references that are not real obstacles with -ignore_filler_references, and group nearby ECO cells into clusters for review with -min_cluster_cell_distance and -min_cell_number_in_cluster.
Figure 17 — report_eco_physical_changes as a displacement histogram A bar chart of ECO cell count against displacement bucket, with the displacement_threshold and max_displacement_threshold marked as vertical lines, and the two buckets beyond max threshold shaded red.
Read it: Six buckets, 0-1µm through >10µm, bar height by cell count. The amber dashed line marks -displacement_threshold; the red dashed line marks -max_displacement_threshold. Every bar left of the amber line is a normal, expected placement. The two bars right of the red line, shaded red, are the ECO changes worth rejecting outright — not placing further out, rejecting.
Cost ledger — report_eco_physical_changes as a displacement histogram
Cells screened34
Inside displacement_threshold (0-2µm)23 cells
Between the two thresholds (2-6µm)8 cells
Beyond max_displacement_threshold (>6µm)3 cells -- rejected, not placed

Backing out a nonoptimal change: revert_eco_changes

revert_eco_changes -cells reverts ECO changes made by size_cell, add_buffer and add_buffer_on_route on the specified cells. Once report_eco_physical_changes or the displacement report from place_eco_cells itself flags a change as too costly, this is how you take it back cleanly, rather than hand-editing the netlist to undo it.

revert_eco_changes Verified

Backing out a buffer insert flagged by the displacement histogram as beyond the max threshold.

  1. 1Revert the flagged cells: icc2_shell> revert_eco_changes -cells [get_cells eco_cell_7]
  2. 2Re-derive the fix — a different buffer location, a load cell instead of a buffer, or a different legalize mode — and re-run report_eco_physical_changes before placing again.

Keeping supply connections current: eco_update_supply_net

A buffer inserted by a timing ECO needs a real power and ground connection, and eco_update_supply_net is what keeps that connection current as ECO buffer trees grow. It covers cells added by add_buffer, add_eco_repeater, split_fanout and add_buffer_on_route — the same family of commands Part 4 taught. Left unspecified, -cells defaults to updating every cell any timing ECO command has added; specified, it updates just the named cells and the “ECO buffer tree” connected to them — a group of connected timing-ECO cells, bounded by any cell of a different type.

Recording exact layout changes: record_layout_editing

record_layout_editing records changes to the layout for a restricted set of objects and writes them to a Tcl script file. It is specifically documented as a command for final tapeout DRC fixing, not general ECO placement — which is why it belongs in this Part's evidence toolkit rather than earlier ones.

record_layout_editing Verified

The parallel-editing workflow: record a bounded shape edit and hand the result to a reviewer.

  1. 1Start recording: icc2_shell> record_layout_editing -start
  2. 2Make the edit — for instance, a manual shape fix for a final-tapeout DRC violation: icc2_shell> remove_shapes RECT_32_0
  3. 3Stop and write the changes: icc2_shell> record_layout_editing -stop -output change.tcl

The worked ECO, followed end to end

Every number this Part has introduced — identified, placed, cell offset, routed, slack — is a column in the same status strip, tracked across one region through the whole lifecycle of the worked ECO from Part 1. Five panels, same coordinate frame, same u_sens_tile boundary and the same SRAM0 macro in every one, so the only thing that changes panel to panel is the thing the caption says changed. Read the five status strips left to right and you are reading the chapter's whole spine acted out on one net.

Figure 18A — the worked ECO, panel 1 of 5: the violation Region at the u_sens_tile boundary, path highlighted red, slack shown at -0.008 ns. Status strip: change none, placed --, cell offset --, routed --, slack -0.008 ns.
Read it: func_ss_0p72v_125c reports a late setup path at −0.008 ns, outlined in red. Nothing has been touched yet — every status-strip column reads a dash except slack.
Cost ledger — 18A: the violation
Scenariofunc_ss_0p72v_125c
Slack-0.008 ns
Change / placed / cell offset / routed- / - / - / -
Figure 18B — the worked ECO, panel 2 of 5: change identified Same region with the change file listed beside it: add_buffer, size_cell. Status strip: change identified, placed no, cell offset --, routed no, slack -0.008 ns (unchanged, not yet applied).
Read it: PrimeTime's change file, pt_eco.tcl, names exactly two edits — add_buffer and size_cell — identified, and read, before either is applied. Slack is unchanged.
Cost ledger — 18B: change identified
Change filept_eco.tcl: add_buffer, size_cell
Placed / cell offset / routedno / - / no
Figure 18C — the worked ECO, panel 3 of 5: cells placed Buffer cell placed in the row, its offset from the ideal location marked with a dimension arrow. Status strip: change identified, placed yes, cell offset 1.8 um, routed no, slack -0.008 ns (still pre-route).
Read it: place_eco_cells -legalize_mode minimum_physical_impact finds a free site 1.8 µm away and legalizes the buffer there, dimensioned on the drawing. Still pre-route; slack unchanged.
Cost ledger — 18C: cells placed
Legalize modeminimum_physical_impact
ECO cell offset1.8 µm
Neighbours displaced0
Figure 18D — the worked ECO, panel 4 of 5: rerouted The net split and rerouted through the placed buffer. Status strip: change identified, placed yes, cell offset 1.8 um, routed yes, slack pending re-time.
Read it: route_eco redraws exactly the two new segments, in M3 and M4, that the buffer split the original net into. Nothing else on the row moves. Slack is pending re-time.
Cost ledger — 18D: rerouted
Nets rerouted1, into 2 segments
Vias added1
Figure 18E — the worked ECO, panel 5 of 5: re-timed and closed Same region, net highlighted green with the new slack value. Status strip: change identified, placed yes, cell offset 1.8 um, routed yes, slack +0.004 ns.
Read it: StarRC re-extracts, PrimeTime re-times: the path closes at +0.004 ns, the net now highlighted green. Every status-strip column reads a resolved value.
Cost ledger — 18E: re-timed and closed
Final slack+0.004 ns, func_ss_0p72v_125c
Total ECO cell offset1.8 µm (1 cell)
Neighbours displaced0

The evidence set: what a clean ECO looks like in numbers

Bring every number this Part produces together, and a clean ECO has a specific shape: displacement inside the threshold band, zero rejected cells, supply nets current on every new buffer, and a layout-editing record that lets a later engineer reconstruct exactly what happened. Dashboard 5, the blast radius board, is this Part's numbers assembled into one table.

Dashboard 5 — blast radius board

This is the board that answers the chapter's second spine question directly: how little did this ECO disturb?

Blast radius board — how little this ECO actually disturbed
ItemEvidenceSource command / reportThresholdStatusRequired action
Displacement
1. ECO cells placed off their ideal location1 (eco_cell_1's legalized site vs. its ideal location)report_eco_physical_changes≤ 5 cells for a single-buffer ECOPASS
2. Max ECO cell offset1.8 µmreport_eco_physical_changes -min_displacement≤ 8.0 µm (max_displacement_threshold)PASS
2b. Neighbours displaced0 (minimum_physical_impact found a free site; no existing cell was pushed aside)report_eco_physical_changes0 under minimum_physical_impact / free_site_onlyPASS
3. Cells rejected by legalization0 (epl_legalizer_rejected_cells empty)place_eco_cells -legalize_mode minimum_physical_impact0 rejected on the first placement attemptPASS
Fill and density
4. Fillers removed to open room3create_stdcell_fillers -post_ecoReinserted count + occupied count reconcilesPASS
5. Fillers reinserted2create_stdcell_fillers -post_ecoPASS
6. Density delta, local windowM1 61.4% → 61.3% (within rounding of Chapter 6's finishing exit value)density window report≤ 0.5 point delta, local windowPASS
Routing and DRC
7. DRC markers created by the ECO0route_eco0 new markersPASS

Blast-radius verdict: 8 of 8 rows inside budget → this ECO is minimal by every measure recorded here.

Read it: Row 2, max ECO cell offset, is the number to defend in review: 1.8 µm against an 8.0 µm max_displacement_threshold — that is how far eco_cell_1 itself landed from its ideal location, not how many other cells moved. Row 2b makes the second number explicit: 0 existing cells were pushed aside to make room for it. Row 6, density delta, shows chip-finishing's fill discipline survived the ECO untouched, which is the callback Part 5 promised.

Field values are this chapter's illustrative teaching data.

Part 12 — Stage exit: what leaves this chapter, and the guide

The closure gate for an ECO, and for the series

This Part closes two things at once: the worked ECO, and the eight-chapter guide it was chosen to demonstrate. Both close against the same gate, because an ECO's closure criteria are, in miniature, the same criteria the whole guide has been building toward since Chapter 1.

The closure gate for an ECO

  • Timing re-verified on both scenarios. Not just the scenario that found the violation — func_ss_0p72v_125c and func_ff_0p88v_m40c both, because a setup fix can shift hold, as Part 7's small-hold-violation lesson already warned.
  • DRC clean. The fixing order in Part 7 guarantees setup and hold fixes cannot reopen DRC — confirm that guarantee held, do not just assume it.
  • Density unchanged. Chapter 6's signed-off fill and density windows, re-checked after the ECO's filler rebuild.
  • Displacement inside budget. Every number Dashboard 5 tracked, still inside the thresholds set before placement.
  • Change list archived. The PrimeTime change file, the layout-editing record, and the readiness and inventory dashboards, all kept together as one ECO record.
Dashboard 6 — stage exit go/no-go

Every other board in this chapter feeds this one. This is the board a reviewer who has ten minutes should read, and the one that closes the series.

Stage-exit go/no-go board — the chapter's and the guide's closure gate
ItemEvidenceSource command / reportThresholdStatusRequired action
Timing and DRC
1. Timing clean, func_ss_0p72v_125cWNS +0.004 ns, TNS 0 nsreport_timingWNS ≥ 0, TNS = 0PASS
2. Timing clean, func_ff_0p88v_m40cWNS +0.017 ns, TNS 0 nsreport_timingWNS ≥ 0, TNS = 0PASS
3. DRC clean0 violationsfix_eco_drc report / route_eco DRC pass0 violationsPASS
Density, displacement, evidence archived
4. Density within signoffM1 61.3%, within Chapter 6's signed-off banddensity window reportWithin Chapter 6's exit bandPASS
5. Displacement within budgetmax 1.8 µm of 8.0 µm budgetDashboard 5≤ budgetPASSDashboard 5 record
6. Change list archivedpt_eco.tcl, reviewed and storedwrite_changesStored with the ECO recordPASSpt_eco.tcl, archived
7. Layout-editing record archivedrecord_layout_editing output stored alongside the change listrecord_layout_editing -stop -outputStored with the ECO recordPASSlayout-editing.tcl, archived
Checkpoint and series close
8. Checkpoint savednimbus8_sens_tile_eco1_closed_v1save_blockExists and reopens cleanPASSnimbus8_sens_tile_eco1_closed_v1
9. Checkpoint confirmed to reopenReopened, 0 errors, timing matches archived valuescheckpoint reopen test0 errors, timing matchesPASSreopen log
10. Series handoff note writtenWhat the eight-chapter guide taught end to end, floorplan through ECO Flowhandoff reviewPresentPASSPart 12 close, this chapter

Stage-exit verdict: 10 PASS, 0 REVIEW, 0 BLOCKER → GO. This ECO, and the eight-chapter guide it closes, are done.

Read it: Every row names the saved artifact that proves it. Row 9, the layout-editing record, is what lets a later engineer reconstruct exactly what changed and why without re-running the ECO.

Field values are this chapter's illustrative teaching data.

What the reader now knows, end to end

Eight chapters ago, this guide started with an empty library and a netlist. Floorplan shaped that netlist. Placement and optimization filled it with legally placed cells. Clock tree synthesis gave those cells a trustworthy clock. Routing and postroute optimization connected everything with real, rule-clean metal. Chip finishing and design for manufacturing made that metal signoff-clean and manufacturable. Hierarchical implementation showed how to do all of that at a scale too large for one flat run. And this chapter, ECO Flow, is what you do the day after all of that is declared done and something still needs to change.

That last sentence is the whole point of this being the final chapter and not an appendix. Every fact this chapter used, it borrowed from somewhere earlier: placement legality from Chapter 4 is what makes place_eco_cells's legalize modes meaningful. The clock trees Chapter 5 built are what Part 9's clock-network ECO fixing is careful not to disturb. The routing rules Chapter 6 signed off are what route_eco's blast radius in Figure 3 respects. The fill and spare cells Chapter 6's chip-finishing planted are what Part 5's cost ledger reconciles against, cell for cell. And the block boundaries Chapter 7's hierarchical implementation drew are the constraint a freeze-silicon or signoff ECO on a partitioned design must respect.

A reader who has followed this guide from Chapter 1 to here has built a chip and repaired it, in that order, with the same vocabulary and the same discipline throughout. That is what “end to end” means for this series, and this Part is where it closes.

Part 13 — Knowledge reinforcement and interview bank

45 questions, tiered, every answer grounded in this chapter

Forty-five questions across four tiers: 16 beginner, 15 intermediate, 9 advanced, and 5 senior/architect (16+15+9+5 = 45). Every answer draws only on what this chapter taught; illustrative numbers are labelled as such, and no command appears in an answer that was not verified in the body text. At least six questions cross back to earlier chapters, marked ↩ earlier chapter.

Beginner, 16 questions

1. What is an ECO?
An incremental change to a complete or nearly complete design, used to fix functional, timing, noise and crosstalk violations without re-synthesizing, re-placing and re-routing the whole design.
2. What is a spare cell?
A real, placed cell that is recognized as available for future use: it is not physical-only, all of its non-clock inputs are tied or unconnected, and its output is unconnected. It has a real logical function waiting to be wired in.
3. What does “freeze silicon” mean?
A constraint, active after tapeout, under which the diffusion, poly and contact layers may not change at all — only metal and via layers may. A freeze-silicon ECO realizes its fix entirely by rewiring existing, already-manufactured transistors.
4. Which command places ECO cells?
place_eco_cells. It performs coarse placement from connectivity, then legalizes to the closest unoccupied site.
5. What does -post_eco save, on create_stdcell_fillers?
It scopes the filler DRC check to only the cells the ECO placed, instead of checking every filler cell in the design, which saves real runtime on a large design.
6. Name the five ECO flows.
Generic ECO flow, freeze silicon ECO, signoff ECO, incremental signoff ECO, and ECO Fusion.
7. What is the first question that decides which flow you are in?
What are you still allowed to change — silicon and metal, or metal only — and whether the design has taped out at all.
8. Which command compares a working design against a golden reference?
eco_netlist, using either -by_verilog_file or -by_block.
9. What is eco_cell and eco_net?
The default name prefixes add_buffer and add_buffer_on_route use for new cells and new nets they create.
10. What are the three legalize modes for place_eco_cells?
free_site_only (the default), allow_move_other_cells, and minimum_physical_impact.
11. What is a displacement threshold?
A distance, in microns, beyond which place_eco_cells will not legalize a cell — it keeps the cell at its pre-legalization location instead, and reports it as rejected.
12. Which PrimeTime command exports an ECO's changes for ICC2 to apply?
write_changes.
13. What does fix_eco_timing's -type option require?
It is mandatory: you must specify setup or hold. There is no combined default that fixes both at once.
14. What is a programmable spare cell (PSC)?
A gate-array-style filler shape that can be programmed, by metal and via wiring alone, into one of several compatible functions at ECO time, rather than being committed to a single fixed function the way an ordinary spare cell is.
15. Which shell does fix_eco_drc run in?
PrimeTime's pt_shell, not ICC2's icc2_shell.
16. What is the worked ECO used throughout this chapter?
A late setup violation on a u_sens_tile boundary path, fixed with one buffer insert (eco_cell_1) and one cell upsize (u_sens_tile/U88), alongside a small functional change adding a two-input gate.

Intermediate, 15 questions

17. Why does place_eco_cells leave existing cells untouched by default?
Its default legalize mode, free_site_only, is built for minimal disturbance: it places ECO cells on free sites and never moves anything else, on the theory that the cheapest ECO is one that changes nothing beyond what it strictly needs to.
18. What is in a change file, and why read it before sourcing it?
Plain Tcl — ordinary netlist editing commands like create_cell, connect_net, change_link. Reading it before sourcing is the single best habit this chapter teaches: it is the only way to confirm the change matches what you expect before it is applied to the design.
19. Why must you tie a spare cell's inputs to a rail?
A floating CMOS input is not electrically inert — it can drift near the switching threshold, causing leakage current and, under noise, oscillation. Tying unused inputs to a defined rail keeps an unmapped spare quiet until it is mapped.
20. What stops incremental signoff ECO tracking?
A functional ECO change. Additional timing ECO changes may continue while record_signoff_eco_changes is active, but a functional change ends the recording session.
21. Why is -respect_blockages not the default on add_buffer_on_route?
Because respecting every blockage can push the search much further from the net's real route, making the wire longer instead of shorter. It trades placement legality against displacement distance, and the default leaves that trade to the engineer.
22. What happens to a cell a freeze-silicon ECO “deletes”?
It is not removed from the design — silicon cannot be removed after tapeout. It is retired back to spare status and stays in the design, tied off, available for a future ECO.
23. What is the difference between logic-only and physically aware PrimeTime ECO fixing?
Logic-only works from netlist and parasitics alone, with no placement awareness. Physically aware mode reads real placement data, so fixes land only where physical room genuinely exists, and the change list records exact coordinates.
24. Why is -max_displacement_threshold different from -displacement_threshold?
-displacement_threshold decides what gets legalized versus rejected. -max_displacement_threshold builds a separate collection, epl_max_displacement_cells, of changes disruptive enough that the right response may be rejecting the ECO change itself, not just its placement.
25. What does -post_eco actually change about how create_stdcell_fillers runs?
It scopes the DRC check step to the ECO-placed cells only, leaving the rest of the design's fillers unchecked because nothing about them changed.
26. Why must eco_netlist -write_changes or -write_changes_per_module be specified?
The command requires exactly one of them: they are how the comparison result gets written out at all, and they are mutually exclusive because they represent two different output shapes — one combined file versus one file per module with a dependency-ordered source sequence.
27. What is a “buffer tree” in the context of eco_update_supply_net?
A group of connected timing-ECO cells — added by add_buffer, add_eco_repeater, split_fanout or add_buffer_on_route — bounded by any cell of a different type, treated as one unit when supply-net connections are updated.
28. Why does -displacement_tolerance_level high tolerate more ECO-cell displacement?
Because it inverts the usual preference. Instead of minimizing how far the ECO cell itself moves, at the cost of moving more existing cells to make room, it minimizes how much existing cells move — even if the ECO cell lands further from its ideal location.
29. What is the difference between a filler cell and a spare cell?
A filler cell has no logical function — it exists to keep a standard-cell row continuous and hold density. A spare cell has a real function, simply unused, its inputs tied off until an ECO maps it. Neither is ever selected as an ECO target cell.
30. Why does fix_eco_power's default selection method minimize area rather than power directly?
Because minimizing measured power requires PrimePower data from update_power first, via -power_mode; area minimization needs no such prerequisite and is available immediately, which is why it is the default rather than the more precise but more setup-dependent power-mode option.
31. Why does editing an instance inside a multiply instantiated block uniquify it?
So the edit applies only to that one instance's behavior, not to every sibling instance of the same module. The tool creates a private copy of the module, and its ancestors up to the first singly instanced level, specifically to contain the change.

Advanced, 9 questions

32. When do you choose minimum_physical_impact over allow_move_other_cells?
Choose minimum_physical_impact whenever a free site exists close enough to be acceptable — it tries free-site placement first and only falls back for the cells that need it. Reach for allow_move_other_cells only when the design genuinely has no room and failing to place is the worse outcome; it always succeeds, but every cell it moves is a disturbance you did not intend.
33. Why is the fix order power → DRC → setup → hold → leakage?
Because DRC fixing is allowed to degrade timing, while setup and hold fixing are guaranteed never to degrade DRC. Fixing DRC before timing means a later timing fix cannot silently reopen a DRC violation you already closed; reversing the order risks exactly that.
34. When is a load-capacitance cell the right hold fix instead of a buffer?
For a very small hold violation, on the order of five picoseconds or less. A buffer adds a full logic stage of delay, which typically over-fixes a violation that small and can turn it into a new setup violation on the same path. A load cell adds just enough capacitance without adding a stage.
35. When do you reject an ECO change rather than the placement?
When report_eco_physical_changes, before placement, or epl_max_displacement_cells after it, shows a displacement so large it is telling you something about the change itself, not just this placement attempt. At that point, revert_eco_changes and re-deriving the fix is the right move, not tuning the legalize mode further.
36. Why can't -displacement_threshold be combined with -legalize_mode allow_move_other_cells?
Because allow_move_other_cells is defined to always find a legal location by moving whatever is in the way — there is no concept of “too far, so reject it” in that mode, since the mode's entire purpose is to never reject. A threshold has nothing to check against.
37. Why does ECO Fusion need check_consistency_settings specifically, and not just a clean eco_opt run?
Because ECO Fusion's convenience depends on ICC2's postroute timing settings genuinely matching PrimeTime's. A clean eco_opt run only proves the fusion flow's own view is self-consistent, not that it matches a standalone PrimeTime signoff run, which is the actual signoff authority.
38. Why does the LEQ path exist, if same-name spare mapping is simpler?
Because a same-name spare of the exact cell type is not always nearby, but a different-named cell computing the same logical function often is. create_freeze_silicon_leq_change_list lets a freeze-silicon ECO succeed without an exact type match, at the cost of an extra generation step.
39. What makes a PSC reduce mask cost compared to a fixed-function spare?
A PSC's transistor-level shape is fixed at tapeout, same as any other cell; only the metal and via layers above it change when it is programmed. That metal-only change is exactly what a freeze-silicon ECO can make without a new mask set; a different fixed-function spare's silicon might force one.
40. Why is eco.placement.optimized_legalization relevant even if you never set it directly?
Because setting -displacement_tolerance_level on place_eco_cells forces this application option to true regardless of its prior value. A change made through one command's option can silently change a different command's default behavior later in the same session — which is why this chapter's command-verification discipline checks the full argument description, not just the option's name.

Senior / architect, 5 questions

41. How do you decide between a freeze-silicon ECO and a new mask set?
Run check_freeze_silicon first: if every ECO cell maps, same-name or by logic equivalence, the freeze-silicon path is almost always cheaper than a new mask set. The decision tips toward a new mask set when a meaningful fraction of cells come back unmapped — an engineering and cost decision, not a tool command.
42. Who owns the decision that an ECO is too disruptive?
The person who receives the epl_max_displacement_cells report should not unilaterally push through with allow_move_other_cells. That decision belongs to whoever owns the schedule and physical-verification risk for the block — a disruptive change deserves design-review visibility, not a placement-option choice made alone at a terminal.
43. How do you keep a signoff ECO loop from iterating forever?
Fix in the documented priority order every time, so earlier steps cannot be silently reopened later. Use estimate_eco to screen candidates before a full incremental update, and track convergence explicitly — Dashboard 4's iteration-by-iteration WNS and TNS shows whether the loop is closing or oscillating, not just one final number.
44. What do you archive so a later engineer can reconstruct what this ECO did and why?
The PrimeTime change file (pt_eco.tcl), the layout-editing record from record_layout_editing -stop -output, the readiness and change-inventory dashboards from before the ECO started, and the blast-radius numbers from after. Together these let a later engineer reconstruct not just what changed, but why it was judged acceptable at the time.
45. What did this chapter, and this guide, teach end to end?
The guide taught how to build a chip: floorplan shapes it, placement and optimization fills it, clock tree synthesis gives it a trustworthy clock, routing and postroute optimization connects it, chip finishing makes it manufacturable, and hierarchical implementation shows how to do all of that at a scale too large for one flat run. This chapter taught what happens the day after that is declared done and something still has to change, using a fact one of the earlier chapters established at every step. Building and repairing a chip, in this guide, were never two separate skills.

Cross-chapter questions, gathered

Six questions above cross back to earlier chapters explicitly. Q19 depends on Chapter 6's chip-finishing fill discipline for why tied inputs matter electrically. Q29 depends on the filler/spare distinction Chapter 6 established during density signoff. Q32 and Q35 depend on the placement-legality vocabulary Chapter 4 built. Q41 depends on the block-boundary constraints Chapter 7's hierarchical implementation drew. And Q45 depends on all seven chapters at once, by design, as this chapter's closing question.

ICC2 Implementation Mentor Guide — Detailed Design Analysis series. Chapter 8: ECO Flow. Final chapter of eight.

All design data in this chapter describes Nimbus‑8, a fictional teaching project. Every measured value is illustrative teaching data, not a tool transcript. ICC2-side commands were verified against the IC Compiler II Tool Command Reference; PrimeTime-side commands (fix_eco_drc, fix_eco_timing, fix_eco_power, write_changes, estimate_eco, eco_opt) against PrimeTime documentation. See the command-verification record in the delivered package.