Skip to content
Ch 03 / 8 Chapter 3: Placement & Optimization
← Prev Next →
Detailed Design Analysis Placement and Optimization ICC2 Implementation Mentor Guide

Detailed Design Analysis

Placement and Optimization in ICC2: A Mentor Guide

How a legal, checkable floorplan gets a design's worth of standard cells placed, buffered, resized, and timing-closed through the place_opt flow — taught the way a senior engineer would explain it at the whiteboard.

Teaching project: Nimbus‑8 Stage 3 of 8 Beginner → working engineer
Opening promise

What you will be able to do after this chapter

By the end of this chapter you will be able to take a legal, checkable Floorplan — die and core sized, macros placed, power compiled, pins assigned, but not one standard cell placed — and turn it into a fully placed, legalized, timing- and congestion-optimized design ready for clock tree synthesis, using the same command whether you run it as one step or five.

Concretely, you will be able to: run place_opt end to end and explain what each of its five internal stages actually does; run the same work as discrete steps with create_placement and legalize_placement when you need that control; steer placement with timing-driven, congestion-driven, and buffering-aware options instead of accepting whatever the default gives you; enable IR-drop-aware placement, concurrent clock and data optimization, and physical guidance from Design Compiler when a design calls for them; bank single-bit registers into multibit cells; pull a cluster of logic toward a fixed anchor with magnet placement; and prove every one of these worked with report_placement, report_utilization, and a placement status query — not with an impression of the layout view.

As with every chapter in this guide, the goal is not memorizing flags. It is building the same judgment a placement lead uses when deciding whether a design is actually ready for clock tree synthesis, so that when a CTS or routing problem shows up two stages later, you already know whether it traces back to a placement decision made here.

Why this stage matters

Why this stage matters in the full flow

Floorplan decided whether the design fits. Placement and Optimization decides whether it works — whether timing closes, whether the design is routable without heroics, whether power density stays sane, and whether area is spent efficiently. This is the stage where most of a project's timing and congestion story actually gets written, because it is the first point where every one of a design's millions of standard cells has a real, specific location and a real, specific set of neighbors.

It is also the stage most beginners underestimate, because place_opt looks like a single command. It is not one decision; it is five, each with its own job, each capable of being run alone when a specific problem calls for it. Treating it as "run place_opt and see what happens" is how a design ends up re-run three or four times with no clearer idea of what changed between attempts than at the start.

Stage boundary

What enters, what must leave

Stage boundary for Placement and Optimization
Enters this stageMust leave this stage
A legal floorplan: die and core sized, rows and tracks defined, hard macros placed and keepout-protectedEvery standard cell placed and legalized on the site grid, honoring every macro and blockage
A compiled power network and assigned pins from the previous chapterA design optimized for timing, area, leakage power, and routability — not just placed
Committed timing constraints (from Preparing the Design) with no clock tree yetA placement QoR report and utilization figure the tool computed, proving the optimization actually converged
Registers and clock-gating cells not yet merged, banked, or optimized as a groupClock-gating cells merged, multibit banking applied where it helps, and a design ready for a temporary or real clock tree

What does not leave this stage: a real clock tree (only a temporary, optional trial clock tree used internally, if enabled, and discarded before clock tree synthesis), or detailed routing. Those belong to Clock Tree Synthesis and Routing, in that order. This chapter's exit gate is a fully placed, timing-checked design a clock tree can be built on top of — not a routed one.

Prerequisite knowledge

What you should already be comfortable with

  • Everything from the Floorplan chapter (not included in this standalone package): a legal die and core, placed macros, a compiled power network, and assigned pins.
  • Basic timing vocabulary: slack, setup and hold, and the idea that a "violation" is a number, not a feeling.
  • What a buffer and an inverter do in a netlist, at least conceptually — this chapter buffers nets by the million without re-explaining what buffering is.
  • Basic Tcl, as used throughout this guide: variables, lists, and running a command with options from icc2_shell.

You do not need prior placement or optimization experience. Where this chapter uses a term for the first time, it defines it before relying on it.

Learning objectives

By the end of this chapter, you will be able to…

  • Explain place_opt's five stages — initial_place, initial_drc, initial_opto, final_place, final_opto — and run any subset of them with -from and -to.
  • Run standalone coarse placement and legalization with create_placement and legalize_placement, and say when that control is preferable to the combined command.
  • Turn on timing-driven, buffering-aware, and congestion-driven placement, and control the CPU effort spent on each.
  • Merge clock-gating cells before placement and explain why sequencing that before place_opt changes what the command does internally.
  • Enable IR-drop-aware placement and concurrent clock and data (CCD) optimization, and state what each one actually changes about the placed design.
  • Bank single-bit registers into multibit cells with identify_multibit, and split a bank back apart with split_multibit when it hurts more than it helps.
  • Use magnet placement to pull a cluster of logic toward a fixed anchor, and refine an existing placement's congestion with refine_placement.
  • Prove a placement is actually done with report_placement, report_utilization, and a placement-status query — not a glance at the layout view.
Beginner mental model

Think of it as moving the everyday furniture into a finished floor plan

Analogy. The previous chapter drew the floor plan and installed everything that cannot move — the built-in furniture (hard macros), the wiring (the power network), and the doors and windows (pins). This chapter moves in everything else: the desks, chairs, and shelves — the standard cells — and then walks through the apartment adjusting them room by room. First a fast, rough drop of every piece somewhere reasonable (initial_place). Then a walk-through making sure nothing blocks a doorway or a hallway (initial_drc: fixing up nets with too many branches, buffering long runs). Then a real arrangement pass for comfort and function (initial_opto: timing, area, congestion, leakage). Then small nudges so walking paths are clear (final_place: incremental re-placement plus legalization). Then a last, careful adjustment pass before guests arrive (final_opto).

Engineering translation. All five of those moves are what place_opt does in one command, in order, by default. "A fast rough drop" is coarse placement, also runnable alone with create_placement. "Making sure nothing blocks a doorway" is initial DRC fixing — high-fanout net synthesis and electrical DRC repair. "A real arrangement pass" is timing/area/congestion/leakage optimization. "Small nudges, then legalize" is incremental placement followed by legalize_placement—also runnable alone. "A last adjustment pass" is final optimization, where concurrent clock and data optimization and further legalization happen.

Vocabulary

Terms this chapter depends on

Core vocabulary for Placement and Optimization
TermPlain-English meaning
Coarse placementA fast first pass that gives every standard cell an approximate, legal-ish location.
LegalizationThe pass that moves cells onto real, non-overlapping site-grid positions without changing the netlist.
place_opt stageOne of five named phases — initial_place, initial_drc, initial_opto, final_place, final_opto — that together make up the default placement and optimization flow.
Timing-driven placementPlacement that considers timing criticality when deciding where to put a cell, not just area and wire length.
Congestion-driven placementPlacement that spreads cells to avoid routing hot spots, at some cost to wire length or runtime.
IR-drop-aware placementPlacement that spreads cells with high voltage-drop values to reduce local power density.
Concurrent clock and data (CCD) optimizationAdjusting clock arrival times at registers (useful skew) together with datapath optimization, to trade positive slack where it helps.
Multibit register bankingReplacing several single-bit registers driven by the same clock with one equivalent multibit register cell.
Magnet placementPulling the standard cells connected to a fixed anchor object close to it, to shorten local wiring and reduce congestion.
Physical guidance (SPG)Using a Design Compiler Graphical placement, carried over by DEF, as ICC2's placement starting point instead of starting from scratch.
Placement statusA per-cell state — unplaced, placed, fixed, legalize_only, or locked — controlling whether later commands are allowed to move it.
BufferabilityWhether a specific net segment can legally be buffered, given available supply nets, library cells, and any don't-touch or ideal-network settings.
Stage flow diagram

The place_opt pipeline

Figure 1 — The place_opt pipeline Five internal stages of place_opt shown left to right between an entry box (legal floorplan) and an exit box (optimized, legalized placement): initial_place, initial_drc, initial_opto, final_place, final_opto. Each arrow is a gate the tool must clear before the next stage is trustworthy.
Read it: as in every chapter so far, each arrow is a verification gate, not just a handoff. -from and -to let you enter or leave this pipeline at any of the five named points, not only at the ends.
Inputs and outputs

What comes in, what must go out

Inputs to Placement and Optimization
ItemOwnerFormatRequired?ValidationFailure impact
Legal floorplan with placed macrosFloorplan (this engineer, previous chapter)Design library checkpointRequiredopen_lib succeeds; report_utilization matches the checkpoint's recorded figurePlacing standard cells against an unvalidated floorplan re-surfaces geometry problems the previous chapter exists to catch
Committed timing constraintsPreparing the Design (two chapters back)SDC, loaded into the blockRequiredTiming-driven and congestion-driven placement options depend on real, not default, constraintsPlacement without real timing constraints optimizes against nothing meaningful, producing a QoR report that looks fine and means little
Effort and mode decisions: timing-driven, congestion-driven, buffering-awareThis engineer, informed by an initial place_opt passCommand-line options and application-option settingsRecommended, not strictly requiredA first pass's report_placement and congestion map justify which options are worth the runtime costGuessing which options a design needs wastes runtime on the wrong lever
Multibit banking policyDesign methodology / this engineerset_multibit_options settings, or noneOptionalreport_multibit after banking, compared against expectationsUnplanned banking or debanking changes area and clock tree structure in ways CTS then has to absorb
Outputs from Placement and Optimization
ArtifactConsumerPersistenceHandoff rule
Fully placed, legalized standard-cell placementClock Tree Synthesissave_lib checkpointNever hand off a placement whose legalization was not re-confirmed after the last edit
Placement QoR and utilization reportsThis engineer, design planning, CTS ownerKept with the checkpointReport the achieved figures the tool computed; never carry a target forward as if it were measured
Merged clock-gating cells, banked multibit registersClock Tree SynthesisStored in the blockDocument any manual banking or debanking decision made outside the default flow, with a reason
Placement status on any manually fixed or locked cellsEvery later stageStored in the blockDocument why a cell is fixed or locked, not just that it is — a future engineer needs the reason, not just the state
Figure 2 — Input and output handoff map Three arrows carry legal floorplan, committed timing constraints, and effort and mode decisions into a central Placement and Optimization box on the left; three more arrows carry placed and legalized standard cells, placement QoR and utilization reports, and merged clock-gating cells with banked multibit registers out to Clock Tree Synthesis on the right. Every connector shows the direction of flow with an arrowhead.
Read it: the arrows are the point — three inputs flow in on the left, three outputs flow out on the right, and nothing on the right exists without a validated item on the left. A placement that "looks converged" without a report_placement to back it up is not really an output yet.
Readiness checklist

Before you open icc2_shell

Some of the items below are entry gates — without them, placement cannot legally proceed at all. Others are optional strategy choices — deliberate decisions, not defaults you should let slide by unexamined. Both kinds need objective evidence, not a feeling that things are probably fine.

Figure 3a — Placement setup dependency map: inputs and setup checks Four input categories — floorplan readiness, reference libraries, scenarios and constraints, and voltage areas — each feed a central setup-checks gate through its own dedicated routing lane, so no connector crosses another box's text, and the gate only passes once every input category is clean.
Read it: this is a dependency map, so all four arrows matter, not just one — floorplan readiness, reference libraries, scenarios and constraints, and voltage areas each feed the setup-checks gate independently, each through its own clear path down the right margin. The table below is the detailed version of the same map: a row failing in the table is the same as a failed check here, and fixing that input category is the only way through, not pushing through the gate anyway.
Figure 3b — Placement setup dependency map: controls and coarse-placement handoff Once the setup-checks gate passes, it hands off into placement controls, then into coarse placement. A failed check loops back to the input category that needs fixing — shown as a curved orange arrow from Setup checks to a failing-input box, arrowhead pointing at the input — instead of passing an incomplete or inconsistent setup.
Read it: continuing from Figure 3a — the gate hands off into placement controls, then coarse placement. The curved orange arrow on the left is the loop-back drawn out, not just described: a failed check returns to the input category that needs fixing, arrowhead pointing at that input, not forward through the gate.
Placement and optimization setup gate
Input / conditionWhy placement needs itVerificationPass evidenceFailure symptomOwner / source
Open, reproducible checkpointPlacement builds on a specific saved design state; without one there is nothing to compare before/after againstcurrent_blockReturns the expected block nameWrong or no block openFloorplan chapter's saved checkpoint
Legal floorplan / valid placement areaCoarse placement and legalization require real, non-overlapping site rows inside a defined corereport_utilization, GUI floorplan viewUtilization and core/die geometry match the Floorplan chapter's saved figuresZero or nonsensical utilization; missing core areaFloorplan chapter
Standard-cell rows, sites, and fixed macrosCells cannot legalize onto a grid that does not exist, and macro keepouts must already be honoredGUI floorplan view; report_placement for macro-adjacent violationsRows visible across the core; macros show placement status fixedMissing rows in part of the core; a movable macroFloorplan chapter
Timing constraints and active scenariosTiming-driven placement and every later timing report depend on real, intentional constraints, not a placeholder SDCSpot-check a few paths with report_timing; confirm active scenariosConstraints return sensible, non-default clock periods and exceptionsDefault or missing clock definitions; no active scenarioPreparing the Design chapter
Clock definitions and logical DRC constraintsCongestion-, timing-, and buffering-aware placement all read these to know what to optimize towardreport_clock; report_constraintsClocks and DRC limits (max transition, max capacitance, etc.) are present and reasonableNo clocks defined; DRC limits left at library defaults with no reviewPreparing the Design chapter
Usable target / reference cellsPlacement, buffering, and tie-cell insertion all need library cells that are not blanket don't-usereport_lib_cells or a library usability spot-checkBuffer, inverter, and tie cells are usable, not don't-use/don't-touch across the boardOptimization silently skips buffering or tie-cell insertion because no usable cell existsReference library setup
Placement blockages, bounds, and keepoutsCoarse placement and legalization must respect any area intentionally kept clearGUI floorplan view; blockage listBlockages match the Floorplan chapter's intent, with no unexplained gapsA blockage silently missing or misplaced from the saved floorplanFloorplan chapter
Scan/DFT inputs, or an explicit non-applicability decisionCoarse placement performs scan-chain optimization automatically when a SCANDEF is present — an easy side effect to missCheck for a loaded SCANDEF or an explicit "no DFT" decision on recordA documented decision either way, not silenceUnexpected scan-chain reordering discovered after the factDFT / Preparing the Design chapter
Power domains, voltage areas, supply connectivity (if multivoltage)IR-drop-aware placement and multivoltage buffering must know real voltage-area boundaries and supply availabilityPower domain / voltage area list; UPF reviewDomains and supply nets carried over match the Preparing the Design chapterA voltage area with no legal supply net for bufferingPreparing the Design chapter
Switching activity (if power-driven decisions expected)report_power and any power-aware placement decision need meaningful, not default, activity assumptionsConfirm an activity file or vectorless estimate is applied to the active scenarioA specific, intentional activity source is documentedDefault/no activity, silently producing a meaningless power numberDesign methodology / power scenario setup
Routing layers and congestion-estimation assumptionsCongestion-driven placement estimates routability against a specific layer and rule assumptionRouting-layer / NDR assumptions carried from FloorplanAssumptions match what routing will actually use laterPlacement congestion estimate based on different layers than routing will useFloorplan chapter
Preservation / dont_touch intentOptimization must not disturb cells or nets deliberately protected earlier in the flowreport_attribute -name dont_touch on the intended setExactly the intended cells/nets carry the attribute, no more, no fewerAn unintended cell locked out of optimization, or an intended one left unprotectedPreparing the Design chapter
Baseline timing, power, and QoR capture; floorplan-stage utilization on recordEvery comparison in this chapter — utilization change, timing movement, QoR-data comparison — needs a "before" to measure against. Utilization's real "before" is the floorplan-stage figure, not the trivial 0.0% read before any standard cell is placed.report_qor -summary, write_qor_data labeled as the pre-placement run (Step 3); the floorplan-stage utilization figure carried forward from the previous chapterA written or captured baseline exists before the first placement command runsA later claim ("utilization improved," "timing got worse") with no baseline to check it againstThis chapter, Step 3 of the worked example (QoR/timing); previous chapter's saved figure (utilization)
Saved rollback pointAn option experiment or a bad run needs a known-good state to return to without redoing everythingsave_lib return valueA checkpoint saved before any experimental option is triedAn irreversible experiment with no saved state to fall back toThis chapter

Before placement starts

  • Checkpoint reopens cleanly and current_block returns the expected block.Evidence: current_block output.
  • Floorplan-stage utilization is on record as the comparison baseline.Evidence: the achieved utilization number from the previous chapter, written down.
  • Timing constraints and active scenarios are confirmed real, not placeholder.Evidence: a spot-check of a few paths via report_timing.
  • Scan/DFT applicability is a documented decision, not an unexamined default.Evidence: a one-line note, either way.
  • Power domains and voltage areas, if any, are carried over and understood.Evidence: the power domain list from the previous chapter.
  • Preservation/dont_touch intent is verified against the intended cell/net set.Evidence: an attribute query matching the intended list exactly.

Before optimization starts

  • Coarse placement has completed and report_placement shows a legal-ish starting point.Evidence: report_placement output from right after coarse placement.
  • Your project's policy on multibit register banking is known before letting any default flow bank silently.Evidence: a one-line note from design methodology, or an explicit decision to use the tool's default.
  • Any nondefault application option you plan to enable (IR-drop-aware placement, congestion effort, trial clock tree) is a deliberate choice, reviewed against a first-pass report, not a default left untouched.Evidence: a one-line note on which options are enabled and why.
  • Baseline timing, power, and QoR data are captured before the first optimization pass changes anything.Evidence: write_qor_data labeled as the pre-placement run, or equivalent saved reports.

Before a rerun or option experiment

  • A checkpoint exists to roll back to if the experiment makes things worse.Evidence: save_lib return value before the experimental run.
  • The specific hypothesis behind the option change is written down, not just "try it and see."Evidence: a one-line note naming the option and the expected effect.
  • Before/after evidence is planned for, not just the after: a write_qor_data label exists for both states.Evidence: two distinct labeled write_qor_data captures, comparable via compare_qor_data.
  • No option experiment will be accepted into the saved checkpoint without that before/after comparison being reviewed first.Evidence: the compare_qor_data/view_qor_data comparison, reviewed before save_lib.

↑ Back to contents

Concepts in dependency order

Filling in the shape, one dependency at a time

1. The place_opt command and its five stages

place_opt performs coarse placement, physical optimization, and legalization in a single command, and by default runs all five of its internal stages in order: initial_place, where the tool merges clock-gating logic and performs coarse placement (and scan chain optimization, if a SCANDEF was read in); initial_drc, where the tool removes existing buffer trees and performs high-fanout-net synthesis and electrical DRC violation fixing; initial_opto, where the tool performs timing, area, congestion, and leakage-power optimization; final_place, where the tool performs incremental placement to improve timing and congestion, and legalizes the design; and final_opto, where the tool performs further optimization and legalization to improve timing and congestion.

The command supports multithreading, using the number of threads set by set_host_options -max_cores. Running it with no options at all executes every stage; that default behavior is the right starting point for a first pass on any new design.

2. Standalone placement and legalization

Everything place_opt does for coarse placement and legalization is also available as two separate commands: create_placement performs coarse placement (and, when a SCANDEF was read in, scan chain optimization), and legalize_placement executes detailed placement — moving cells onto real, legal, non-overlapping site positions without changing the netlist. Running these directly, instead of through place_opt, gives you control that the combined command does not expose as cleanly: legalizing only a named list of cells or a bounded region, for instance, rather than the whole design.

3. Staging place_opt with -from and -to

-from and -to let you run any contiguous subset of the five stages: if you do not specify -from, the tool begins from initial_place; if you do not specify -to, it continues through final_opto. This is how you re-enter the flow after fixing something upstream without re-running stages that already converged — for example, running only place_opt -from initial_drc on a design that already has a good coarse placement, to avoid re-placing it from scratch.

-list_only prints the five stage names without running anything, a quick way to confirm the exact stage names your release expects before scripting around them.

4. Timing-driven, buffering-aware, and congestion-driven placement

create_placement (and, through it, place_opt's coarse-placement behavior) supports several modes that change what coarse placement actually optimizes for. -timing_driven enables timing-driven placement outright. -buffering_aware_timing_driven uses an approximate timing model that estimates the effect of buffers that will be added later on long and high-fanout nets, without changing the netlist itself — intended specifically as a better starting point for later timing optimization, not a substitute for it. -congestion enables congestion-driven placement, with -congestion_effort (low, medium, or high) controlling how much CPU effort is spent avoiding routing hot spots; expect a real runtime cost at high effort.

Figure 4 — Timing-driven and congestion-driven placement, side by side Two placement panels drawing the identical set of 60 cells, with both the 14-cell hot-spot subset (orange) and the 6-cell critical-path subset (teal) marked in both panels. The default panel shows the hot-spot subset densely packed into a tinted congestion hot spot while the critical-path subset sits at its relaxed positions. The timing- and congestion-driven panel shows the same hot-spot cells relieved back to relaxed spacing, still the same orange color, and the critical-path subset pulled tightly together instead, its label joined to the small circle it names by a leader line.
Read it: it is the same 60 cells in both panels, just moved — that is the entire point of a before/after placement figure. The default placer only packs for density, so the hot-spot cells (orange) stay clustered; the timing- and congestion-driven pass spreads that same orange group back out and pulls the critical-path group (teal) together instead, visible in both panels throughout. Enabling both goals is common, but expect the placer to trade one against the other, not satisfy both perfectly.

5. Clock-gating cell optimization during placement

By default, place_opt merges clock-gating cells at the start of initial_place (or, when the Synopsys physical guidance flow is enabled, at the start of initial_opto). If merge_clock_gates has already been run beforehand, place_opt does not merge again. place_opt can go further: if the place_opt.flow.optimize_icgs application option is enabled, the tool performs clock-aware placement of critical clock-gating cells, builds a temporary clock tree specifically to identify timing-critical clock gates, and can split a clock-gating cell if the enable pin of the gate sits on a critical timing path.

6. Trial clock tree and clock-gate latency accuracy

place_opt uses ideal clock information by default. Setting the place_opt.flow.trial_clock_tree application option to true tells the tool to build a temporary clock tree and use propagated clocks during placement and optimization instead; Clock Tree Synthesis later removes this temporary tree and builds the real one. Independently, the tool estimates and updates clock-gate latencies throughout the place_opt flow by default, to make datapath and useful-skew optimization more accurate while clocks are still ideal — specifying real clock tree synthesis settings (buffers, inverters, nondefault routing rules) before running place_opt improves the accuracy of that estimate. A dont_estimate_clock_latency attribute, set with set_attribute on a specific clock-gate's clock pin, opts that one gate out of the estimate.

7. High-fanout synthesis and rebuilding buffer trees

During initial_drc, place_opt performs high-fanout net synthesis, building buffer trees for nets with too many loads for a single driver to handle well. By default this uses virtual routes; setting the place_opt.initial_drc.global_route_based application option to 1 switches it to use global routes instead, which for fragmented floorplans can improve timing and reduce congestion. Combined with place_opt.initial_place.two_pass set to true, the tool runs an integrated two-pass initial placement: wire-length-driven placement, a trial high-fanout synthesis pass whose results are discarded, then timing-driven placement that proceeds into global-route-based high-fanout synthesis for real.

After place_opt has run, if a specific buffer tree needs to be rebuilt to meet a requirement that changed later, create_buffer_trees rebuilds it explicitly — by default for all high-fanout nets, or for one named net with -from.

Figure 5 — High-fanout buffer tree, before and after A single driver feeding 9 load pins directly before synthesis, and the same driver feeding the same 9 loads through a two-level buffer tree of inserted buffers after high-fanout synthesis, split 5 and 4 across the two top-level buffers so each final buffer drives a small, manageable number of loads.
Read it: both panels drive the same 9 loads — the tree just reduces each buffer's fanout to a manageable share of them, at the cost of extra logic levels and buffer cells. create_buffer_trees does not legalize the new cells itself — run legalize_placement after.

8. Path optimization and nondefault routing rules for critical nets

Two further, independently-enabled behaviors improve timing QoR during place_opt. Setting place_opt.flow.do_path_opt to true turns on path optimization — an incremental capability focused specifically on improving individual timing paths' QoR. Setting place_opt.flow.optimize_ndr to true lets the tool apply nondefault routing rules to timing-critical nets during preroute optimization, and guide the router to honor those assignments later as soft constraints.

9. IR-drop-aware placement

During placement, the tool can use the voltage (IR) drop values of cells to identify areas of high power density and spread those cells out, reducing local density. This requires an external voltage-drop analysis source — RedHawk Fusion, set up and run separately — that this guide names but does not cover in depth, since it lives outside the ICC2 User Guide's own scope for this chapter. The ICC2-side procedure is: run place_opt -to final_place to get through final placement; perform static or dynamic voltage-drop analysis with analyze_rail -voltage_drop (after the external setup); enable place.coarse.ir_drop_aware; and rerun with place_opt -from final_place to let the tool use the voltage-drop values on the next pass.

Figure 6 — IR-drop-aware placement, before and after A core area with a voltage-drop heatmap, drawing the identical 54 cells in both panels. The before panel shows them clustered tightly into a dense red hot spot. The after panel shows the same 54 cells spread out over a wider area, reducing the peak power density even though the total cell count and total power are unchanged.
Read it: it is the same 54 cells in both panels, just spread wider — total power cannot change from a placement move alone, so the cell count does not either. Spreading them reduces power density; it does not, by itself, fix an IR-drop violation caused by a thin power mesh — that is a floorplan-stage power network problem, not a placement one.

10. Concurrent clock and data (CCD) optimization

Concurrent clock and data optimization applies useful-skew techniques during the final optimization stage — adjusting clock arrival times at registers to take advantage of positive slack elsewhere in the path. It is enabled by default during final_opto; setting place_opt.flow.enable_ccd to false turns it off. The clock-latency adjustments it derives are stored as offsets (via set_clock_latency -offset and set_clock_balance_point -offset), visible with write_script -format icc2, but not captured in an SDC written with write_sdc. To use CCD meaningfully, the same scenarios active for clock_opt should be active for place_opt, and the tool needs either a trial clock tree (place_opt.flow.trial_clock_tree or place_opt.flow.optimize_icgs set true) or accurate ideal clock latencies on every clock-gating and sequential cell.

Figure 7 — Concurrent clock and data optimization: useful skew Two registers, REG_A and REG_B, connected by a 620 ps combinational datapath, against a 1150 ps clock period, with a small square-wave glyph marking each clock edge as a real clock signal, not an unexplained arrow. Before panel: both CLK pins fire on the same reference edge (0 ps skew); the endpoint REG_B/D label sits above the box; the path fails setup with -60 ps slack. After panel: REG_B's CLK wire is rerouted from its actual pin, dropped, and jogged 85 ps later than the reference edge, with a dimension bracket calling out the +85 ps offset clear of the wire itself; slack becomes +25 ps and the path passes. A timing ledger beside each panel lists clock period, data path delay, skew borrowed, and slack.
Read it: the before panel's common clock edge leaves -60 ps of slack on a 1150 ps period. Delaying REG_B's clock 85 ps — borrowed from a neighboring path's spare margin, not created — moves slack to +25 ps. Same clock period, same 620 ps data path; only REG_B's clock arrival time changed.

11. Physical guidance from Design Compiler

When starting placement from a Design Compiler Graphical placement instead of from scratch, ICC2 can use that placement as a starting point — reducing placement runtime and improving correlation between the two tools. The DC-side netlist transfers as Verilog with constraints; physical information (die area, site rows, tracks, port locations, macro and cell placement, route guides, prerouted nets, and placement blockages) transfers by reading a DC-generated DEF file with read_def -add_def_only_objects {cells} -convert_sites. Physical constraints DEF does not carry — voltage area definitions, layer constraints, special route guides with utilization, and special blockages with blocked layers — must be applied separately in a Tcl file. Setting place_opt.flow.do_spg to true before running place_opt enables this Synopsys physical guidance (SPG) flow.

Figure 8 — Physical guidance from Design Compiler to ICC2 A flow diagram: Design Compiler Graphical produces a gate-level Verilog netlist and a DEF file with physical placement. ICC2 reads both, plus a separate Tcl file for physical constraints not captured in DEF, then sets the place_opt.flow.do_spg application option true and runs place_opt to continue optimizing from the DC placement. There is no -spg flag on place_opt; do_spg is an application option set before the command runs.
Read it: DEF carries geometry, not intent — voltage areas, layer constraints, and special blockages still need an explicit Tcl file. There is no -spg option on place_opt: the ICC2 box shows the actual mechanism, set_app_options -name place_opt.flow.do_spg -value true run before place_opt. SPG names the feature; it is not a command-line flag. Treating the DEF alone as "the constraints" is the most common gap in this flow.

12. Multibit register optimization

ICC2 can combine (bank) single-bit registers, or smaller multibit register banks, into equivalent larger multibit register cells — merging only registers that share the same timing constraints, and copying those constraints to the resulting bank. Banking reduces area (shared transistors, optimized transistor-level layout), total clock tree net length, and clock tree buffer count and power. The tool can also split (debank) a multibit register into smaller banks or single-bit cells if doing so improves total negative slack, and on libraries with mixed-drive-strength multibit cells, it can rewire a violating path through a higher-drive-strength bit of an existing bank.

Banking can run integrated inside place_opt (enable place_opt.flow.enable_multibit_banking, optionally place_opt.flow.enable_multibit_debanking) or as discrete steps: identify_multibit finds banking opportunities and either applies them directly (-apply) or writes a script of create_multibit commands to review first (-output_file); split_multibit reverses a bank, by name, by slack threshold, or by path group; report_multibit reports what actually exists.

Figure 9 — Multibit register banking Two single-bit register cells, each with D, Q, scan-in, and scan-enable pins, merged by identify_multibit -register -apply into one two-bit register cell with the same pin set doubled, sharing one clock-tree connection instead of two. A shared-savings box lists what the bank shares, and a not-a-checkpoint-yet box notes that place_opt -from initial_drc and fresh reports must follow before saving.
Read it: banking only merges registers that already share identical timing constraints — it is not free-form logic restructuring, and it copies those constraints onto the resulting bank rather than inventing new ones. -apply changes the netlist, so it is not itself a checkpoint: rerun place_opt -from initial_drc and take fresh reports before treating the result as saved.

13. Magnet placement and refining placement

magnet_placement pulls the standard cells connected to a fixed anchor object — a fixed macro, a macro pin, or an I/O port — close to it, which can improve congestion around a complex floorplan or improve timing for a specific cluster of logic. Best run before standard-cell placement, it accepts a magnet object plus an optional -cells list restricting exactly which cells get pulled; cells form a contiguous data path from the magnet, or nothing moves. -logical_levels controls how many logic levels from the magnet are considered, and -stop_by_sequential_cells / -stop_on_sequential_cells stop the pull at a register boundary.

After a placement exists, refine_placement performs incremental congestion-optimizing placement on the whole design (or, with -coordinates, one bounded region) without touching the netlist — useful for a targeted congestion cleanup pass after the main place_opt flow has otherwise converged.

Figure 10 — Magnet placement: pulling a contiguous data path A magnet object (a fixed macro) on the left, with a chain of connected logic cells scattered across the die before magnet placement, and the same cells pulled into a tight cluster near the magnet after magnet placement, following the contiguous data path.
Read it: only cells on a contiguous path from the magnet move. A cell logically downstream but reached only through a gap in the chain — a branch the magnet does not actually connect through — stays exactly where it was.

14. Multivoltage-aware placement and optimization

Placement and optimization automatically account for multivoltage constraints. During placement, the tool places cells within their associated voltage area, and places level shifters and isolation cells close to voltage-area boundaries. During optimization, when the tool needs to insert a buffer, it analyzes the power states of the driver and loads' supplies (from the UPF power-state table or power-state groups) and chooses a buffering supply that avoids introducing a new multivoltage violation, preferring single-rail buffers over dual-rail ones to save power, area, and improve routability. check_bufferability answers, for a specific net segment and voltage area, whether a legal buffer actually exists to insert.

Figure 11 — Bufferability across a voltage-area boundary Two side-by-side scenes. Left: check_bufferability on a net crossing into voltage area PD1 succeeds, with a buffer inserted mid-path and a note that a legal supply is available. Right: check_bufferability on a net into voltage area PD_ISO fails, with the connection crossed out and a note that no legal supply net exists there.
Read it: the same operation — inserting a buffer — can be legal in one voltage area and illegal in another, purely because of supply-net availability. check_bufferability gives the specific reason, not just pass or fail.

15. Analyzing the result: utilization, placement QoR, and status

report_utilization reports achieved density from real geometry, exactly as in the previous chapter, optionally scoped to specific objects with -of_objects or to a named configuration created with create_utilization_configuration. report_placement is the placement-specific QoR report: by default it reports total half-perimeter wire length for all nets plus any placement violations, and supports narrower views — physical hierarchy violations, voltage-area violations, hard-macro overlap, and more — through its many options. Every cell instance carries a placement status — unplaced, placed, fixed, legalize_only, or locked — queryable with get_attribute and settable with set_placement_status, which is how you lock a cell's location against further movement by the tool while still allowing manual edits.

16. Diagnosing issues optimization could not fix

Two commands exist specifically to explain a stubborn problem rather than fix it directly. check_bufferability analyzes whether a net segment can be buffered at all — checking for available supply nets in the target voltage area, suitable library cells, and settings (an ideal-network or don't-touch constraint) that block buffering — and reports why, not just whether. analyze_design_violations generates a categorized, descending-severity report of violations that optimization could not fix, by type (max_trans, setup, hold, static_noise, or only_lib for library settings limiting optimization), which is the right first stop when a design comes out of place_opt with violations that a re-run does not seem to improve.

Command cards

The commands worth knowing cold

Every card below follows the same eight-point shape used throughout this guide, and every syntax line has been checked against the ICC2 Tcl command reference for this release. Where your installed release differs, trust man <command> over this page.

Placing the design

place_opt

Places and optimizes the current design in one command, five stages by default.

  1. What it isRuns coarse placement, DRC/buffering fixup, optimization, incremental placement, legalization, and a final optimization pass, in order.
  2. Why you run itIt is the default, complete path from a legal floorplan to a fully placed, optimized, legalized design.
  3. When in flowFirst in this chapter, immediately after the previous chapter's saved checkpoint is reopened.
  4. Exact Tcl
    icc2_shell> place_opt
  5. What ICC2 changesPlaces every standard cell, optimizes for timing/area/congestion/leakage, performs incremental re-placement, and legalizes the final placement.
  6. What to read back — proof it took effectreport_placement for wire length and violations; report_utilization compared against the floorplan-stage figure.
  7. Trap-from and -to must respect stage order — the start stage cannot come after the end stage in the fixed sequence initial_place, initial_drc, initial_opto, final_place, final_opto.
  8. If you skip itStandard cells stay unplaced; nothing downstream — CTS, routing — has real cell geometry to build against.

create_placement

Performs standalone coarse placement, with timing- and congestion-driven modes.

  1. What it isThe standalone coarse-placement command place_opt calls internally during initial_place, runnable on its own for direct control.
  2. Why you run itTo control coarse placement explicitly — effort level, timing- or congestion-driven mode — separate from the rest of the place_opt flow.
  3. When in flowAn alternative first step to place_opt, after merge_clock_gates has already run.
  4. Exact Tcl
    icc2_shell> create_placement -timing_driven -congestion \
       -congestion_effort medium
  5. What ICC2 changesGives every standard cell an approximate, legal-ish location, optimizing for the requested criteria.
  6. What to read backreport_placement for wire length and any early violations, before optimization or legalization has run.
  7. TrapIf a block contains scan chains annotated from a SCANDEF, coarse placement also performs scan chain optimization automatically — a side effect easy to miss when troubleshooting an unexpected scan-chain change.
  8. If you skip itNo standard cell has a location yet, and every later command that depends on placement has nothing to operate on.

legalize_placement

Executes detailed placement, moving cells onto real, legal, non-overlapping sites.

  1. What it isDetailed placement: legalizes an existing coarse or optimized placement onto real site-grid positions, without changing the netlist.
  2. Why you run itCoarse placement and optimization can leave cells in near-legal, overlapping, or off-grid positions that must be resolved before the design is real.
  3. When in flowAfter coarse placement or any optimization pass that could have disturbed legality; place_opt calls this internally during final_place.
  4. Exact Tcl
    icc2_shell> legalize_placement
  5. What ICC2 changesMoves cells onto legal, non-overlapping site positions with minimal disturbance; with -cells, legalizes only the named cells and leaves every other cell unchanged — but only after setting place.legalize.legalize_only_selected_cells to true (or running place_eco_cells -cells -legalize_only first). This is supported directly under the standard legalizer — see the trap below for the advanced-legalizer restriction.
  6. What to read backreport_placement for any remaining placement violations after legalization completes.
  7. TrapThe -cells option is not supported when the advanced legalizer is enabled — confirm which legalizer mode is active before relying on cell-scoped legalization.
  8. If you skip itA design can look placed in the layout view while still carrying illegal, overlapping, or off-grid cells that later stages will reject.

reset_placement

Unplaces every non-fixed, non-locked cell in the core area.

  1. What it isReverts every cell currently in the placed status back to unplaced; cells marked fixed or locked are left untouched.
  2. Why you run itTo discard a placement attempt cleanly and start coarse placement over, without losing deliberately fixed cells.
  3. When in flowRarely mid-chapter; mainly a recovery step when a placement attempt needs to be abandoned.
  4. Exact Tcl
    icc2_shell> reset_placement
  5. What ICC2 changesSets every cell with status placed back to unplaced across the core area.
  6. What to read backA placement-status query across the design confirming which cells actually reverted and which stayed fixed or locked.
  7. TrapThis does not touch cells marked fixed or locked — if you intended a full reset, check for cells you fixed earlier in the session that will silently survive this call.
  8. If you skip itN/A — this is a recovery command, not a required step in the default flow.
Clock-aware placement

merge_clock_gates

Merges integrated clock-gating (ICG) cells in clock trees, without changing logic.

  1. What it isMerges ICG cells within each clock tree that have the same type and identical enable-pin logic, for all currently defined clocks in all active modes by default.
  2. Why you run itFewer, better-placed clock-gating cells reduce clock tree size and power; place_opt does this automatically unless it has already been done.
  3. When in flowBefore create_placement, when running placement as standalone steps rather than through place_opt.
  4. Example
    icc2_shell> merge_clock_gates
  5. Check your releasemerge_clock_gates has no option to scope it to one clock — it merges eligible clock-gating cells across every clock tree. Run merge_clock_gates -help against your release before you script anything narrower.
  6. What ICC2 changesMerges eligible ICG cells for every clock's tree, without affecting the design's logic. There is no option to scope this to a single named clock — it runs chip-wide.
  7. What to read backA clock-gating cell count before and after, or a spot-check of a merged cell's enable-pin logic against its pre-merge sources.
  8. TrapIf you run this before create_placement, remember place_opt will not merge again — running both is not redundant-but-harmless work, it is simply a no-op the second time.
  9. If you skip itWhen running standalone create_placement (not place_opt), clock-gating cells are never merged automatically — a design keeps more, smaller ICG cells than necessary.
Congestion and layout refinement

magnet_placement

Pulls the standard cells connected to a fixed anchor object close to it.

  1. What it isPulls cells forming a contiguous data path from a specified magnet object — a fixed macro, macro pin, or I/O port — toward that object.
  2. Why you run itTo reduce local congestion around a complex floorplan, or improve timing for a specific cluster of logic, by shortening its wiring to a fixed anchor.
  3. When in flowBest run before standard-cell placement; can also be used later as a targeted, localized fix.
  4. Example
    icc2_shell> magnet_placement nimbus8_ddrphy
  5. Check your releaseCheck magnet_placement -help on your release for a logical-level limit and a stop-at-sequential-cell option before relying on either.
  6. What ICC2 changesMoves the qualifying, connected cells closer to the magnet object; cells not on a contiguous path from the magnet do not move.
  7. What to read backA congestion or cell-density map, or report_placement, before and after. magnet_placement has a preview-only mode; confirm its exact option name with magnet_placement -help on your release before you rely on it.
  8. TrapCells reached only through a gap in the data path — not truly contiguous with the magnet — do not move, even if they look logically related; the tool follows connectivity, not proximity or intuition.
  9. If you skip itLogic connected to a fixed macro is placed wherever ordinary placement decides, which is not always close to the macro it depends on most.

refine_placement

Performs incremental, congestion-optimizing placement without touching the netlist.

  1. What it isIncremental placement focused on congestion optimization, run on the whole design by default or a bounded region with -coordinates.
  2. Why you run itFor a targeted congestion cleanup pass after the main flow has otherwise converged, without re-running full placement and optimization.
  3. When in flowAfter place_opt, when a congestion map still shows a localized problem worth addressing directly.
  4. Example
    icc2_shell> refine_placement
  5. Check your releaseCheck refine_placement -help on your release for a congestion-effort or perturbation-level option before you script around one.
  6. What ICC2 changesAdjusts cell positions to relieve congestion; does not modify the netlist.
  7. What to read backA congestion map before and after, and report_placement to confirm no new violations were introduced.
  8. Trap-coordinates restricts changes to one rectangle, but the reference documentation itself warns this region-based refinement can cause timing or congestion degradation if the region is not properly chosen — whole-design refinement is the recommended default.
  9. If you skip itA localized congestion hot spot that place_opt's global optimization did not fully resolve stays as-is.
Multibit register optimization

identify_multibit

Finds groups of registers or MV cells that can be replaced by multibit equivalents.

  1. What it isIdentifies banking opportunities among registers (-register) or isolation/level-shifter cells (-mv_cell), and either applies them or writes a reviewable script.
  2. Why you run itTo bank single-bit registers into multibit cells as a discrete, reviewable step, instead of letting place_opt bank silently.
  3. When in flowAfter coarse placement, before running place_opt -from initial_drc to optimize the banked design.
  4. Example
    icc2_shell> identify_multibit -register
  5. Check your releaseCheck identify_multibit -help on your release for an apply-directly option and a slack-threshold option before you build a script around either.
  6. What ICC2 changesReplaces qualifying groups of single-bit registers with equivalent multibit register cells directly, or writes the equivalent create_multibit commands to a file for review first, depending on how the command is invoked.
  7. What to read backreport_multibit for what was actually banked, compared against what you expected.
  8. TrapBy default this performs DFT optimization that repartitions scan chains to increase banking opportunities — use -no_dft_opt if scan-chain structure must not change.
  9. If you skip itRegisters stay single-bit, at whatever area, clock-net, and clock-buffer cost that implies for this design's register count.

split_multibit

Splits a multibit register bank into smaller banks or single-bit cells.

  1. What it isReverses banking, on a named cell, on cells with slack worse than a threshold, or on cells within a named timing path group.
  2. Why you run itWhen multibit banking has put a violating path through a bank in a way that hurts total negative slack more than banking helped.
  3. When in flowAfter banking and a subsequent optimization pass shows a specific bank hurting timing.
  4. Exact Tcl
    icc2_shell> split_multibit -slack_threshold -1
  5. What ICC2 changesSplits the targeted multibit cells into the specified smaller cells (or single-bit cells by default), only for cells that were created by create_multibit or identify_multibit.
  6. What to read backreport_multibit re-run afterward, and the specific paths' slack re-checked with report_timing.
  7. TrapThis only splits cells the tool itself banked — a multibit cell that existed in the original netlist, never created by banking, cannot be split with this command.
  8. If you skip itA bank that is hurting a specific violating path stays banked, with no automatic correction elsewhere in the flow.
Diagnostics before handoff

check_bufferability

Checks whether a net segment can actually be buffered, and explains why or why not.

  1. What it isChecks for an available buffering supply net, suitable library cells, and blocking settings (ideal-network, don't-touch) on a specified net segment.
  2. Why you run itWhen optimization reports a net it could not buffer, this explains the specific reason instead of leaving you to guess.
  3. When in flowWhenever a specific net's bufferability is in question, most often while diagnosing a stubborn optimization result.
  4. Example
    icc2_shell> check_bufferability -nets n34 -voltage_area PD1
  5. Check your releaseCheck check_bufferability -help on your release for a verbose-output option.
  6. What ICC2 changesNothing — this is a read-only analysis.
  7. What to read backThe command's own information message: which library cells and supply nets are usable, or a specific reason buffering is impossible.
  8. TrapA net can be bufferable in one voltage area and not another — always specify -voltage_area deliberately rather than relying on a default that may not match the segment you actually care about.
  9. If you skip itAn unbufferable net stays a mystery, and troubleshooting time goes into re-running optimization instead of understanding the actual blocker.

create_buffer_trees

Rebuilds buffer trees for high-fanout nets after place_opt has run.

  1. What it isRemoves and rebuilds buffer trees for high-fanout nets, by default for every such net, or a named one with -from.
  2. Why you run itTo meet a requirement — timing, area, or DRC — that changed after place_opt's own automatic buffer-tree construction during initial_drc.
  3. When in flowAfter place_opt, when a specific net's buffering needs to be redone explicitly.
  4. Exact Tcl
    icc2_shell> create_buffer_trees -from n_highfanout_1
  5. What ICC2 changesRemoves the existing buffer tree for the targeted net(s) and rebuilds it from the driver outward.
  6. What to read backA timing and DRC check on the affected net, comparing before and after the rebuild.
  7. TrapThis is a targeted, explicit rebuild — it is not what runs automatically during place_opt's own initial_drc stage, and running it unnecessarily can undo buffering decisions optimization already made well.
  8. If you skip itThe buffer tree place_opt originally built for that net stands as-is, even if downstream requirements have since changed.
Reporting and status

report_placement

Reports placement QoR: wire length and placement violations for the current block.

  1. What it isBy default, reports total half-perimeter wire length for all nets and any placement violations present in the design.
  2. Why you run itIt is the placement-specific proof that the design converged, distinct from a general utilization or timing report.
  3. When in flowAfter place_opt (or standalone placement and legalization), and again after any later refinement.
  4. Example
    icc2_shell> report_placement
  5. Check your releaseCheck report_placement -help on your release for options that narrow the report to one violation category.
  6. What ICC2 changesNothing — this is a read-only report.
  7. What to read backThe reported wire length and violation counts; the design's specific violation categories still need reading in the full default report unless a narrowing option is separately confirmed.
  8. TrapA single-row-height violation on a standard cell is common enough after coarse placement that the tool does not report it by default — do not assume zero reported violations means zero placement imperfection at every stage.
  9. If you skip itYou are trusting that placement converged without ever actually checking, the same "looks fine" failure mode this guide keeps warning against.

set_placement_status

Sets the placement status of a cell or port, controlling whether the tool may move it.

  1. What it isSets a cell or port's placement status to unplaced, placed, fixed, legalize_only, or locked.
  2. Why you run itTo lock in a placement decision — a cell whose location a later reviewer or later optimization pass must not silently disturb.
  3. When in flowAfter a placement is confirmed correct, most often near the end of the chapter, before handing off to Clock Tree Synthesis.
  4. Exact Tcl
    icc2_shell> set_placement_status fixed [get_cells INST_1]
  5. What ICC2 changesSets the named status on the specified cells or ports; a fixed cell can still be sized during optimization, but not moved by it.
  6. What to read backA placement-status query on the same objects, confirming the status actually took, per the naming discrepancy noted in Analyzing the result.
  7. TrapA fixed cell can still be resized by the tool; if a cell's size must not change either, an additional dont_touch attribute is required — fixed placement status alone is not a full lock.
  8. If you skip itEvery cell remains movable by later commands, including ones run well after you considered its placement final.
Worked example

Nimbus‑8: placing and optimizing a teaching design end to end

Continuing from the previous chapter's saved checkpoint: a 3.20 mm × 3.20 mm core at 81.9% floorplan-stage utilization, 9.90 million standard cells, 72 SRAM macros, one DDR PHY hard macro, a compiled power network, and assigned pins. This chapter runs the IR-drop-aware placement procedure end to end on Nimbus‑8's own supply, and banks a portion of its register count into multibit cells.

Step 1 — reopen the checkpoint

icc2_shell> open_lib ../libs/nimbus8_lib
icc2_shell> current_block
{nimbus8_top}

Proof: current_block returns the same block the previous chapter saved, confirming this chapter is building on a validated floorplan, not a fresh unlinked design.

Step 2 — merge clock-gating cells before placement

icc2_shell> merge_clock_gates
/* run standalone since this worked example uses create_placement directly, not place_opt, for step 4 */

Proof: a clock-gating cell count taken before and after shows a reduction, with no change to the design's logical behavior.

Step 3 — confirm a clean pre-placement start and capture the QoR baseline

icc2_shell> report_utilization -verbose
Utilization: 0.0%
icc2_shell> report_qor -summary

Proof: the 0.0% reading here is measured standard-cell utilization — expected and correct, since Step 4's coarse placement has not run yet, so no standard cell has a location. It is a sanity check that this run starts clean, not the utilization figure Step 9 compares against; the utilization comparison this chapter cares about is against the floorplan-stage planned figure of 81.9% (the previous chapter's macros-plus-budgeted-cells figure over the fixed 3.20 mm × 3.20 mm core), captured before any Placement and Optimization command ran. The report_qor -summary baseline captured here is what Step 9's post-optimization QoR is measured against — a real "before," not an assumption.

Step 4 — coarse placement, timing- and congestion-driven

icc2_shell> create_placement -timing_driven -congestion \
   -congestion_effort medium

Proof: report_placement run at this point shows a legal-ish, if not yet optimized, placement with a reasonable total wire length for a 9.90-million-cell design at this utilization.

Step 5 — bank Nimbus‑8's register file into multibit cells, before optimization

icc2_shell> identify_multibit -register -apply -slack_threshold 0
icc2_shell> report_multibit

Proof: report_multibit lists the banked cells, confirming only registers with slack at or above the threshold were combined — nothing on a genuinely tight path was pulled into a bank without headroom to spare.

Step 6 — run place_opt through final placement

icc2_shell> place_opt -from initial_drc -to final_place

Proof: starting from initial_drc means this run both legalizes and optimizes the banked netlist from Step 5 — it is the required reoptimization pass, not a separate optional step. Stopping deliberately at final_place, rather than letting final_opto run immediately, leaves the design legalized and ready for the IR-drop-aware placement setup in the next step, per the ICC2 User Guide's own procedure for this feature.

Step 7 — enable IR-drop-aware placement and rerun

/* voltage-drop analysis itself requires RedHawk Fusion, set up separately and out of this guide's scope; */
/* the two icc2_shell-side steps below are what the ICC2 User Guide documents for this release */
icc2_shell> set_app_options -name place.coarse.ir_drop_aware -value true
icc2_shell> place_opt -from final_place

Proof: a before-and-after voltage-drop heatmap (from the external analysis source) shows the previous power-density hot spot spread over a wider area, and report_placement confirms no new placement violations were introduced by the rerun.

Step 8 — check tie cells

icc2_shell> report_multibit
icc2_shell> add_tie_cells

Proof: place_opt inserts tie cells automatically where it creates constant-driven pins during optimization; running add_tie_cells afterward catches anything left undriven — a return of no new insertions is itself the pass evidence.

Step 9 — check placement QoR and utilization against the baseline

icc2_shell> report_placement
icc2_shell> report_utilization -verbose
Utilization: 79.4%

Proof: compare this reading against the floorplan-stage planned baseline (81.9%) named at the top of this worked example, not against Step 3's 0.0% (that was a pre-placement sanity check, not a utilization baseline — standard cells had no location yet). Here the illustrative before/after shows utilization moving from the floorplan-stage planned 81.9% down to a measured 79.4% — consistent with Step 5's banking reducing cell count and therefore occupied area inside the same fixed 3.20 mm × 3.20 mm core, not a contradiction of it. report_placement shows no unresolved violations. Never assume utilization is unchanged after a netlist-changing operation like banking; measure it.

Step 10 — lock the DDR PHY's companion logic before CTS

icc2_shell> set_placement_status fixed [get_cells nimbus8_ddrphy_ctrl*]
icc2_shell> get_attribute -objects [get_cells nimbus8_ddrphy_ctrl_top] -name status

Proof: the status query confirms fixed took effect on the queried cell, protecting this cluster's now-converged placement from being disturbed by clock tree synthesis's own optimization passes next chapter.

Step 11 — checkpoint

icc2_shell> save_lib nimbus8_lib
Saving library 'nimbus8_lib'
1

Checkpoint / rollback point: this is the placed, optimized, reoptimized-after-banking design Clock Tree Synthesis will build on. Treat the return value 1 as confirmation, the same discipline carried from every previous chapter.

Figure 12 — Nimbus‑8 placement and optimization exit snapshot The finished Nimbus-8 placement: the same 3.20 mm by 3.20 mm core and macros from the floorplan chapter, now filled with a legible, evenly spread field of standard cells. The DDR PHY macro and the sampled SRAM macros are shown in distinct colors, with a leader line connecting the '72 SRAM total, 14 shown (sampled)' label to the nearest drawn macro, and the fixed-status box for nimbus8_ddrphy_ctrl* clear of the core outline.
Read it: the macros and power network are unchanged from the previous chapter — what is new here is the field of standard cells now filling the space between them, and the placement QoR proof that field actually converged. DDR PHY and SRAM macros are colored distinctly since they are different IP; the "14 shown" label is a sample of 72 total SRAM macros, not the whole count.
Visual inspection guide

What to look for in the GUI

As in every chapter so far, no screenshots are supplied — the habit of looking with intent outlasts any static picture. ICC2's GUI offers three map modes purpose-built for this chapter's work: the global route congestion map, the cell density map, and the pin density map. After each major step above, open the layout view and check:

  • After coarse placement: does the cell density map show any obviously empty or overcrowded region, before optimization has had a chance to smooth it out?
  • After initial_opto or a full place_opt pass: does the global route congestion map show any hot spot you did not expect, given the floorplan's macro layout?
  • After IR-drop-aware placement: does the same region that showed high power density before now show a visibly wider spread of high-power cells?
  • After multibit banking: spot-check a few banked cells in the layout view — do they sit in a sensible location relative to where their original single-bit registers were?
  • After locking cells with set_placement_status fixed: confirm in the GUI (or with a status query) that exactly the intended cluster, and nothing wider, was affected.
Reports and how to read them

Reading proof, not just running commands

Figure 13a — Placement analysis map: six categories into one diagnosis A placed design checked across six analysis categories — legality, congestion, timing, power, density and utilization, and QoR — each producing its own report feeding one diagnosis step.
Read it: the report table below is category five and six of this map spelled out in detail. Diagnosis means reading all six categories together, not declaring victory because one report came back clean while another was never checked.
Figure 13b — Placement analysis map: diagnosis to exit decision The diagnosis step reads all six categories together. A clean result exits toward CTS; a problem routes back into corrective action for the specific category, then the design is re-analyzed against the same six checks.
Read it: continuing from Figure 13a — a clean diagnosis exits toward CTS. A problem sends you to corrective action for the specific category that failed, then back through the same six checks, not a generic rerun.
Reports that prove Placement and Optimization is actually done
ReportWhat it provesRed flag to look for
report_placementTotal wire length and placement violations, the core placement-QoR proofAny nonzero violation count left unreviewed, especially hard-macro overlap or physical-hierarchy violations
report_utilization -verboseAchieved density held steady from the floorplan-stage figureA utilization figure that shifted from the floorplan-stage baseline with no explanation
report_multibitExactly which registers were banked, and at what slack thresholdA bank that includes a cell on a path you know is tight, despite a slack-threshold setting meant to exclude it
Placement-status query (get_attribute)Which cells are fixed or locked, and that the set matches intentA cell fixed unintentionally, blocking a later optimization pass from a legitimate improvement
check_bufferabilityWhether a specific net segment can be buffered, and the exact reason if notA "cannot insert buffers" result with no voltage-area or supply-net explanation checked
analyze_design_violationsA categorized, prioritized list of violations optimization could not fix on its ownRe-running place_opt unchanged, hoping the same violations resolve without new information
report_qor (named here, detailed in the Timing Analysis User Guide)Overall QoR statistics for the block, beyond placement aloneTreating a clean placement report as equivalent to a clean overall QoR report
Analyzing timing

Reading timing at the placement stage, not skipping it

Timing is automatically updated whenever a command needs it — report_timing included. Use update_timing explicitly when you want a fresh, known-current timing snapshot before comparing two moments in the flow, rather than relying on an implicit update buried inside whatever you run next.

update_timing

Explicitly refreshes timing information for the current design.

  1. What it isAn explicit timing update; incremental by default (updates only out-of-date information).
  2. Why you run itTo guarantee timing is current before you take a reading you intend to compare against a later one — not to make timing "more correct" than an automatic update would.
  3. When in flowRight before capturing baseline timing, and again right before capturing post-optimization timing, so both readings are on the same footing.
  4. Example
    icc2_shell> update_timing
  5. Check your releaseCheck update_timing -help on your release for a full-update flag before you rely on one.
  6. What ICC2 changesRecomputes timing analysis data; changes no placement or netlist state.
  7. What to read backNo direct report of its own — it prepares the design for report_timing, report_qor, and report_constraints to read.
  8. TrapAn explicit update costs real runtime beyond what an implicit, automatic update would — use it only when you specifically distrust the incremental result, not as a reflexive habit before every report.
  9. If you skip itUsually nothing — the next timing-dependent command updates it for you. The risk is only in a before/after comparison where one side updated implicitly at a different moment than the other.

Reading one timing path before running anything

Figure 14 — One report_timing path, top to bottom, with its five fields called out An annotated report_timing path showing startpoint, endpoint, and path group at the top; a delay-contributor list of cell and net stages building the arrival time; the required time; and the resulting negative slack. Five leader-line callouts to the right of the report name what each field means for a placement-stage engineer, each leader landing on the vertical center of the row or row-block it names: startpoint/endpoint, path group, delay contributors, arrival vs. required time, and slack.
Read it: the net-delay jumps in the middle of the path are the placement-stage lever — a negative slack at the bottom traces back to which of those jumps is largest, not to the cells' drive strength alone. Each callout on the right ties its field back to that same placement decision, not just a report-reading convention.

Before the commands, know what a single reported path is telling you. Every report_timing path names a startpoint (where the signal launches, usually a register's clock pin or an input port) and an endpoint (where it is captured, usually a register's data pin or an output port), grouped into a path group. The report gives an arrival time (when the signal actually gets there, accumulated delay along the path) and a required time (the latest, or earliest, it is allowed to arrive, set by the clock period and any constraint). Slack is required time minus arrival time for a max-delay (setup) path; a positive slack means the path passes with that much margin, a negative slack means it is late by that much.

Illustrative annotated timing path (values are synthetic, for teaching the anatomy only)
FieldIllustrative valueWhat it means
Startpointnimbus8_regfile/bank3_reg[12]/CPLaunch flop's clock pin — the path's origin
Endpointnimbus8_alu/acc_reg[12]/DCapture flop's data pin — the path's destination
Path groupsys_clkWhich clock's constraints govern this path
Arrival time3.42 nsAccumulated delay from launch to this point
Required time3.60 nsLatest arrival the clock period and constraints allow
Slack+0.18 nsPassing, with 0.18 ns of margin
Analyzing timing — sequence, evidence, and ownership
StepCommand or reportWhat it answersRed flag
1update_timing (when an explicit refresh is needed)Is this timing snapshot current?Comparing a stale reading against a fresh one without realizing it
2report_timingWhat are the worst paths, and by how much do they pass or fail?A negative-slack path with no owner or explanation
3report_qor -summaryWhat is the overall setup/hold/design-cost picture, not just the single worst path?A worst-path fix that leaves total negative slack (TNS) barely moved
4report_constraintsAre there logical DRC violations — max transition, max capacitance, max/min delay, min pulse width, min period?Any DRC violation left unreviewed, even if timing itself looks clean
5Compare against the pre-placement baseline (Step 3 of the worked example)Did placement and optimization move timing in the direction you expected?Worst slack improved while total negative slack got worse — a sign of localized, not systemic, improvement
6Classify any regression before rerunning anythingIs this a placement problem, a constraint problem, a library/cell problem, or a limit optimization cannot fix?Rerunning place_opt unchanged, hoping a regression resolves without new information
Analyzing power

Reading a power report without comparing apples to oranges

Power is calculated and reported with report_power. Before running it, know which leakage-power calculation method is active, since it changes the numbers you get back.

Leakage-power calculation methods (power.leakage_mode)
ModeBasis
averageEqual weighted probabilities for all states
unconditionalThe library's default_cell_leakage_power or cell_leakage_power attribute
state (default)Weighted sum of each cell state's condition, from state-dependent leakage characterization and static probability; falls back to unconditional if that characterization data is not available
offLeakage power is not reported
icc2_shell> set_app_options -name power.leakage_mode -value average

To include composite current source (CCS) receiver-model capacitance in power analysis and reporting, set power.use_ccs_rcv_cap to true.

Reading a power report

A default power report names the mode, corner, and scenario it was computed in, the voltage and temperature used, the voltage/temperature/power units, cell leakage power, and a breakdown by power group with leakage power, total power, and percentage of total for each group.

Figure 15 — One report_power summary, group by group, with its five fields called out An annotated report_power summary showing the mode/corner/scenario header, a power-group breakdown with internal, switching, and leakage columns for the clock_network, register, combinational, and io_pad groups, and the total dynamic and total power rows. Five leader-line callouts to the right of the report name what each field means for a placement-stage engineer, each leader landing on the vertical center of the row it names: mode/corner/scenario, internal/switching columns, the clock_network row, the leakage column, and total dynamic/total power.
Read it: the header names the exact mode/corner/scenario this report is only comparable within; the total dynamic and total power rows at the bottom are what actually feeds the QoR-comparison workflow next. Each callout on the right ties its field back to that same placement decision, not just a report-reading convention.
Illustrative annotated power report (values are synthetic, for teaching the anatomy only)
FieldIllustrative valueWhat it means
Mode / Corner / Scenariomy_mode / bc_corner / bc_scenarioWhich active scenario this report was computed for — power differs by scenario
Voltage / Temperature1.16 V / 125 °CThe operating point this scenario represents
Cell Leakage Power5,125,495.58 μWTotal leakage across all cells, under the active leakage mode
Power group: clock_network0.65% of totalPower attributed to clock-network cells (or pins, if pin-based reporting is enabled)
Power group: register31.67% of totalPower attributed to sequential/register cells
Power group: combinational67.66% of totalPower attributed to combinational logic
Total5.13e+03 mWSum of leakage and dynamic power across all groups

Power groups

Running report_power without a specific cell list reports the default power groups (io_pad, memory, black_box, clock_network, register, sequential, combinational). Custom power groups — instance-based or library-cell-based — are created with set_power_group, and the report includes both default and user-defined groups. If a cell qualifies for more than one group, its reporting group is decided by precedence: an instance-level set_power_group assignment first, then a library-cell-level assignment, then the cell's default group.

Power-group commands
CommandPurpose
set_power_groupCreates or assigns a power group, by cell instance or library cell
get_power_groupGets a cell's power group (its effective reporting group with no option); check get_power_group -help on your release for option names to query its default group specifically or the user-defined groups it belongs to
report_power_groupsReports all power groups defined in the block
get_power_group_objectsReturns the collection of cells in a specific power group
reset_power_groupRemoves a power group, or removes a cell from one

Cell-based vs. pin-based clock-network power

By default, clock-network power in the clock_network group is cell-based: if any output pin of a cell is on the clock network, the entire cell's power — including every input and output — counts as clock-network power. Setting power.clock_network to pin_based limits it to only the pins actually on the clock network.

icc2_shell> set_app_options -list {power.clock_network pin_based}

report_clock_qor -type power always reports pin-based clock-network power, regardless of this setting — a source of apparent disagreement between the two reports if you forget which one you are reading.

Analyzing power — sequence
StepAction
1Confirm the active power scenario and that its switching-activity assumptions are meaningful for this comparison — not left over from an unrelated scenario.
2Select a nondefault power.leakage_mode only if you deliberately need one; otherwise the documented default (state) applies.
3Run report_power.
4Read units, scenario, voltage, temperature, leakage power, and total power before looking at any single group.
5Review default and any user-defined power groups for where the power actually sits.
6Review clock-network power, and confirm whether it is cell-based or pin-based before comparing it to a different report.
7Compare against the pre-placement baseline; explain any material movement rather than assuming it is noise.
Comparing QoR data

Comparing runs, not judging one run alone

A single run's reports tell you whether that run is internally consistent. They do not tell you whether a change helped. For that, ICC2 generates a web-based QORsum report comparing captured QoR data across runs, through a fixed chain of commands.

  1. Configure capture (optional) — set_qor_data_options: pick the leakage/dynamic power scenarios and clock/scenario used for summary rows, and optionally a run name.
  2. Capture each runwrite_qor_data, once per flow stage you want recorded, each run labeled so it stays distinguishable (for example place_opt, post_cts).
  3. Generate the comparisoncompare_qor_data, pointing at each captured run's location, builds the QORsum report.
  4. Viewview_qor_data opens the generated report.
Figure 16a — Five steps to a QORsum report A top-to-bottom chain: capture a baseline run, run placement, write QoR data for each run, generate the comparison report with compare_qor_data, and view the QORsum report.
Read it: the baseline run at the top is not optional — skip it, and the regression check in Figure 16b has nothing to compare against.
Figure 16b — Regression check, exit or corrective action The QORsum report from Figure 16a feeds a regression-vs-baseline decision: a clean result reaches the exit decision, and a regression routes into corrective action — adjust settings, re-run, and write QoR data again.
Read it: continuing from Figure 16a — a regression against baseline sends you back to adjust settings and re-run, feeding a fresh write_qor_data call rather than a generic restart.

write_qor_data

Captures QoR results to disk for the QORsum web application.

  1. What it isRuns and captures a standard set of reports (report_qor, report_power, and others) to a labeled stage directory.
  2. Why you run itTo record a comparable snapshot at a specific flow stage — the only way compare_qor_data has something to compare.
  3. When in flowOnce for the pre-placement baseline, and again after each placement/optimization run you want to compare.
  4. Command purposeCaptures QoR data (timing, power, runtime) to a stage directory that compare_qor_data later reads. Option names (label, output directory, report group) are release-specific — check write_qor_data -help.
  5. Check your release
    icc2_shell> write_qor_data -label place_opt -output ./qor_data/run1
  6. What ICC2 changesWrites reports and QoR data tables to a stage directory, labeled per run so that runs stay distinguishable when compared later.
  7. What to read backNothing directly — its output is consumed by compare_qor_data.
  8. TrapAll runs you intend to compare together must use consistent, comparable output locations — a later compare_qor_data call finds all labeled stages under one run location and treats them as one ordered sequence.
  9. If you skip itNo comparable record exists of this stage — only whatever individual reports you happened to run and save by hand.
compare_qor_data and view_qor_data
CommandOptionBehavior
compare_qor_data-forceBuilds the QORsum report from one or more captured run locations; default output directory ./compare_qor_data; does not overwrite existing output unless -force is given; unnamed runs default to run1, run2, etc. The option names for pointing at run locations and naming runs are release-specific — check compare_qor_data -help.
view_qor_datarelease-specificOpens the generated QORsum report, by default via a local web server. Option names for the report location, disabling the web server, or choosing a port are release-specific — check view_qor_data -help.

Baseline, shading, and delta style

By default, the first row of data is the baseline run; all other runs are compared against it, and the baseline is highlighted to mark it as the golden result. A different baseline can be chosen from the Runs dialog. Non-baseline cells are shaded red for a degradation and green for an improvement relative to the baseline, with lighter shading for a smaller difference and darker shading for a larger one. Right-clicking the table cycles the display between raw values, a percentage delta against the baseline, and an absolute delta against the baseline (shown in italic). Columns can be sorted by clicking their header (ascending, then descending), and both the visible metrics and the visible runs can be filtered from their respective dialogs.

Nimbus‑8: comparing three placement runs

The single-run worked example earlier in this chapter shows one path through placement. In practice you often run more than one experiment and need to know which is actually better — not just which one has the best single number.

Illustrative three-run comparison (values are synthetic, for teaching the method only)
MetricRun 1 — baseline placementRun 2 — timing-focusedRun 3 — congestion-focused
Worst setup slack−0.09 ns+0.04 ns−0.14 ns
Total negative slack (TNS)−3.8 ns−2.1 ns−5.6 ns
Failing endpoints412658
Peak routing congestionHigh (2 hot spots)Higher (3 hot spots)Low (0 hot spots)
Total dynamic power612 mW648 mW601 mW
Core utilization79.4%79.4%79.4%
Runtime38 min52 min44 min

Run 2 has the best worst-slack and the fewest failing endpoints — the number a quick glance would call "best." But it also introduced a new congestion hot spot and raised dynamic power, at a real runtime cost. Run 3 solved congestion cleanly but let timing degrade further. None of the three is unambiguously best; the QORsum comparison is what surfaces the tradeoff, instead of a single report_timing from Run 2 in isolation making it look like a clean win.

Tie cells

Adding and removing tie cells

A constant logic-0 or logic-1 pin needs a real drive source, not a direct wire to a supply rail. A tie cell — a small library cell built to drive a fixed constant — provides that source. place_opt and clock_opt insert tie cells automatically wherever their own optimization creates a constant-driven pin; add_tie_cells and remove_tie_cells give you explicit, standalone control over the same operation.

Figure 17 — Tie-cell concept A TIEHI cell and a TIELO cell, drawn in the same schematic style as the chapter's D flip-flops, each with a named output pin (Z) feeding three downstream cell inputs and its own VDD or VSS supply symbol. A bordered panel on the right shows the two forbidden alternatives this replaces: a VDD rail and a VSS rail, each broken by a red X with the pin it would have driven left open and undriven, well clear of the break.
Read it: a tie cell is a real driven output, on a named pin, between the constant intent and the pin that needs it — not a bare connection to a power or ground rail left with nothing actually driving it.

add_tie_cells

Inserts tie cells to drive constant pins in the design.

  1. What it isFinds constant-driven pins (by default, every constant pin in the current design) and drives them with a usable tie-high or tie-low library cell.
  2. Why you run itTo explicitly check for, and fix, any constant pin left undriven after placement and optimization's automatic insertion.
  3. When in flowAfter the main place_opt/optimization pass, as an explicit check before the exit gate — not a substitute for the automatic insertion during optimization.
  4. Example
    icc2_shell> add_tie_cells
  5. Check your releaseCheck add_tie_cells -help on your release for a pin/object-scoping option and for cell-restriction options.
  6. What ICC2 changesInserts tie-high or tie-low cell instances and connects them to constant pins, using only library cells that are not marked don't-use or don't-touch and are usable for optimization.
  7. What to read backRe-running add_tie_cells with no new insertions reported is itself the pass evidence; a placement-status or netlist check confirms the new tie-cell instances landed sensibly.
  8. TrapIf no usable tie cell exists in the library (all candidates don't-use or don't-touch), a constant pin can be left undriven with no error — check the library's tie-cell availability, not just the command's return.
  9. If you skip itAny constant pin optimization did not already handle stays undriven, an open item most easily caught here rather than in a later stage's DRC.

remove_tie_cells

Removes tie cells from the current design.

  1. What it isThe inverse of add_tie_cells: removes tie-cell instances, either a specific list or every tie cell in the design.
  2. Why you run itTo undo a tie-cell insertion before retrying it with different library-cell constraints, or to clear tie cells before a structural change that would otherwise leave them stranded.
  3. When in flowRarely mid-chapter; a targeted cleanup step before re-running add_tie_cells with a different cell list.
  4. Example
    icc2_shell> remove_tie_cells
  5. Check your releaseCheck remove_tie_cells -help on your release for a cell/library-cell scoping option.
  6. What ICC2 changesWith no option, removes every tie cell in the design; a scoped removal targeting one cell or library cell may also be possible — verify the option name before scripting it.
  7. What to read backA subsequent add_tie_cells or netlist check confirming the constant pins that lost their driver are now handled the way you intend.
  8. TrapRemoving every tie cell in the design with no option can leave every constant pin that depended on one undriven until add_tie_cells is run again — don't leave a design in that state at a checkpoint.
  9. If you skip itNot applicable in the normal flow — this is a corrective command, not a required step.
Advanced placement and legalization controls

Twenty-two settings that shape placement and legalization beyond the default flow

The worked example and command cards above cover the default place_opt/create_placement/legalize_placement path. The ICC2 User Guide documents a further set of application-option-driven controls — mostly under its "Specifying Placement Settings" and "Specifying Legalization Settings" topics — that shape how placement and legalization behave in specific situations: early-stage constraint uncertainty, clock-gating structure, congestion, wide cells and advanced nodes, dynamic power, and several legalization-quality features. Each entry below is scoped to a specific situation — it is not a general recommendation to enable all of them.

Setup risk

Consequences of inaccurate early placement constraints

Purpose
Let coarse placement continue, with a clear warning trail, when early-stage placement constraints (move bounds, blockages) turn out to be too tight for the cells that must go in them.
Problem it solves
Early in a design cycle, floorplan-stage move bounds and blockages are often drawn before final cell counts and cell sizes are known. If a bound ends up overutilized once real cells are placed, the tool can exit during coarse placement instead of finishing with a diagnosable result.
When to use it
Early design cycles where floorplan constraints are known to be provisional — not as a permanent substitute for fixing an undersized region.
Prerequisites

A block that has already failed, or is expected to fail, coarse placement due to a specific overutilized move bound or blockage-covered region.

ICC2 workflow
  1. Set place.coarse.handle_early_data to true before running create_placement/place_opt.
  2. Let placement continue into the overutilized region instead of exiting.
  3. Read the PLACE-089/PLACE-083/PLACE-084 warning messages the tool prints to locate exactly which move bound is overutilized and by how much.
  4. Optionally tune place.coarse.utilization_warning_threshold (default triggers above 90% region utilization) to change when the warning fires.
Commands and options
Commands and options for Consequences of inaccurate early placement constraints
Command / optionBehavior
place.coarse.handle_early_dataapp option, default false — continues placement through overutilized/blockage-covered regions instead of exiting
place.coarse.utilization_warning_thresholdapp option — utilization percentage (default 90%) above which PLACE-027-class warnings are issued
Expected reports or evidence
PLACE-089 (“Utilization of move_bound_0 is 109%”), PLACE-083, and PLACE-084 warning messages in the placement log, naming the specific overutilized region.
Risks and tradeoffs
This is a diagnostic escape hatch, not a fix — an overutilized region it silently plows through still needs its move bound, blockage, or cell budget corrected before the block is real.
Exit-checklist implication
A block that needed handle_early_data to finish coarse placement is not exit-gate clean until the underlying region-sizing problem the PLACE-089 warning named has been corrected and re-run without the warning.
Clock gating

Automatic group bounds for clock-gating structures

Purpose
Automatically keep an integrated clock-gating (ICG) cell and the sequential cells it drives close together during placement, without hand-authoring a group bound for every clock-gating fanout.
Problem it solves
An ICG cell placed far from the registers it gates lengthens the enable and clock paths it drives, working against both timing and the clock tree that CTS will build later.
When to use it
Any block using integrated clock gating where you have not already defined manual group bounds for the ICG/sequential-cell clusters.
Prerequisites

Clock-gating cells already merged (merge_clock_gates, or the equivalent automatic merge during place_opt's initial_place/initial_opt stage).

ICC2 workflow
  1. Set place.coarse.icg_auto_bound to true before coarse placement.
  2. The tool creates automatic group bounds at the start of placement and removes them at the end — cells already in another group bound are excluded.
  3. Optionally cap fanout per automatic bound with place.coarse.icg_auto_bound_fanout_limit (default 40).
Commands and options
Commands and options for Automatic group bounds for clock-gating structures
Command / optionBehavior
place.coarse.icg_auto_boundapp option, default false — enables automatic group-bound generation for ICG cells and their driven sequential cells
place.coarse.icg_auto_bound_fanout_limitapp option, default 40 — caps how many fanout cells an automatic bound can include
Expected reports or evidence
There is no dedicated report for this feature. Check its effect indirectly via placement proximity of ICG cells to their driven registers (for example a cell-density or congestion map) and via the resulting group-bound set from report_bounds, since it is removed again at the end of placement.
Risks and tradeoffs
An automatic bound only exists during placement itself; it is not a persistent design constraint, so it cannot be inspected after placement completes the way a manually defined group bound can.
Exit-checklist implication
Not a standalone gate item; feeds into the general clock-gating-optimization and congestion checks already on the setup/exit gates.
Density

Placement density control

Purpose
Cap how densely the tool packs cells in a region, either uniformly or specifically to relieve congestion around already-congested areas.
Problem it solves
Left uncontrolled, coarse placement can pack cells tightly enough to leave no routing headroom, or can pack the area surrounding a congested hot spot just as tightly as the hot spot itself, leaving nowhere to spread cells out of it.
When to use it
Whenever a block needs an explicit density ceiling instead of the tool's own auto-derived schedule — commonly once a first placement pass shows congestion or over-tight legalization.
Prerequisites

A baseline utilization figure for the block, so the chosen density/utilization value is meaningfully between 1 and that utilization.

ICC2 workflow
  1. Choose a value between 1 and the block's overall utilization.
  2. Set place.coarse.max_density for an overall density ceiling, and/or place.coarse.congestion_driven_max_util to control density specifically in the region surrounding congestion hot spots.
  3. Leave place.coarse.auto_density_control (default -enhanced) enabled unless you have a specific reason to disable it — explicit values you set always take precedence over the tool's derived ones regardless of this setting.
  4. Read the PLACE-027 info messages during placement to see which density/utilization values the tool actually used.
Commands and options
Commands and options for Placement density control
Command / optionBehavior
place.coarse.max_densityapp option — maximum density ceiling for non-congestion-driven placement; 0 forces uniform spreading
place.coarse.congestion_driven_max_utilapp option, default 0.93 — max utilization in areas surrounding congestion hot spots
place.coarse.auto_density_controlapp option, default -enhanced — tool-derived density schedule when explicit values are not set
Expected reports or evidence
PLACE-027 info message (“Automatic density control has selected the following settings: max_density 0.60, congestion_driven_max_util 0.77”) printed during placement.
Risks and tradeoffs
Density/utilization limits apply independently per placeable area (voltage area, exclusive move bound) rather than as a block-wide average — a single global number does not describe every region's actual headroom.
Exit-checklist implication
Feeds the setup-gate's density/congestion checks; a block still showing PLACE-027 values far from what was intended should be revisited before sign-off.
Congestion

Congestion-driven restructuring

Purpose
Restructure logic during coarse placement specifically to reduce routing congestion, with tunable effort and a guard against uncontrolled logic-depth growth.
Problem it solves
Congestion is sometimes a structural problem, not just a placement problem — the netlist's fan-in/fan-out shape itself creates local wiring demand that spreading cells alone cannot fix.
When to use it
Congested blocks where create_placement (without -timing_driven) or the place_opt initial_place stage's default restructuring is not aggressive enough, or is adding too much logic depth.
Prerequisites

A congestion signature already visible from a first coarse-placement pass or congestion map.

ICC2 workflow
  1. By default this restructuring already runs during create_placement (unless -timing_driven is set) and during place_opt's initial_place stage.
  2. Raise or lower effort with place.coarse.cong_restruct_effort (low/medium/high/ultra; default medium).
  3. If restructuring is adding too many logic levels to critical paths, cap it with place.coarse.cong_restruct_depth_aware set to true (limits added depth to at most three levels).
Commands and options
Commands and options for Congestion-driven restructuring
Command / optionBehavior
place.coarse.cong_restruct_effortapp option, default medium — low/medium/high/ultra effort for congestion-driven restructuring
place.coarse.cong_restruct_depth_awareapp option, default false — caps added path depth from restructuring to 3 levels of logic
Expected reports or evidence
Before/after congestion maps or report_congestion-class evidence around the restructured region; a path-depth comparison if cong_restruct_depth_aware was enabled specifically to bound depth growth.
Risks and tradeoffs
Restructuring changes logic structure, not just placement — at higher effort it can add path depth that partially offsets its own congestion win with a timing cost, which is exactly what cong_restruct_depth_aware exists to bound.
Exit-checklist implication
Supports the congestion items on the placement-analysis sequence and exit gate; not a separate gate item on its own.
Advanced nodes

Wide-cell density handling

Purpose
Keep wide standard cells placeable and legalizable without large displacement, on advanced nodes where a wide cell may only fit in one position between vertical power straps.
Problem it solves
If a cell cannot straddle the vertical power straps and its width exceeds half the strap pitch, only one such cell fits between a given pair of straps — packing too many wide cells into the same strap-bounded region makes them impossible to legalize without moving them a long way.
When to use it
Advanced technology nodes with meaningful vertical power-strap pitch constraints and a noticeable population of wide cells (wide multiplexers, wide drive-strength buffers, and similar).
Prerequisites

None beyond being on a node where this strap/cell-width interaction applies; the tool does not need extra setup data beyond the technology file's strap geometry.

ICC2 workflow
  1. Set place.coarse.wide_cell_use_model to true before coarse placement.
  2. The tool then minimizes the density of these wide cells during placement so legalization does not have to displace them far afterward.
Commands and options
Commands and options for Wide-cell density handling
Command / optionBehavior
place.coarse.wide_cell_use_modelapp option, default false — enables wide-cell-aware density modeling during coarse placement
Expected reports or evidence
Legalization RMS-displacement figures for wide-cell instances specifically, compared with and without the option enabled.
Risks and tradeoffs
Only relevant where the strap-pitch/cell-width interaction actually applies; enabling it on a design without meaningfully wide cells has nothing to improve.
Exit-checklist implication
Feeds the legalization-displacement checks on the exit gate for designs where wide cells are a known population.
Pin access

Cell-pin effects on placement

Purpose
Make coarse placement aware of pin-access cost or local pin density up front, instead of discovering pin-access DRC problems only after legalization or routing.
Problem it solves
Dense clusters of hard-to-access pins can produce routing and legalization difficulty that generic cell-area-based placement has no way to anticipate.
When to use it
Technology nodes of 7, 7+, 5, s5, or s4 (technology-specific pin-cost model available) or any other node needing generic pin-density awareness.
Prerequisites

set_technology -node already set for the block, since the choice of model depends on it.

ICC2 workflow
  1. On 7/7+/5/s5/s4 nodes: set place.coarse.pin_cost_aware to true for the technology-specific pin-cost model (this takes priority over pin-density awareness on these nodes).
  2. On any node: set place.coarse.pin_density_aware to true to control maximum local pin density instead.
  3. Both default to false; on 7/7+/5/s5/s4 nodes pin_cost_aware=true wins regardless of pin_density_aware; on other nodes only pin_density_aware has effect.
Commands and options
Commands and options for Cell-pin effects on placement
Command / optionBehavior
place.coarse.pin_cost_awareapp option, default false — technology-specific pin-cost-aware placement (7/7+/5/s5/s4 nodes only)
place.coarse.pin_density_awareapp option, default false — generic maximum-local-pin-density-aware placement
Expected reports or evidence
Pin-access DRC counts, or the pin-density map from #visual-inspection, before and after enabling the relevant option.
Risks and tradeoffs
Setting both options without checking Table 7's precedence rule on 7/7+/5/s5/s4 nodes can leave an engineer believing pin-density awareness is active when the pin-cost model has actually taken over.
Exit-checklist implication
Feeds pin-access DRC and legalization-displacement checks on the exit gate.
Clock routing

Effects of nondefault-rule clock nets

Purpose
Account, during placement, for the extra routing space that nondefault routing rules (NDR) on clock nets will need later, instead of discovering the resulting congestion only after clock routing.
Problem it solves
Nondefault routing rules are used extensively on clock nets to improve timing and reduce crosstalk, but they need more space than default-rule routing — congestion from this can appear only after clock routing if placement never accounted for it.
When to use it
Blocks with clock nets known to use nondefault routing rules, especially where post-clock-routing congestion has been a problem before.
Prerequisites

Clock definitions and the intended nondefault routing rule assignments already established (the setup-gate's constraints/clocks row).

ICC2 workflow
  1. Set place.coarse.ndr_area_aware to true before coarse placement.
  2. The tool factors the anticipated NDR routing-space demand of clock nets into its congestion accounting during placement.
Commands and options
Commands and options for Effects of nondefault-rule clock nets
Command / optionBehavior
place.coarse.ndr_area_awareapp option, default false — accounts for nondefault-routing-rule clock-net congestion during coarse placement
Expected reports or evidence
Post-clock-routing congestion comparison (with vs. without the option) in the regions the NDR clock nets pass through.
Risks and tradeoffs
Only helps congestion that is actually attributable to NDR clock-net routing; does not address unrelated congestion sources.
Exit-checklist implication
Feeds the congestion items on the placement-analysis sequence and exit gate for designs using NDR clock nets.
Clock gating

Clock-gating cells associated with sequential arrays

Purpose
Reduce clock-net congestion specifically around sequential arrays (register files and similar row/column register structures) by making placement aware of the single clock-gating cell that typically drives a whole row.
Problem it solves
A sequential array is a group of registers arranged as a two-dimensional array, usually with the clock pins along one row driven by a single clock-gating cell; naive placement of that structure can create local clock-net congestion.
When to use it
Blocks containing register-file-like sequential arrays with row-shared clock gating.
Prerequisites

None beyond the sequential array existing in the netlist in a form the tool can recognize as such.

ICC2 workflow
  1. Set place.coarse.seq_array_icg_aware to true before coarse placement.
  2. The tool places the array's clock-gating cell and the row it drives with awareness of this shared-driver structure, reducing the clock-net congestion it would otherwise cause.
Commands and options
Commands and options for Clock-gating cells associated with sequential arrays
Command / optionBehavior
place.coarse.seq_array_icg_awareapp option, default false — reduces clock-net congestion caused by sequential-array clock gating
Expected reports or evidence
Local congestion map around the sequential array before/after enabling the option.
Risks and tradeoffs
Specific to arrays with a single shared clock-gating driver per row; does not apply to arrays clocked with per-register gating.
Exit-checklist implication
Feeds the congestion checks on the exit gate for designs containing register-file-style sequential arrays.
Legalization

Legalization effects during placement

Purpose
Make coarse placement aware, ahead of time, of the legalization limits and restrictions a cell will face — for example a wide cell that cannot legally sit at a specific location because of a power-strap position — so fewer cells need large displacements during legalization itself.
Problem it solves
Coarse placement that ignores legalization restrictions can place a cell somewhere it can never legally be, forcing a large corrective move once legalization runs.
When to use it
Blocks reporting many cells with small-to-medium legalization displacements — that is the use case this feature targets.
Prerequisites

A baseline legalization RMS-displacement measurement to compare against.

ICC2 workflow
  1. Set place.coarse.enhanced_legalizer_driven_placement to true before coarse placement.
  2. Re-run legalization and compare RMS displacement values against the baseline to confirm the option is actually reducing displacement for this design.
Commands and options
Commands and options for Legalization effects during placement
Command / optionBehavior
place.coarse.enhanced_legalizer_driven_placementapp option, default false — makes coarse placement aware of legalization limits/restrictions
Expected reports or evidence
RMS displacement values reported during legalize_placement, compared before/after enabling the option — that comparison is the check.
Risks and tradeoffs
The benefit is scoped to designs with many small-to-medium displacements; it is not a fix for a design with a few very large, structural placement problems.
Exit-checklist implication
Directly supports the legalization-displacement checks on the exit gate.
Power

Dynamic-power QoR during placement

Purpose
Improve the dynamic-power QoR of a placement without degrading its timing QoR, by making the coarse placer aware of switching-activity-driven power alongside timing.
Problem it solves
Placement decisions made purely for timing or area can leave dynamic power unoptimized, even though placement-stage locality (net length, cell selection proximity) has real influence over switching power.
When to use it
Designs with a defined power budget or dynamic-power target, once switching activity has been annotated.
Prerequisites
  • Switching activity annotated on the design (see the Analyzing Power annotation workflow).
  • At least one scenario enabled for dynamic-power optimization via set_scenario_status -dynamic_power true.
ICC2 workflow
  1. Annotate switching activity on the design.
  2. Enable dynamic-power optimization on at least one scenario: set_scenario_status -dynamic_power true.
  3. Enable dynamic-power-driven placement for create_placement, refine_placement, place_opt, or clock_opt by setting place.coarse.enhanced_low_power_effort to none/low/medium/high (default low).
Commands and options
Commands and options for Dynamic-power QoR during placement
Command / optionBehavior
set_scenario_status -dynamic_power truecommand option — enables a scenario for dynamic-power optimization (prerequisite)
place.coarse.enhanced_low_power_effortapp option, default low — none/low/medium/high effort for dynamic-power-driven placement
Expected reports or evidence
Dynamic/switching power from report_power before/after, alongside a timing check that timing QoR held — this feature targets power without affecting timing QoR.
Risks and tradeoffs
Requires switching activity to already be annotated and a dynamic-power scenario enabled; without both prerequisites the effort-level setting alone has nothing to optimize against.
Exit-checklist implication
Feeds the power-QoR checks in Analyzing Power and the exit gate.
Congestion

Repeater spreading

Purpose
Reduce congestion caused by chains of repeater cells (buffers, inverters, or pipelined registers) clumping along the edges or corners of macros or blockages, by spreading them in an orthogonal direction.
Problem it solves
Repeater chains naturally tend to run along macro/blockage edges and corners; left unspread, that clumping is itself a congestion source.
When to use it
Blocks with macros or large blockages and repeater-chain-heavy paths running along their boundaries, especially where congestion maps show hot spots hugging those edges.
Prerequisites

None beyond the block having macros/blockages with repeater chains routed along them.

ICC2 workflow
  1. Set place.coarse.spread_repeater_paths to true before running create_placement, place_opt, or clock_opt.
  2. The tool spreads the repeater cells in an orthogonal direction to reduce the edge/corner clumping.
Commands and options
Commands and options for Repeater spreading
Command / optionBehavior
place.coarse.spread_repeater_pathsapp option, default false — spreads repeater chains along macro/blockage edges and corners to reduce congestion
Expected reports or evidence
Congestion map comparison specifically along macro/blockage boundaries, before/after enabling the option.
Risks and tradeoffs
Targets a specific congestion pattern (edge/corner repeater clumping); does not address congestion from other causes.
Exit-checklist implication
Feeds the congestion items on the placement-analysis sequence and exit gate.
Legalization

Limiting large cell displacement

Purpose
Reduce how far legalization has to move individual cells, using orientation flexibility and a many-small-moves strategy instead of moving any single cell a long distance.
Problem it solves
Legalization that only knows how to push one violating cell directly to its nearest legal site can end up moving that cell a long way, degrading the placement's original QoR-driven positions.
When to use it
Blocks where legalization is reporting large per-cell displacement, particularly designs where cell orientation is not already fixed by other constraints.
Prerequisites

None beyond having a legalization displacement problem to address.

ICC2 workflow
  1. Enable orientation optimization: place.legalize.optimize_orientations to true — lets the tool consider flipping cell orientations to reduce displacement.
  2. Enable stream placement: place.legalize.stream_place to true — moves many cells a small distance rather than one cell a large distance.
  3. Tune stream placement further with place.legalize.stream_effort and place.legalize.stream_effort_limit if needed.
Commands and options
Commands and options for Limiting large cell displacement
Command / optionBehavior
place.legalize.optimize_orientationsapp option, default false — allows orientation flips during legalization to reduce displacement
place.legalize.stream_placeapp option, default false — distributes displacement across many small cell moves
place.legalize.stream_effort / stream_effort_limitapp options — further control stream-placement effort
Expected reports or evidence
RMS/maximum displacement values from legalize_placement, before/after enabling these options.
Risks and tradeoffs
Stream placement trades a single large move for many small ones — still real movement, so it should be checked against timing-critical nets it might have nudged, not assumed free.
Exit-checklist implication
Directly supports the legalization-displacement checks on the exit gate.
Pin access

Pin-access-aware legalization

Purpose
Improve routability in high-pin-density areas by redistributing cells during legalization on advanced technology nodes.
Problem it solves
Advanced-node designs can legalize into cell arrangements that are legally valid but leave local pin density too high for the routing stage to access cleanly.
When to use it
Advanced technology nodes, particularly where pin-access DRC or routability problems have shown up after legalization in earlier runs.
Prerequisites

None beyond being on an advanced node where pin-access-driven redistribution is meaningful.

ICC2 workflow
  1. Set place.legalize.optimize_pin_access_using_cell_spacing to true before legalization.
  2. The tool redistributes cells in high-pin-density areas during legalization to improve routability.
Commands and options
Commands and options for Pin-access-aware legalization
Command / optionBehavior
place.legalize.optimize_pin_access_using_cell_spacingapp option, default false — enables pin-access-driven cell redistribution during legalization
Expected reports or evidence
Pin-access DRC counts, or a pin-density map, before/after enabling the option.
Risks and tradeoffs
Targeted at advanced technology nodes specifically; it is not generally applicable to all node classes.
Exit-checklist implication
Feeds the pin-access DRC checks on the exit gate.
Legalization

Concurrent legalization and detailed routing (CLDR)

Purpose
Improve DRC convergence on pin-access violations after route optimization (RO) or hierarchical route optimization (HRO), by integrating legalization more tightly with detailed routing.
Problem it solves
Pin-access DRC violations found after RO/HRO can be slow to converge when legalization and detailed routing are treated as fully separate passes.
When to use it
Designs seeing persistent pin-access DRC after RO/HRO that ordinary legalize-then-route iteration is not converging quickly.
Prerequisites

A design that has already been through, or is about to go through, RO or HRO.

ICC2 workflow
  1. Set place.legalize.enable_cldr to true:
    set_app_options -name place.legalize.enable_cldr -value true
  2. Run the normal RO/HRO flow; CLDR integration improves DRC convergence on pin-access issues as part of it.
Commands and options
Commands and options for Concurrent legalization and detailed routing (CLDR)
Command / optionBehavior
place.legalize.enable_cldrapp option, default false — enables Concurrent Legalize and Detail Route integration for pin-access DRC convergence
Expected reports or evidence
Pin-access DRC violation count after RO/HRO, before/after enabling CLDR.
Risks and tradeoffs
Named specifically as a DRC convergence aid after RO or HRO — not a general-purpose legalization mode for earlier flow stages.
Exit-checklist implication
Feeds the DRC-convergence and pin-access items on the exit gate.
Power/ground

Advanced power-ground checks relevant to placement

Purpose
Enable stricter physical DRC checking between cells and prerouted power/ground (PG) net shapes on advanced technology nodes, including checks across multiple neighboring cells at once.
Problem it solves
At 12nm, 7nm, and smaller nodes, cell-to-prerouted-PG-net interactions can create DRC violations that simpler, single-cell-at-a-time checking misses, especially where several cells and PG shapes interact near a boundary.
When to use it
Advanced technology nodes (12nm and below), especially where PG-related DRC has appeared after legalization on prior runs.
Prerequisites

None beyond being on a node where this checking is relevant; multi-cell checks build on the basic advanced PG check being enabled first.

ICC2 workflow
  1. Enable the base check: place.legalize.enable_advanced_prerouted_net_check to true.
  2. Optionally tune the accessibility checks with place.legalize.advanced_layer_access_check and place.legalize.advanced_libpin_access_check (default behavior suits most designs).
  3. For simultaneous multi-cell PG checking, also set place.legalize.enable_multi_cell_pnet_checks to true.
  4. For multi-cell pin-access and track-capacity checks specifically at the last route_opt run or after route_auto, additionally enable place.legalize.enable_multi_cell_access_check and, if needed, place.legalize.enable_multi_cell_track_capacity_check (the latter requires the former).
Commands and options
Commands and options for Advanced power-ground checks relevant to placement
Command / optionBehavior
place.legalize.enable_advanced_prerouted_net_checkapp option, default false — advanced physical DRC between cells and prerouted PG nets (advanced nodes)
place.legalize.enable_multi_cell_pnet_checksapp option, default false — simultaneous DRC checks across multiple cells and PG net shapes
place.legalize.enable_multi_cell_access_checkapp option, default false — pin-access impact from neighboring cells/prerouted PG shapes
place.legalize.enable_multi_cell_track_capacity_checkapp option, default false — track-capacity sufficiency check; requires enable_multi_cell_access_check
Expected reports or evidence
PG-related DRC violation counts from legality checking (check_legality) before/after enabling these checks.
Risks and tradeoffs
Layered options with dependencies (track-capacity check requires the access check); enabling one without the other it depends on has no effect.
Exit-checklist implication
Feeds PG-DRC and legalization-cleanliness checks on the exit gate for advanced-node designs.
Legalization

Advanced legalization algorithms

Purpose
Use 2D rule checking and cell-interaction-aware legalization algorithms, which reduce legalization runtime and support pin-access-optimizing strategies not available in the standard legalizer.
Problem it solves
Standard legalization can be slower and less able to account for cell-to-cell pin-access interaction than a 2D-rule-aware algorithm on advanced nodes.
When to use it
Advanced-node blocks where legalization runtime or pin-access-aware legalization quality is a concern; a prerequisite for variant-aware legalization's fullest behavior.
Prerequisites

Awareness that the legalize_placement command's -cells option is not supported once the advanced legalizer is enabled.

ICC2 workflow
  1. Enable the algorithm: place.legalize.enable_advanced_legalizer to true.
  2. Optionally specify undetected additional rules with place.legalize.enable_advanced_legalizer_rules.
  3. Choose pin-access optimization strategy with place.legalize.optimize_pin_access_strategies: horizontal_align, avoid_high_pin_density, or both together.
  4. For runtime, optionally enable multithreading: place.legalize.enable_threaded_advanced_legalizer to true, then configure multithreading as described for the tool generally.
  5. For multithreaded legality checking specifically, enable the advanced legalizer, configure multithreading, then run check_legality.
Commands and options
Commands and options for Advanced legalization algorithms
Command / optionBehavior
place.legalize.enable_advanced_legalizerapp option, default false — enables 2D-rule-aware advanced legalization algorithms
place.legalize.optimize_pin_access_strategiesapp option — horizontal_align and/or avoid_high_pin_density pin-access optimization strategies
place.legalize.enable_threaded_advanced_legalizerapp option, default false — multithreaded advanced legalization
check_legalitycommand — legality checking, can run multithreaded once the advanced legalizer and multithreading are configured
Expected reports or evidence
Legalization runtime comparison, and check_legality output, before/after enabling the advanced legalizer.
Risks and tradeoffs
The -cells option of legalize_placement stops working once the advanced legalizer is enabled — a targeted, cell-list legalization workflow built on that option needs to be re-checked.
Exit-checklist implication
Feeds the legalization-cleanliness and runtime items on the exit gate for advanced-node designs.
Legalization

Variant-aware legalization

Purpose
Legalize a cell by swapping it for a functionally equivalent variant with different pin placement or pin color, instead of physically moving it, when a library provides such variants.
Problem it solves
A library can offer functionally identical cells whose pins sit in different locations or on different mask colors; ordinary legalization has no way to use that equivalence and can only move the cell.
When to use it
Libraries that are variant-ready (define physical_variant_cells in their Liberty source) or can be made variant-ready via the Library Manager tool.
Prerequisites
  • A variant-ready compiled library, or equivalent cell groups defined via create_cell_groups in the Library Manager tool (lm_shell).
  • report_cell_groups can confirm equivalent cell groups exist in either the Library Manager or IC Compiler II tool.
ICC2 workflow
  1. If the logic library is not already variant-ready, define equivalent cell groups in the Library Manager tool: create_workspace, create_cell_group per group, check_workspace, commit_workspace.
  2. Enable variant-aware legalization: place.legalize.enable_variant_aware to true.
  3. For pin-track/pin-color alignment specifically, also enable place.legalize.enable_prerouted_net_check and place.legalize.enable_pin_color_alignment_check, and specify the layers to align via place.legalize.pin_color_alignment_layers.
Commands and options
Commands and options for Variant-aware legalization
Command / optionBehavior
place.legalize.enable_variant_awareapp option, default false — enables variant-aware legalization
create_cell_group (lm_shell)command — defines equivalent cell groups when the library is not already variant-ready
place.legalize.enable_pin_color_alignment_checkapp option — pin-color-aware alignment during variant-aware legalization
place.legalize.pin_color_alignment_layersapp option — layers to align for pin-color checking
Expected reports or evidence
report_cell_groups confirming equivalent cell groups are recognized; legalization DRC-violation count before/after, showing violations fixed by variant substitution instead of displacement.
Risks and tradeoffs
If a violating cell has no variant, the tool falls back to moving it — variant-aware legalization reduces displacement, it does not eliminate the need for legalization movement entirely.
Exit-checklist implication
Supports legalization-displacement and DRC-cleanliness checks on the exit gate for libraries that offer variants.
Preroute

Placement-stage parasitic estimation

Purpose
Improve correlation between preroute (placement/optimization-stage) timing and the eventual postroute result, by using more realistic per-net parasitic estimation during place_opt/clock_opt instead of a purely model-based estimate.
Problem it solves
A purely model-based preroute parasitic estimate can diverge meaningfully from what routing eventually produces, especially where per-unit resistance varies across routing layers or on advanced nodes.
When to use it
Designs where preroute-to-postroute timing correlation has historically been poor, or that use advanced technology nodes below 16nm (route-driven estimation is enabled there by default).
Prerequisites

None beyond running place_opt/clock_opt normally; global routing is performed internally as part of these features.

ICC2 workflow
  1. Global-route-layer-based (GRLB) estimation: set opt.common.use_route_aware_estimation to auto (enabled only where per-layer resistance varies) or true (always enabled). Remove it with remove_route_aware_estimation before routing.
  2. Route-driven estimation (RDE): set opt.common.enable_rde to true (default-on below 16nm already). When enabled, RDE runs during the final_opt stage and overrides/ignores the GRLB setting; honors the -early_cap_scale/-late_cap_scale/-early_res_scale/-late_res_scale options of set_extraction_options.
  3. If RDE is enabled, keep it enabled through all subsequent preroute optimization steps in the flow for consistency.
Commands and options
Commands and options for Placement-stage parasitic estimation
Command / optionBehavior
opt.common.use_route_aware_estimationapp option, default false — auto/true enables GRLB per-unit-resistance-aware RC estimation
remove_route_aware_estimationcommand — removes global-route-based estimation before routing
opt.common.enable_rdeapp option, default true below 16nm — enables route-driven parasitic estimation during final_opt
Expected reports or evidence
Preroute-vs-postroute timing correlation (slack delta on the same paths) before/after enabling GRLB or RDE.
Risks and tradeoffs
RDE silently overrides/ignores the GRLB setting when both are enabled — do not assume both are contributing independently; and RDE should be kept on through the rest of the preroute flow once enabled, not toggled per-stage.
Exit-checklist implication
Supports the timing-correlation confidence behind the exit gate's timing checks, though it is a correlation aid, not a checklist item itself.
Legalization

Area recovery in high-utilization designs

Purpose
Let a design that cannot legalize because of local high-utilization areas recover area in those regions during place_opt/clock_opt, at a documented timing-QoR cost.
Problem it solves
A region with utilization too high to legalize needs area freed up before legalization can succeed there, but ordinary optimization has no built-in mechanism scoped specifically to high-utilization small regions.
When to use it
Designs that are failing to legalize specifically because of small regions of high utilization — not a general-purpose area-reduction switch.
Prerequisites

A confirmed legalization failure attributable to a high-utilization region, so the timing-QoR tradeoff is justified.

ICC2 workflow
  1. Set opt.common.small_region_area_recovery to true.
  2. Run place_opt or clock_opt; area recovery happens during these commands in the high-utilization regions.
  3. Re-check timing QoR afterward — this feature carries a timing-QoR cost.
Commands and options
Commands and options for Area recovery in high-utilization designs
Command / optionBehavior
opt.common.small_region_area_recoveryapp option, default false — performs area recovery in high-utilization regions during place_opt/clock_opt
Expected reports or evidence
Legalization success/failure in the previously high-utilization region, plus a timing-QoR comparison (worst slack, TNS) before/after, since a degradation is expected.
Risks and tradeoffs
This slightly degrades timing QoR — use it as a targeted fix for a legalization blocker, not as a routine setting.
Exit-checklist implication
A design that needed this option to legalize should have that fact and its timing-QoR impact recorded before sign-off, not silently left enabled.
QoR

Advanced logic restructuring

Purpose
Restructure logic during the final_opto stage of place_opt/clock_opt, targeted at whichever combination of area, timing, and power QoR the design most needs to improve.
Problem it solves
Standard optimization may leave area, timing, or power QoR short of target even after placement is legal and DRC-clean; targeted restructuring at the final optimization stage can recover some of that gap.
When to use it
Designs where final_opto-stage QoR (area, timing, and/or power) needs a further push, and the specific metric(s) to prioritize are known.
Prerequisites

A clear sense of which QoR metric(s) matter most for this run, since the mode setting is a direct tradeoff choice, not a free win across all three.

ICC2 workflow
  1. Set opt.common.advanced_logic_restructuring_mode to the mode matching your priority: none (default, off), area, timing, power, area_timing, timing_power, area_power, or area_timing_power.
  2. Run place_opt or clock_opt; restructuring applies during the final_opto stage.
Commands and options
Commands and options for Advanced logic restructuring
Command / optionBehavior
opt.common.advanced_logic_restructuring_modeapp option, default none — area/timing/power/area_timing/timing_power/area_power/area_timing_power restructuring targets for final_opto
Expected reports or evidence
report_qor comparison (area, worst slack/TNS, power) before/after, for the specific metric(s) the chosen mode targets.
Risks and tradeoffs
A mode that combines multiple targets (for example area_timing_power) spreads restructuring effort across all three rather than maximizing any one — choose the narrowest mode that matches the actual priority.
Exit-checklist implication
Feeds the QoR-comparison workflow in Comparing QoR Data; a mode other than the default should be recorded as a deliberate QoR-tradeoff choice.
Multibit / low power

Multibit retention registers

Purpose
Extend multibit register banking to retention registers used in power-gated (multivoltage/UPF) designs, combining single-bit retention registers into a multibit retention register where the library and retention strategy support it.
Problem it solves
Retention registers have retention-specific requirements (a shared retention strategy, matching retention-pin drivers, a matching multibit retention library cell) that ordinary multibit banking does not check for, so a naive banking pass can either miss legitimate retention-register banking opportunities or bank them incorrectly.
When to use it
Multivoltage/UPF designs using single-bit retention registers where the library offers a matching multibit retention cell.
Prerequisites
  • The single-bit retention registers share the same retention strategy and the same retention-pin driver.
  • The cell library has a matching multibit retention register.
  • The multibit retention library cell is registered for the retention strategy via map_retention_cell -lib_cells.
ICC2 workflow
  1. Confirm the four banking prerequisites above are met for the candidate registers.
  2. Identify multibit retention registers with identify_multibit -register (not -mv_cell, for this specific case).
  3. Bank as part of the normal multibit banking flow (see Performing Multibit Register Optimization).
  4. To split a previously banked multibit retention register back to single-bit cells, the library must have matching single-bit retention registers also registered via map_retention_cell -lib_cells.
Commands and options
Commands and options for Multibit retention registers
Command / optionBehavior
identify_multibit -registercommand option — identifies multibit retention registers specifically (use -register, not -mv_cell, for this case)
map_retention_cell -lib_cellscommand — registers a library cell (single-bit or multibit) as usable for a given retention strategy
Expected reports or evidence
Post-banking netlist check confirming retention registers banked into the expected multibit retention cell, and that the retention strategy/UPF checks still pass.
Risks and tradeoffs
Skipping the -register option (using -mv_cell instead) is the wrong option for this case — check the exact option used in any banking script that touches retention registers.
Exit-checklist implication
Extends the multibit-banking sequencing already on the exit gate; a multivoltage design with retention registers should confirm this path explicitly rather than assuming ordinary multibit banking covered them.
Failure symptoms and triage

When something is wrong, start here

Common failure symptoms during Placement and Optimization
SymptomLikely causeWhere to look first
A congestion hot spot persists after a full place_opt passCongestion-driven placement was never enabled, or its effort level was too low for this design-congestion and -congestion_effort on create_placement, or a targeted refine_placement -congestion_effort high pass
Placement QoR shows unexpectedly long total wire lengthTiming-driven placement was never enabled, so the placer optimized for area and legality alone-timing_driven or -buffering_aware_timing_driven on create_placement
IR-drop-aware placement appears to have done nothingThe application option was set after final_place already ran, so the rerun step was skipped or misorderedSequence: place_opt -to final_place, then set the option, then place_opt -from final_place
Multibit banking did not reduce the clock tree's buffer count as expectedRegisters driven by equivalent, but not identical, clock-gating cells were not considered for bankingmultibit.banking.across_equivalent_icg application option
A cell near a macro will not move during refine_placementThe cell's placement status is fixed or locked, intentionally or by accidentget_attribute for the cell's status, then set_placement_status if the lock was unintended
A net reports as unbufferable during optimizationNo suitable supply net or library cell exists in the net's voltage area, or an ideal-network/don't-touch setting blocks itcheck_bufferability -verbose for the specific reason
A design comes out of place_opt with violations that do not improve on a second passThe violations are not fixable by further optimization at all, given current constraints and libraryanalyze_design_violations, categorized by violation type
Stage completion checklist

The Placement and Optimization exit gate

This is the same checklist a careful placement lead would use before approving a handoff to Clock Tree Synthesis. Every item names its evidence; "looks fine" is not evidence.

  • Every standard cell is placed and legalized, with no unresolved placement violations.Evidence: report_placement output reviewed line by line.
  • No unexplained placement or physical-hierarchy violations remain.Evidence: report_placement violation counts, each either zero or explained.
  • No unresolved hard-macro overlap.Evidence: macro-overlap section of report_placement reviewed.
  • Thin channels and swimming-pool area reviewed.Evidence: report_placement's physical-hierarchy detail, or the GUI floorplan view, checked for both.
  • Achieved utilization reviewed against the floorplan-stage baseline, with any change explained.Evidence: report_utilization -verbose, compared against the floorplan-stage figure (not the pre-placement 0.0% sanity-check reading), not assumed unchanged.
  • Congestion, cell-density, and pin-density maps reviewed in the GUI.Evidence: each map checked as an explicit pass/fail, not skipped.
  • Fixed, locked, and legalize_only cells match documented intent.Evidence: a placement-status query matching a written list of intended fixed/locked cells.
  • Clock-gating merge behavior verified.Evidence: a clock-gating cell count consistent with expectations for this design.
  • High-fanout buffer-tree behavior reviewed.Evidence: create_buffer_trees output or automatic high-fanout handling checked, then legalize_placement confirmed run afterward.
  • Multibit decisions verified, with reoptimization and reports run after any banking.Evidence: report_multibit output, plus a place_opt (or equivalent) pass and reports captured after -apply, not before it.
  • Tie-cell state checked.Evidence: add_tie_cells run with no unexpected new insertions.
  • Multivoltage and bufferability findings resolved or tracked.Evidence: check_bufferability output, each finding resolved or explicitly tracked.
  • analyze_design_violations findings resolved, waived with a documented rationale, or assigned to an owner.Evidence: each finding in the categorized list has one of those three dispositions.
  • Timing explicitly updated when a fresh reading was needed.Evidence: update_timing run before the readings being reported on.
  • Worst timing paths reviewed.Evidence: report_timing output for the worst setup and hold paths.
  • report_qor reviewed, not just the single worst path.Evidence: report_qor -summary output.
  • report_constraints reviewed for logical DRC violations.Evidence: report_constraints output, each violation reviewed.
  • Power report reviewed in the intended scenario and leakage mode.Evidence: report_power output, with mode/scenario/voltage/temperature confirmed intentional.
  • Power-group and clock-network power interpretation reviewed.Evidence: power-group breakdown checked, and cell-based vs. pin-based clock-network power setting confirmed before drawing conclusions.
  • QoR comparison captured against a named baseline.Evidence: write_qor_data/compare_qor_data output with the pre-placement run set as baseline.
  • No option experiment accepted into the checkpoint without before/after evidence.Evidence: a compare_qor_data comparison reviewed before save_lib for any nondefault option tried.
  • Final checkpoint, logs, command history, reports, and QoR data are reproducible.Evidence: a second engineer can open_lib your saved checkpoint and reproduce the same reports.
  • A CTS handoff note records known limitations or intentional exceptions.Evidence: a short written note naming anything left open on purpose, so CTS does not rediscover it blind.

↑ Back to contents

Mini lab

Lab: pulling Nimbus‑8's DDR PHY controller cluster together with magnet placement

Nimbus‑8's DDR PHY hard macro drives a small cluster of controller and calibration logic — standard cells that, left to ordinary placement, can end up scattered across the core instead of hugging the macro whose timing they are most sensitive to. This lab uses magnet placement to pull that cluster close to the macro, before the main placement pass runs.

Setup

  • Nimbus‑8's design library, reopened from this chapter's own checkpoint before Step 3 (that is, after the floorplan is in place but before create_placement has run).
  • Confirmation that the DDR PHY macro (nimbus8_ddrphy) is placed and fixed, since a magnet object must itself be fixed for the pull to make sense.

Tasks

  1. Preview which cells would move, without moving anything yet, using magnet_placement nimbus8_ddrphy -only_report_magnet_cells.
  2. Review the previewed list: does it include cells you did not expect, or exclude ones you did? If a cell you expected is missing, consider whether it is actually on a contiguous data path from the macro.
  3. Run the real pull, limited to three logic levels from the macro and stopping at any sequential cell boundary: magnet_placement nimbus8_ddrphy -logical_levels 3 -stop_by_sequential_cells -mark_fixed.
  4. Confirm the pulled cells are now marked fixed, using a placement-status query, so the main placement pass in Step 3 does not scatter them again.
  5. Proceed with Step 3 (create_placement -timing_driven -congestion) and compare the DDR PHY cluster's final wire length against what a version of this worked example without the magnet-placement step would have produced.

Expected observations

The pulled cluster should show noticeably shorter local wire length in report_placement's per-net detail than an ungoverned placement would produce, but the pull only ever follows a genuinely contiguous data path — a controller cell connected to the macro only through an unrelated shared bus does not move, even if it seems like it should.

Cleanup

If continuing directly into the worked example above, do not repeat Step 3's create_placement call with different options than this lab already used — re-running coarse placement discards the magnet-placement pull. Otherwise, close the library with close_lib once the saved checkpoint reopens cleanly with open_lib in a fresh session.

Interview questions

45 questions worth being able to answer cold

Beginner questions

Beginner

Q1. Name the five stages of place_opt, in order.

initial_place, initial_drc, initial_opto, final_place, final_opto.

What is happening
Each stage has a distinct job: coarse placement, DRC/buffering fixup, first optimization, incremental placement plus legalization, and a final optimization pass.
The trap
Treating place_opt as one atomic action rather than five separately re-runnable stages.
What is being tested
Whether the stage names and their order are automatic, not looked up under pressure.
Beginner

Q2. What is the difference between coarse placement and legalization?

What is happening
Coarse placement gives every cell an approximate, legal-ish location, fast. Legalization moves cells onto real, non-overlapping site-grid positions without changing the netlist.
The trap
Assuming a coarsely placed design is already legal simply because it looks placed in the layout view.
What is being tested
Precision about which command actually guarantees legality, and which only approximates it.
Beginner

Q3. What do -from and -to control on place_opt?

What is happening
They restrict the command to a contiguous subset of its five stages, starting at -from (default initial_place) and ending at -to (default final_opto).
The trap
Specifying a -from stage that comes after the -to stage in the fixed order, which is not allowed.
What is being tested
Whether the reader understands staging as a tool for re-entering the flow, not just skipping work.
Beginner

Q4. What does -buffering_aware_timing_driven do that plain -timing_driven does not?

What is happening
It uses an approximate timing model that estimates the effect of buffers that will be added later on long and high-fanout nets, giving a better starting point for later timing optimization.
The trap
Assuming it actually inserts buffers during coarse placement — it does not; the netlist is unchanged.
What is being tested
Reading an option's description precisely instead of assuming from its name.
Beginner

Q5. Why must merge_clock_gates be run before create_placement, if you are not using place_opt?

What is happening
place_opt merges clock-gating cells automatically at the start of initial_place; calling create_placement directly skips that automatic step entirely.
The trap
Assuming any placement command merges clock gates, when only place_opt's internal flow does so by default.
What is being tested
Awareness of what changes when standalone commands replace the combined flow.
Beginner

Q6. What is a trial clock tree, and why would you enable one during placement?

What is happening
A temporary clock tree built during place_opt (via place_opt.flow.trial_clock_tree) so the tool can use propagated, rather than ideal, clocks for placement and optimization; CTS later removes it and builds the real tree.
The trap
Assuming the trial clock tree survives into Clock Tree Synthesis — it does not; it is discarded.
What is being tested
The distinction between an internal optimization aid and a persistent design artifact.
Beginner

Q7. What is multibit register banking, in one sentence?

What is happening
Combining several single-bit registers that share identical timing constraints into one equivalent multibit register cell, reducing area and clock tree cost.
The trap
Assuming banking is free-form logic restructuring rather than a constraint-preserving merge.
What is being tested
Whether the reader can state what banking actually preserves, not just what it saves.
Beginner

Q8. What does magnet placement actually move?

What is happening
Only the standard cells forming a genuinely contiguous data path from the magnet object — a fixed macro, macro pin, or I/O port.
The trap
Assuming every cell "logically related" to the magnet moves, regardless of whether the path between them is actually contiguous.
What is being tested
Precision about connectivity versus intuition when predicting a command's effect.
Beginner

Q9. Name three items on the placement setup gate that would stop placement from proceeding at all, versus one that is an optional strategy choice.

What is happening
Entry gates: an open reproducible checkpoint, a legal floorplan with real site rows, and loaded timing constraints — none of these are optional. A strategy choice example: whether to enable congestion-driven placement, or which leakage mode to use for power reporting.
The trap
Treating every setup-table row as equally mandatory, or conversely treating a true entry gate as something to decide later.
What is being tested
Whether the reader can distinguish a hard prerequisite from a deliberate decision.
Beginner

Q10. What does add_tie_cells do that optimization's automatic tie-cell insertion might not already cover?

What is happening
place_opt and clock_opt insert tie cells automatically only where their own optimization creates a new constant-driven pin. add_tie_cells run explicitly afterward catches any constant pin left undriven for any other reason.
The trap
Assuming automatic insertion during optimization means an explicit tie-cell check is redundant.
What is being tested
Whether the reader treats the exit-gate tie-cell check as real verification, not a formality.

Intermediate questions

Intermediate

Q11. Why does the ICC2 User Guide recommend stopping place_opt at final_place before enabling IR-drop-aware placement?

What is happening
The documented procedure needs a legalized placement to analyze for voltage drop, then rerunning from final_place lets the tool use those voltage-drop values on the next pass — running straight through to final_opto first would skip the analysis-and-rerun window entirely.
The trap
Enabling place.coarse.ir_drop_aware after a full, unstaged place_opt run and expecting it to retroactively apply.
What is being tested
Whether the reader understands staging as a prerequisite for this specific feature, not an optional convenience.
Intermediate

Q12. What does concurrent clock and data (CCD) optimization actually adjust?

What is happening
Clock arrival times at registers — useful skew — taking advantage of positive slack on one path to help a path that is short on it, computed together with datapath optimization.
The trap
Assuming CCD creates timing margin from nothing, rather than redistributing existing slack between paths.
What is being tested
Whether "useful skew" is understood as a trade, not a free improvement.
Intermediate

Q13. What two things does the Synopsys physical guidance (SPG) flow require, beyond a DEF file, to correlate well with Design Compiler?

What is happening
The same logical constraints (timing, UPF) in both tools, converted into ICC2's mode/corner/scenario format; and a separate Tcl file for physical constraints DEF does not capture — voltage areas, layer constraints, special route guides, and special blockages.
The trap
Treating the DEF file alone as a complete transfer of "the constraints" from Design Compiler.
What is being tested
Whether the reader knows DEF carries geometry, not full design intent.
Intermediate

Q14. What is the difference between identify_multibit -apply and identify_multibit -output_file?

What is happening
-apply modifies the netlist directly. -output_file instead writes a script of create_multibit commands you can review, edit, and source in yourself.
The trap
Assuming -output_file alone changes the design — it only generates the script; nothing happens until it is sourced.
What is being tested
Whether the reader distinguishes "identified" from "applied," the same discipline this guide applies to constraints throughout.
Intermediate

Q15. Why can split_multibit not be used on every multibit cell in a design?

What is happening
It only splits cells that were themselves created by create_multibit or identify_multibit — a multibit cell that existed in the original netlist is not eligible.
The trap
Assuming any multibit cell instance can be split on demand, regardless of its origin.
What is being tested
Tracking a cell's provenance, not just its current type, before assuming an operation applies to it.
Intermediate

Q16. What does refine_placement -coordinates risk that whole-design refinement does not?

What is happening
Restricting incremental congestion optimization to one bounded region, which the reference documentation itself warns can cause timing or congestion degradation if the region is not properly chosen.
The trap
Assuming a smaller, targeted region is always safer than optimizing the whole design.
What is being tested
Whether the reader has internalized a documented caveat, not just the option's existence.
Intermediate

Q17. What is the practical difference between a cell with placement status fixed and one with status locked?

What is happening
A fixed cell cannot be moved by the tool but can still be sized by optimization, and can be moved manually. A locked cell cannot be moved either manually or by the tool.
The trap
Using fixed when the intent is a full lock, and being surprised when the tool resizes the cell anyway.
What is being tested
Precision about what each status actually permits, not just that both "protect" a cell.
Intermediate

Q18. Why does the tool prefer single-rail buffers over dual-rail buffers during multivoltage optimization?

What is happening
Single-rail buffers save power and area and improve routability compared to dual-rail buffers, when a legal single-rail choice exists that does not introduce a new multivoltage violation.
The trap
Assuming dual-rail buffering is the tool's default preference because it seems "safer" for a multivoltage net.
What is being tested
Understanding cost-driven default behavior, not just that multivoltage buffering exists.
Intermediate

Q19. You run identify_multibit -apply after place_opt has already reached final_opto. What must happen next, and from which stage?

What is happening
-apply changes the netlist by replacing single-bit registers with banked cells. The design must be re-legalized and reoptimized, which means re-entering place_opt from initial_drc (or earlier), not simply re-running reports on the now-stale placement.
The trap
Checkpointing or reporting on the design immediately after -apply, treating banking as a reporting-only operation.
What is being tested
The corrected sequencing rule: banking always needs a reoptimization pass afterward.
Intermediate

Q20. report_utilization shows a different number after this chapter's worked example than the floorplan-stage figure. Is that automatically a problem?

What is happening
Not automatically. Utilization can legitimately move if a netlist-changing operation like multibit banking ran — banking can reduce cell area within the same fixed core. The requirement is that the change is measured against the baseline and explained, not that it stays constant.
The trap
Either assuming utilization must be invariant, or assuming any movement is fine without checking why.
What is being tested
The corrected utilization claim from this chapter's own worked example.
Intermediate

Q21. What is the documented default leakage-power calculation method for report_power, and what does it fall back to if the needed characterization data is missing?

What is happening
The default is state — a weighted sum based on state-dependent leakage characterization and static probability. If that characterization data is unavailable, the calculation falls back to the unconditional method.
The trap
Assuming a power report used the average or unconditional method without checking power.leakage_mode first.
What is being tested
Precise recall of a specific documented default, not just that leakage modes exist.
Intermediate

Q22. Two power reports disagree on clock-network power: report_power and report_clock_qor -type power. What is the likely explanation before assuming a tool bug?

What is happening
report_power's clock-network group is cell-based by default (the whole cell's power counts if any output is on the clock network); report_clock_qor -type power is always pin-based. The two are answering slightly different questions unless power.clock_network is set to pin_based to match.
The trap
Escalating a reporting-basis mismatch as a data-correctness bug.
What is being tested
Whether the reader checks reporting basis before comparing two power numbers.

Advanced questions

Advanced

Q23. A reviewer asks why your design's clock-gating cell count barely changed after place_opt. What do you check first?

What is happening
Whether merge_clock_gates was run before place_opt in this session — if it was, place_opt would not merge again, and a low count going in explains a low count coming out.
The trap
Assuming place_opt failed to merge, when in fact it correctly skipped a redundant merge.
What is being tested
Checking command history and sequencing before assuming a tool defect.
Tcl snippet
icc2_shell> merge_clock_gates
Advanced

Q24. Placement QoR looks fine, but routing later reports congestion in a region placement's own congestion map showed as clean. What do you investigate?

What is happening
Whether the congestion-driven placement effort used during place_opt was too low to catch a routing-resource-specific hot spot that only becomes visible at actual global-route detail, not the coarser congestion estimate placement itself uses.
The trap
Treating placement's own congestion map as a routing-stage-accurate prediction rather than an estimate.
What is being tested
Understanding that placement-stage congestion estimation and routing-stage congestion are related but not identical measurements.
Advanced

Q25. After banking a group of registers with identify_multibit -apply, one previously-passing path now fails setup. What is your first diagnostic step?

What is happening
Check whether the failing path now passes through a bit of the multibit bank with a slack threshold that let a too-tight register be included; consider split_multibit on that specific bank rather than re-running banking with a stricter global threshold.
The trap
Re-running identify_multibit with different global settings before checking whether the one specific bank is the actual cause.
What is being tested
Targeted diagnosis of a specific regression, not a broad, unfocused re-run.
Advanced

Q26. A net that optimization flags as unbufferable turns out to be in a switched voltage area. What do you check?

What is happening
Whether a legal buffering supply net actually exists in that specific voltage area — check_bufferability -voltage_area will confirm or explain the gap directly, rather than guessing from the net's logical connectivity alone.
The trap
Assuming any buffer cell in the library is usable, ignoring the voltage-area-specific supply requirement.
What is being tested
Connecting a multivoltage constraint to a concrete, checkable optimization failure.
Advanced

Q27. Your team wants to reuse a Design Compiler Graphical placement to save runtime on a large block. What two file types do you need from DC, and what is still missing after reading them in?

What is happening
A Verilog netlist and a DEF file (read with read_def -add_def_only_objects {cells} -convert_sites); still missing are physical constraints DEF does not capture — voltage areas, layer constraints, special route guides, and special blockages — which must be applied from a separate Tcl file.
The trap
Assuming the DEF file alone is a complete physical constraint transfer.
What is being tested
Precise recall of what physical guidance actually transfers, and what it does not.
Advanced

Q28. Magnet placement's preview shows fewer cells than you expected pulled toward a macro. What is the most likely explanation?

What is happening
The excluded cells are not on a contiguous data path from the magnet — a common case is cells reached only through a buffer or inverter, which can be excluded from the logic-level count with -exclude_buffers, or through a sequential-cell boundary the command stops at by default.
The trap
Assuming the command is broken rather than checking connectivity and the -logical_levels/sequential-cell-boundary settings used.
What is being tested
Diagnosing an option-driven scope limitation instead of assuming a tool defect.
Advanced

Q29. Two runs' report_power outputs show a large leakage-power delta. Before concluding one run's placement is worse, what do you check first?

What is happening
Whether both runs used the same power.leakage_mode, the same active scenario, and the same voltage/temperature corner. A mode or scenario mismatch produces a large, meaningless delta that has nothing to do with placement quality.
The trap
Treating a report-configuration mismatch as design evidence.
What is being tested
The power-comparison trap named explicitly in this chapter's Analyzing Power section.
Advanced

Q30. In a three-run QoR-data comparison, Run 2 has the best worst-slack number of all three. Is Run 2 automatically the run to carry forward?

What is happening
Not necessarily. A single improved metric does not make a run better overall — it may have worsened congestion, power, or total negative slack, or cost significantly more runtime. The QORsum comparison across all metrics, against a named baseline, is what a real decision requires.
The trap
Picking a "winning" run from one headline number without opening the full comparison.
What is being tested
The core lesson of the Comparing QoR Data section.
Advanced

Q31. Figure 7 shows a path with 620 ps of data path delay against a 1150 ps clock period, -60 ps of slack before CCD, and +25 ps after delaying REG_B's clock 85 ps. If the same path instead started at -110 ps of slack, how much skew would CCD need to borrow to reach the same +25 ps, and what does that number tell you about the neighboring path lending it?

What is happening
135 ps (-110 + 135 = +25). CCD's borrowed skew scales directly with how far underwater the path starts — a path with a bigger deficit demands more skew, which means a bigger bite taken out of whatever neighboring path is lending its slack. The lending path's own margin thins by exactly the amount borrowed, same as in the chapter's 85 ps example.
The trap
Treating "how much skew is needed" as independent of "how much it costs somewhere else" — they are the same number.
What is being tested
Whether the reader can do the arithmetic Figure 7 sets up, not just recite "useful skew borrows time."
Advanced

Q32. Why does place.coarse.icg_auto_bound specifically depend on merge_clock_gates having already run, and what goes wrong if you enable it first?

What is happening
Automatic group bounds are built around the integrated clock-gating cells and the sequential cells each one drives, as that structure exists at the moment placement starts. If clock-gating merge has not happened yet, the bounds are built around the pre-merge structure — wrong, or simply not there to bound.
The trap
Treating every advanced placement control as independent of ordering, when several (this one included) inherit the same merge-first dependency as create_placement itself.
What is being tested
Recognizing a repeated ordering pattern across different commands, not memorizing it once per command.
Advanced

Q33. A script that has reliably called legalize_placement -cells to fix a narrow ECO for months suddenly legalizes the entire design instead of the named cells. Nothing in the script changed. What is the most likely cause?

What is happening
place.legalize.enable_advanced_legalizer was turned on somewhere upstream in the flow (project defaults, a new script, a colleague's change) — -cells is not supported once the advanced legalizer is enabled, and the call is silently ignored rather than erroring.
The trap
Debugging the ECO script itself when the actual change happened in a setting the script never touches.
What is being tested
Whether the reader looks for an environment/option change before assuming a script regression.
Advanced

Q34. A design enables place.coarse.wide_cell_use_model but has almost no wide standard cells. What effect should you actually expect, and why?

What is happening
Essentially none. The option minimizes the density of wide cells specifically, so legalization does not have to displace them far — a design with few or no wide cells has nothing for the feature to act on, so enabling it costs a little setup attention and buys nothing measurable.
The trap
Assuming every advanced control is broadly beneficial rather than scoped to a specific population of cells or a specific symptom.
What is being tested
Matching a feature's actual scope to a design's actual population before expecting it to help.
Advanced

Q35. A congestion hot spot runs along the edge of a large SRAM macro, traced to a chain of clock buffers clumping there. Between place.coarse.spread_repeater_paths and place.coarse.ndr_area_aware, which is the right first lever, and why not the other?

What is happening
spread_repeater_paths — it targets exactly this pattern, repeater chains clumping along a macro or blockage edge. ndr_area_aware addresses a different cause: congestion from nondefault-rule clock-net routing needing more space than default-rule routing. Both are clock-related congestion fixes, but they are scoped to different root causes.
The trap
Reaching for any "clock congestion" option once one is found, instead of matching the specific symptom (edge clumping vs. NDR routing-space demand) to the option that actually addresses it.
What is being tested
Differential diagnosis between two options that sound similar but solve different problems.
Advanced

Q36. opt.common.use_route_aware_estimation (GRLB) and opt.common.enable_rde (RDE) are both enabled on the same run. What actually happens, and what is the risk of assuming both are contributing?

What is happening
RDE silently overrides and ignores the GRLB setting whenever both are enabled — only RDE's route-driven estimation is actually in effect during final_opt. Believing GRLB is also contributing independently misattributes any parasitic-estimation improvement to two features when only one is doing the work.
The trap
Reading two enabled options as two independent contributions, when one silently supersedes the other.
What is being tested
Whether the reader tracks documented precedence between overlapping features, not just their individual descriptions.
Advanced

Q37. A design only legalizes after enabling opt.common.small_region_area_recovery. What must happen before this design can go to sign-off, and why is this not a routine setting to leave on for every project?

What is happening
The timing-QoR cost this option carries (documented, expected) must be measured — worst slack and TNS compared before/after — and recorded, not silently absorbed into the checkpoint. It is scoped to designs actually failing to legalize because of a small high-utilization region; using it as a default habit pays that QoR cost on designs that never needed it.
The trap
Treating "it let the design legalize" as the end of the story, without recording the quality cost that came with it.
What is being tested
Whether a targeted fix gets documented as a targeted, costed fix rather than folded in silently.
Advanced

Q38. A UPF design banks multibit retention registers using identify_multibit -mv_cell instead of -register. What goes wrong, and which four prerequisites should have been checked first?

What is happening
-mv_cell is the wrong option for retention-register banking specifically; -register is required to identify multibit retention registers correctly. The four prerequisites: the single-bit retention registers share the same retention strategy, they share the same retention-pin driver, the library has a matching multibit retention cell, and that cell is registered for the strategy via map_retention_cell -lib_cells.
The trap
Reusing the ordinary multibit banking option name from memory instead of checking that retention registers have their own documented option and prerequisite list.
What is being tested
Exact option recall plus the full prerequisite checklist for a low-power-specific banking case, not just the general banking flow.

Expert / senior questions

Expert

Q39. You enable both place_opt.flow.trial_clock_tree and rely on the tool's default clock-gate latency estimation. What actually happens, and why is this not "extra accuracy"?

What is happening
When trial clock tree synthesis (or clock-gate optimization via place_opt.flow.optimize_icgs) is enabled, the tool does not perform the separate clock-gate latency estimation at all — the more accurate, tree-based method supersedes it entirely, rather than the two methods combining.
The trap
Assuming enabling more accuracy-related settings simultaneously always produces additively better results.
What is being tested
Deep, precise recall of a documented mutual-exclusion behavior between two related features.
Expert

Q40. Explain why IR-drop-aware placement is described in this chapter as a placement-density fix, not an IR-drop fix.

What is happening
It spreads cells with high voltage-drop values to reduce local power density during placement; it does not add power network capacity. An IR-drop violation caused by a thin power mesh or an under-sized rail — a floorplan-stage power network decision — is not something placement-stage cell spreading can correct.
The trap
Treating IR-drop-aware placement as a general-purpose IR-drop solution rather than one specific mitigation among several.
What is being tested
Whether the reader can locate a fix at the correct stage of the flow, not just name that a fix exists.
Expert

Q41. A colleague claims set_placement_status fixed fully protects a cell from any change during the remaining flow. What is wrong with that claim, and what closes the gap?

What is happening
A fixed cell cannot be moved by the tool, but it can still be resized during optimization. Full protection against both movement and resizing requires an additional dont_touch attribute alongside the fixed status.
The trap
Conflating "the tool will not relocate this cell" with "the tool will not change this cell at all."
What is being tested
Precise boundary-drawing around what one specific status guarantees, under expert-level scrutiny.
Expert

Q42. What is the practical difference between forcing a full timing update before every report versus relying on the default incremental update, and when does the difference actually matter?

What is happening
The incremental update (the default) only recomputes out-of-date information and is faster; a full update recomputes everything from scratch. The difference matters only when there is a specific reason to distrust the incremental result — otherwise forcing a full update is pure, avoidable runtime cost, since report-driving commands already trigger an update automatically when needed. (The exact flag name for a forced full update is release-specific — check update_timing -help rather than assuming -full.)
The trap
Defaulting to a full update out of caution without a specific reason, on every design regardless of size.
What is being tested
Whether the reader treats a forced full update as a deliberate, justified choice rather than a habitual safety blanket.
Expert

Q43. A block enables both place.coarse.pin_cost_aware and place.coarse.pin_density_aware on a 5nm design. Which one actually governs placement, and what evidence would show you which is really active?

What is happening
On 7/7+/5/s5/s4 nodes, pin_cost_aware's technology-specific model takes priority regardless of pin_density_aware's setting — the latter has no effect on those nodes when the former is on. Evidence: pin-access DRC counts or a pin-density map behaving consistently with the cost-aware model's expected effect, not the density-aware one's.
The trap
Assuming enabling both options gives layered protection, when one silently has zero effect on these nodes.
What is being tested
Precedence-rule recall under a specific node condition, plus knowing how to verify which model actually ran.
Expert

Q44. Figure 7 routes REG_B's CLK wire from the flip-flop's actual left-edge pin, not from the bottom-center of the box. Why does that distinction matter when you are reading a real schematic, not a teaching figure?

What is happening
A schematic's pin position encodes real information — which edge a signal enters or leaves the symbol from is part of the symbol's meaning, matching the standard convention (CLK with its edge-trigger triangle on an input edge, not wherever there happens to be drawing space). A wire drawn to the wrong location on a real schematic misrepresents connectivity, or at minimum makes the drawing untrustworthy as a check against the netlist.
The trap
Treating pin placement as a cosmetic drawing choice rather than as information the symbol is required to carry accurately.
What is being tested
Schematic-reading rigor: whether the reader notices when a diagram's geometry does not match its own symbol convention.
Expert

Q45. A reviewer asks whether write_qor_data labels matter, since compare_qor_data finds every labeled stage under one run location and treats them as one ordered sequence regardless of the label text. Why does the label text still matter operationally?

What is happening
The tool does not enforce any naming convention, but a real project runs the same stage many times while options get tuned — a label of just the stage name (place_opt) repeated across a dozen runs is indistinguishable in the QORsum report except by directory, weeks later. A label naming the option combination and a date or revision is what lets a human, not the tool, tell two runs of the same stage apart when it matters.
The trap
Answering only for what the tool requires, when the actual question is what a human reading the report six weeks later needs.
What is being tested
Distinguishing tool-enforced correctness from operational practice that the tool has no way to enforce.

↑ Back to contents

Flashcards

Twenty-two facts worth having cold

Banking sequencing rule
identify_multibit -apply changes the netlist. Always run it before the reoptimizing place_opt -from initial_drc pass — never checkpoint right after -apply.
Utilization after banking
Banking can reduce cell area within a fixed core, so utilization is allowed to move. Measure it against the pre-placement baseline; never assume it stays constant.
Tie cells
place_opt/clock_opt insert tie cells automatically for constant pins they create. add_tie_cells/remove_tie_cells give explicit, standalone control.
update_timing default
Incremental by default (fast, updates only stale data). A forced full update recomputes everything — use it only when you specifically distrust the incremental result, and confirm the exact flag with command help.
report_timing vs. report_qor
report_timing shows worst individual paths in detail. report_qor summarizes design-wide cost. A single fixed path can still leave overall QoR unchanged.
Default leakage mode
power.leakage_mode defaults to state (state-dependent characterization), falling back to unconditional if that data is missing.
Power-group precedence
Instance-level set_power_group assignment beats library-cell-level, which beats the cell's default group.
Clock-network power basis
report_power's clock_network group is cell-based by default; report_clock_qor -type power is always pin-based. Match the setting before comparing them.
QoR-data chain
set_qor_data_options (optional) → write_qor_data per stage → compare_qor_dataview_qor_data. Each stage needs its own label so runs stay distinguishable.
QORsum baseline
The first run is the baseline by default; red = worse, green = better, shading intensity = magnitude. Change baseline from the Runs dialog.
place_opt's five stages
initial_place, initial_drc, initial_opto, final_place, final_opto — run all by default, or any contiguous subset with -from/-to.
create_placement vs. legalize_placement
The first gives every cell an approximate location fast. The second moves cells onto real, legal, non-overlapping sites without touching the netlist.
merge_clock_gates sequencing
place_opt merges automatically at initial_place. Running it first, standalone, means place_opt will not merge again — not redundant, just a no-op the second time.
Timing-driven vs. congestion-driven
They can pull in different directions — timing wants critical cells close, congestion wants cells spread. Enabling both means the placer trades one against the other.
IR-drop-aware placement sequence
place_opt -to final_place, analyze voltage drop externally, enable place.coarse.ir_drop_aware, then place_opt -from final_place. Order matters.
CCD optimization
Useful skew borrows slack from one path to help another. It redistributes margin; it does not create timing margin from nothing.
SPG physical guidance
DEF carries geometry (die, macros, routes). It does not carry voltage areas, layer constraints, or special blockages — those need a separate Tcl file.
Multibit banking constraint
Only merges registers sharing identical timing constraints, and copies those constraints to the resulting bank. Not free-form restructuring.
Magnet placement scope
Only pulls cells on a genuinely contiguous data path from the magnet. A "logically related" cell reached through a gap in the chain does not move.
Placement status: fixed vs. locked
fixed blocks movement but allows resizing. locked blocks both manual and tool movement entirely. Not the same guarantee.
fixed status is not a full lock
A fixed cell can still be resized by optimization. Add dont_touch if size must not change either.
check_bufferability scope
A net can be bufferable in one voltage area and not another. Always specify -voltage_area deliberately rather than trusting a default.
Glossary

Terms used in this chapter

Baseline run
In a QORsum comparison, the run (by default, the first captured) that all others are shaded and compared against.
Bufferability
Whether a net segment can legally be buffered, given available supply nets, library cells, and blocking constraints.
Coarse placement
A fast first pass giving every standard cell an approximate, legal-ish location.
Concurrent clock and data (CCD) optimization
Adjusting clock arrival times at registers (useful skew) together with datapath optimization.
Congestion-driven placement
Placement that spreads cells to avoid routing hot spots, enabled with -congestion.
Fixed (placement status)
A cell the tool cannot move, but can still resize during optimization.
IR-drop-aware placement
Placement that spreads high-power-density cells using external voltage-drop analysis values.
Leakage mode
The calculation method report_power uses for leakage power: average, unconditional, state (the default), or off.
Legalization
Moving cells onto real, non-overlapping site-grid positions without changing the netlist.
Locked (placement status)
A cell that cannot be moved either manually or by the tool.
Logical DRC violation
A constraint violation — max transition, max capacitance, max/min delay, min pulse width, min period — reported by report_constraints.
Magnet placement
Pulling cells on a contiguous data path toward a fixed anchor object.
Multibit register banking
Combining single-bit registers with identical timing constraints into one equivalent multibit cell.
Path group
The named group (typically per-clock) a timing path is reported and constrained under.
Physical guidance (SPG)
Using a Design Compiler Graphical placement, carried by DEF, as ICC2's placement starting point.
place_opt stage
One of five named phases — initial_place, initial_drc, initial_opto, final_place, final_opto.
Placement status
A per-cell state controlling whether later commands may move it: unplaced, placed, fixed, legalize_only, or locked.
Power group
A named category (default, such as register or combinational, or user-defined via set_power_group) that report_power breaks its results down by.
QORsum report
The web-based report generated by compare_qor_data for comparing captured QoR data across runs.
Refine placement
Incremental, congestion-optimizing placement on an existing design, without touching the netlist.
Slack
Required time minus arrival time on a timing path; positive means the path passes, negative means it fails by that margin.
Tie cell
A library cell providing a real driven source for a constant logic-0 or logic-1 pin, inserted by add_tie_cells or automatically during optimization.
Timing-driven placement
Placement that considers timing criticality when choosing cell locations, enabled with -timing_driven.
Trial clock tree
A temporary clock tree built during placement so the tool can optimize against propagated, not ideal, clocks.
Useful skew
Deliberately shifting a register's clock arrival time to borrow slack from a path that has it, for one that does not.
Voltage-area-aware buffering
Choosing a buffer supply that avoids a new multivoltage violation, preferring single-rail buffers when legal.
Self-check questions

Test yourself before moving on

  1. Name place_opt's five stages, in order, and say in one sentence what each one does.
  2. Why does running create_placement directly, instead of place_opt, require you to run merge_clock_gates yourself first?
  3. Walk through the exact sequence required to enable IR-drop-aware placement, including where final_place fits.
  4. What is the difference between placement status fixed and locked, and which one alone does not protect a cell's size?
  5. Why can split_multibit not be used on a multibit register cell that was already multibit in the original netlist?
  6. Explain why a Design Compiler Graphical DEF file is not, by itself, a complete physical-constraint transfer into ICC2.
  7. You just ran identify_multibit -register -apply. What must you do before checkpointing, and why?
  8. What is the documented default for power.leakage_mode, and what does it fall back to?
  9. Name the four-command chain, in order, for comparing QoR data across runs.
  10. Why might report_power and report_clock_qor -type power disagree on clock-network power even on the same design and scenario?

Answers

  1. initial_place (merge clock gates, coarse placement); initial_drc (remove/rebuild buffer trees, high-fanout synthesis, electrical DRC fixing); initial_opto (timing/area/congestion/leakage optimization); final_place (incremental placement plus legalization); final_opto (further optimization and legalization).
  2. Because place_opt merges clock-gating cells automatically at the start of initial_place, but create_placement called alone does not perform that merge at all.
  3. Run place_opt -to final_place; perform voltage-drop analysis externally; set place.coarse.ir_drop_aware to true; rerun with place_opt -from final_place so the next pass uses the voltage-drop values.
  4. fixed blocks movement by the tool but still allows resizing during optimization; locked blocks both manual and tool movement entirely. fixed alone does not protect a cell's size — add dont_touch for that.
  5. Because split_multibit only splits multibit cells that were themselves created by create_multibit or identify_multibit — a cell that was multibit in the original netlist has no such provenance to reverse.
  6. Because DEF carries geometry — die area, site rows, tracks, port and cell locations, route guides, blockages — but not voltage area definitions, layer constraints, special route guides with utilization, or special blockages with blocked layers, which require a separate Tcl file.
  7. Reoptimize and revalidate: re-enter place_opt from initial_drc (or earlier), then rerun report_placement/report_utilization/report_qor — because -apply changed the netlist, and checkpointing before reoptimizing would save a stale, unvalidated design.
  8. state is the default; it falls back to unconditional if state-dependent leakage characterization data is unavailable.
  9. set_qor_data_options (optional configuration) → write_qor_data (capture each run) → compare_qor_data (generate the comparison) → view_qor_data (view it).
  10. Because report_power's clock-network power is cell-based by default (a whole cell's power counts if any output is on the clock network), while report_clock_qor -type power is always pin-based — a reporting-basis difference, not necessarily a data error, unless power.clock_network is set to match.
Part summary

What to carry forward

Facts worth carrying into every later chapter
TopicFact worth carrying forward
place_opt stagesFive stages, individually re-runnable with -from/-to; running all five by default is the right first pass on any new design.
Standalone commandscreate_placement does not merge clock gates automatically the way place_opt does — run merge_clock_gates yourself first.
Timing vs. congestion drivenThe two can pull in different directions; enabling both means a tradeoff, not a guaranteed win on either axis.
IR-drop-aware placementA placement-density fix, not an IR-drop fix — a thin power mesh needs a floorplan-stage correction, not this.
Multibit bankingOnly merges registers with identical timing constraints; only tool-created banks can be split back apart.
Placement statusfixed blocks movement, not resizing; locked blocks both. Add dont_touch for a full lock.
Physical guidance (SPG)DEF transfers geometry, not full intent — voltage areas and special constraints still need a separate Tcl file.
Multibit banking sequencing-apply changes the netlist; it must be followed by a reoptimization pass, never checkpointed directly.
Timing analysisreport_timing shows worst-path detail; report_qor shows design-wide cost. Read both before judging a change.
Power analysisNever compare two power reports captured under different leakage modes, scenarios, or clock-network reporting bases.
QoR-data comparisonA run is not better because one metric improved — compare timing, power, congestion, runtime, and utilization together against a named baseline.
Sign-off checklist

Before you call this stage done

This is a condensed pass over the full 23-item exit gate from earlier in this chapter, repeated here as a final scan before handoff. See Stage completion checklist for the complete list and the evidence required for each item.

  • Every standard cell is placed and legalized, with no unresolved placement or physical-hierarchy violations, and no unresolved hard-macro overlap.
  • Achieved utilization is reviewed against the pre-placement baseline, with any shift explained — not assumed unchanged.
  • Clock-gating cells are merged exactly once, and high-fanout buffer-tree behavior is reviewed.
  • Timing-, congestion-, or buffering-aware placement options were deliberately chosen, and any IR-drop-aware placement followed the documented enable-and-rerun sequence.
  • Multibit banking decisions are documented, and a reoptimization pass plus fresh reports were run after any -apply.
  • Tie-cell state has been checked with add_tie_cells.
  • Any manually fixed or locked cell has a documented reason; bufferability and analyze_design_violations findings are triaged, not ignored.
  • Timing (update_timing/report_timing/report_qor/report_constraints) and power (report_power, correct scenario and leakage mode) have both been reviewed, not skipped.
  • QoR data has been captured and compared against a named baseline, and no option experiment was accepted without a before/after comparison.
  • A saved checkpoint, with logs, reports, command history, and QoR data, reproduces cleanly for a second engineer, with a CTS handoff note on any known limitations.
Last word

Last word and bridge to Clock Tree Synthesis

This chapter filled in the shape the previous one defined, and proved — with reports, not impressions — that the fill actually converged: every cell placed and legal, timing and congestion optimized against real constraints, registers banked where it helped, and nothing silently left fixed by accident. What comes next assumes that proof holds. Ideal clocks become real ones. If a clock tree turns out to correlate poorly with this chapter's trial-clock-tree estimates, or a register you banked turns out to sit awkwardly for clock tree balancing, the first productive move is almost always back here: was CCD actually enabled the way you think, is that cell's placement status really what you set it to, does report_placement still show what it showed at handoff.

Next

The next chapter, Clock Tree Synthesis, picks up exactly where this one leaves off: a fully placed, legalized, optimized design with ideal or trial clocks, but no real clock tree yet. It covers clock tree construction, balancing, and postroute CTS optimization — turning this chapter's ideal-clock promises into a real, buildable clock network.