Prefer it on paper?
The 47-page A4 PDF edition, with every figure and table at full size. Free.
01Chapter Overview #
Placement is the first step in the implementation flow where the tool knows real distances. Up to this point, timing was computed with ideal clocks and estimated wires, so a path that looked fine after synthesis could still be far too long once its cells land on opposite sides of the die. After placement, most wire lengths are fixed, the congestion picture is set and the majority of the timing problems the design will ever have are already visible. Clock tree synthesis (CTS) and routing can correct only a part of what placement leaves behind.
This handbook covers three things in that order. First, the sanity checks that should pass before a single placement command is run. Second, the techniques that move timing, congestion and power during placement, each explained with a small example before the command that expresses it. Third, the interview questions that come with the topic, grouped by experience level.
Why it matters in interviews: almost every physical design interview spends time on placement, because it is where cause and effect is easiest to test. "I ran place_opt_design" is not an answer. "The hotspot came from a narrow macro channel, so I added a partial blockage there and the timing held" is the kind of answer the panel is listening for.
Where it is used in real projects: every block goes through placement many times. Each floorplan change, netlist drop or constraint update means another placement run, and the quality of that run decides how many iterations CTS, routing and signoff will need.
All commands are Innovus Legacy UI (camelCase commands such as setPlaceMode and place_opt_design). Distances are in microns, delays in picoseconds unless stated otherwise. Every number in an example (utilisation, density, padding, delays) is illustrative, chosen so the arithmetic can be checked by hand; it is not a project value. Commands and options were checked against the tool documentation but the scripts were not run here, so confirm option names with man <command> in the release you use. Placement here means standard cell placement together with pre-CTS optimisation, unless mentioned otherwise.
Figure 1.1 · Where placement sits in the implementation flow
What is new at the placement stage
It helps to be clear about which inputs change when the design moves from synthesis to placement, because that is what makes the timing numbers move. Table 1.1 lists them.
| Item | Before placement | After placement |
|---|---|---|
| Wire delay | Wire-load model or zero wire load | Estimated from placed pins with early global route and extraction |
| Clock | Ideal | Still ideal, unless the early clock flow is used (Section 5.8) |
| Congestion | Unknown | Visible as overflow per routing cell |
| Buffering | Synthesis buffers, placed nowhere | Removed and rebuilt on real locations |
| Density | A single utilisation number | A map: some regions dense, some empty |
Table 1.1 · What placement adds to the timing picture
Thus, a timing report after placement is the first one in the flow that can be trusted to point at real problems, and the first one that can mislead the designer if the inputs behind it are wrong.
02Concept Primer #
2.1 Global placement, detail placement and legalisation
Placement is done in two steps. Global placement finds rough locations for every standard cell so that connected cells are close together and the cells are spread evenly over the core. At this step the cells are allowed to overlap and do not yet sit exactly on rows. Detail placement then snaps every cell to a legal site in a row, removes overlaps, honours blockages and halos, and improves the result locally for timing, wire length and congestion. The part of detail placement that only makes the placement legal is called legalisation; in Innovus this is done by refinePlace, which place_opt_design calls by itself at the end.
Figure 2.1 · Global placement result (left) and the same cells after legalisation (right)
refinePlace log means global placement packed a region far beyond what fits.Thus, a good global placement is the precondition for a good final placement. If global placement crowds a region, legalisation has to push cells far from where timing wanted them.
2.2 Utilisation and density
Utilisation is the area of standard cells divided by the area available to them. Density is the same ratio measured in a small window (a bin) instead of the whole core. A block can have a moderate utilisation and still contain bins near 100%, which is why the density map matters more than the single number.
## Assuming, a core of 500 x 400 um and two macros of 30,000 um2 each Core area = 500 x 400 = 200,000 um2 Macro area = 2 x 30,000 = 60,000 um2 Area for std cells = 200,000 - 60,000 = 140,000 um2 Std cell area = 98,000 um2 Utilisation = 98,000 / 140,000 = 70 % ## Assuming, CTS and hold buffers will add about 4 % of cell area later After growth = 98,000 x 1.04 / 140,000 = about 73 %
The arithmetic shows why the starting utilisation is chosen with growth in mind. A block that starts at 85% has very little room for the cells that CTS, hold fixing and ECOs will add.
Figure 2.2 · Same utilisation, different density: one bin is close to full
reportDensityMap lists such bins (Section 6).2.3 What place_opt_design does inside
In Innovus, place_opt_design is the command most flows use for this stage. It is a single command, but it runs several steps in order, and knowing them makes the log readable. Figure 2.3 shows the sequence.
Figure 2.3 · The main steps inside place_opt_design
Step 4 itself uses several techniques: inserting buffers, resizing gates, restructuring logic, swapping pins, moving cells and, unless disabled, useful skew. Section 5.7 explains each one with an example.
2.4 Why wire length matters so much
A wire has resistance and capacitance per unit length, and both grow with length. The delay of an unbuffered wire therefore grows roughly with the square of its length: double the length and the delay becomes about four times larger. This is the reason a placement that spreads one path across the die can lose far more time than the extra distance suggests, and why optimisation splits long wires with repeaters.
Figure 2.4 · A 2 mm wire, unbuffered and with one repeater (illustrative numbers)
Thus, keeping critical cells close is the cheapest way to save delay, and repeaters are the fix when they cannot be close. We will see both in Section 5.
03Sanity Before Placement #
So far we saw what placement does. Now we turn to what must be true before it starts. A common belief is that a bad placement is a placer problem. In most cases it is an input problem: a missing timing view, an incomplete constraint, a macro that is not fixed. The placer does not stop for these. It produces a legal placement anyway, and the designer finds the real issue two days later. Thus, the checks in this section are cheap insurance.
Figure 3.1 · The pre-placement gate: four groups of checks, all must pass
3.1 Library and netlist
Let us start with the data. Every cell used in the netlist needs a physical view (LEF) so it can be placed and a timing view (Liberty) so it can be timed. The netlist itself should have no floating inputs, no outputs tied to power and no unexpected multi-driven nets. The tool can report all of this in a few commands.
## Library, netlist, P/G and floorplan integrity, written to a text report checkDesign -all -noHtml -outfile rpt/checkDesign.rpt ## Netlist summary: floating ports, multi-driven nets, pad issues checkNetlist -outfile rpt/checkNetlist.rpt ## Every non-leaf module must be instantiated once (returns 1 if unique) checkUnique -verbose ## Preconditions for placement: PG rail alignment, pin access, followpins, taps, termination cells check_design -type place -out_file rpt/check_place.tcl
checkDesign looks for missing or inconsistent library and design data at any stage. check_design -type place is narrower: it checks the conditions placement depends on, such as power rail alignment, pin access, missing follow-pins and misaligned tap cells. In a report, an error is a stop. A warning is acceptable only when the designer can explain it.
3.2 Timing constraints
Placement is timing-driven by default when constraints are loaded. That is useful only if the constraints are complete. If a clock is missing, every path it drives is unconstrained: the tool does not see it as a timing path and will not pull its cells together. The report will look clean for those paths simply because nothing was checked.
## Missing clocks, unconstrained endpoints, missing input delay, loops check_timing -verbose > rpt/check_timing.rpt ## Zero wire-load baseline: if this already fails badly, fix synthesis or the SDC first timeDesign -prePlace -outDir rpt/prePlace
The pre-place run deserves a word. It times the netlist with zero wire load and ideal clocks. If a path fails badly even here, no placement setting can fix it, because placement can only add wire delay, never remove gate delay. In such a case the problem belongs to synthesis or to the constraints.
Leaving combinational timing loops for the tool to break. The tool disables one arc to break each loop, and it might choose a different arc in each run. WNS then changes between runs for no real reason and the results cannot be compared. It is better to break loops in the constraints with set_disable_timing before pre-CTS optimisation, so every run analyses the same graph.
3.3 Floorplan readiness
Before standard cells go in, the floorplan must be final and legal: macros at their positions with a fixed status, halos around them, blockages where cells should not go, and a power grid in place.
## Floorplan quality check with target and effective utilisation checkFPlan -reportUtil -outFile rpt/checkFPlan.rpt ## Keep-out ring around every macro: left bottom right top, in microns (values illustrative) addHaloToBlock 5 5 5 5 -allMacro ## Preplaced cells and macros must already be legal (report file name is positional) checkPlace rpt/checkPlace_preplace.rpt
A macro left with a placed status instead of fixed can be moved by the placer. That might sound harmless, but a macro moved by a few microns can block a channel the designer planned for routing, or break the power hookup. Fixing macros is one line of effort and it removes a whole class of surprises.
3.4 Physical cells and their order
Some cells have no logical function but must be in the rows before placement. End caps terminate each row and well taps tie the wells to the supplies at a regular interval. Both are preplaced, so the placer fills the space around them. Other physical cells come later. Figure 3.2 shows the order.
Figure 3.2 · When each kind of physical cell is added
## Choose the end cap cells (names are examples from a typical library) setEndCapMode -leftEdge ENDCAP_L -rightEdge ENDCAP_R ## End caps first, on every row end addEndCap -prefix ENDCAP ## Then well taps at the maximum spacing the technology allows (50 um is illustrative) addWellTap -cell TAPCELL -cellInterval 50 -prefix WELLTAP
Fillers go last because adding them earlier hides placement problems and costs runtime on every later step. Thus, the order is not a matter of taste: each kind of cell is added when the step that depends on it is next.
3.5 Things people forget
- Scan information. Scan chain reordering needs the scan DEF, loaded with
defIn. Without it the tool warns and skips reordering. - Don't-use list. Cells the methodology bans (very weak drivers, delay cells in data paths, special cells) should be marked with
setDontUsebefore the first optimisation, not after. - RC scale factors. Pre-route estimates should track post-route numbers. If they do not, placement optimises against the wrong delays.
- Utilisation target. Worked Example 2.1 showed why: leave room for CTS, hold and ECO cells.
- Fanout fixing. Optimisation does not fix max fanout violations by default. If the methodology needs it, turn it on before the first pre-CTS run (Section 4.2).
3.6 The pre-placement gate
| Check | Command or evidence | Status |
|---|---|---|
| Library and netlist clean | checkDesign -all, checkNetlist | PASS if no errors |
| Design unique | checkUnique returns 1 | PASS / FAIL |
| Placement preconditions | check_design -type place | PASS if no errors |
| Constraints complete | check_timing -verbose: no missing clocks, no loops, no unexplained unconstrained endpoints | PASS / FAIL |
| Baseline timing sensible | timeDesign -prePlace close to synthesis numbers | PASS / FAIL |
| Floorplan legal | checkFPlan and checkPlace on preplaced cells | PASS if clean |
| Physical cells in | End caps and well taps inserted, macros fixed with halos | PASS / FAIL |
| Inputs for options | Scan DEF loaded, don't-use list applied, CTS spec ready if the early clock flow is used | PASS / FAIL |
Any row is FAIL. A placement on a broken input gives a result that looks fine and costs the next two days.
04Setting Up the Placer #
Once the inputs are sane, the designer tells the tool what to care about. It is recommended to set every mode before the step it controls and to print the full set into the log, because a reviewer reading the log should be able to see exactly what ran.
4.1 Path groups
Optimisation spends its effort per path group. If every path sits in one group, a few badly constrained input paths might take most of the effort while the real register-to-register paths stay negative. Splitting the paths into groups lets the designer decide where effort goes. Figure 4.1 shows the standard groups.
Figure 4.1 · The basic path groups around a block
## Create reg2reg, reg2cgate, in2reg, reg2out and in2out groups createBasicPathGroups -expanded ## High effort groups are optimised separately for the best WNS setPathGroupOptions reg2reg -effortLevel high setPathGroupOptions reg2cgate -effortLevel high ## Print the groups and their options into the log reportPathGroupOptions
A negative -slackAdjustment on a group tightens it and, unless low effort is set explicitly, raises it to high effort automatically. It is useful for a group the designer knows will degrade later, such as paths that will pick up clock skew. Used on every group, it simply over-constrains the whole design, so it is better kept for the few groups that need it.
4.2 The modes that matter most
Innovus has many placement and optimisation options. Table 4.1 lists the ones that change results most often at this stage. The detail of each appears in the technique it belongs to in Section 5.
| Setting | What it controls |
|---|---|
setDesignMode -flowEffort express|standard|extreme | Flow-level effort. Express resizes and buffers but does not restructure, which suits quick prototyping. |
setDesignMode -congEffort | Congestion effort for the whole flow. High also makes optimisation more congestion friendly. |
setPlaceMode -place_global_timing_effort | Medium by default. High is not advised for congested designs. |
setPlaceMode -place_global_cong_effort | Low, medium, high or auto (default). Auto adds effort only for highly congested designs. |
setPlaceMode -place_global_max_density | Upper limit on local bin density; off by default. Keep it above the design utilisation. |
setOptMode -opt_max_density | Utilisation cap for optimisation (default 0.95). Optimisation does not grow the netlist beyond it. |
setOptMode -opt_fix_fanout_load | Off by default. Turn it on before the first pre-CTS run if fanout limits matter and keep it on to the end. |
setOptMode -opt_drv_margin | Tightens (positive) or relaxes (negative) max capacitance and max transition limits. A small positive margin improves correlation between pre-route and post-route numbers. |
Table 4.1 · Placement and optimisation modes worth knowing
## Print every placement and optimisation mode into the log for review getPlaceMode getOptMode ## Use local CPUs for placement; do not ask for more threads than physical cores setMultiCpuUsage -localCpu 8
Thus, by the end of this step the designer has decided which paths matter, how hard the tool should work on timing and congestion, and how much room optimisation may use. The next section is about what to do when the result is still not good enough.
05Placement Optimisation Techniques #
This section covers twelve techniques. Each one follows the same order: the problem it solves, a small example, the Innovus command that expresses it, and the cost or caveat. It is better to apply them in response to evidence (a timing report, a congestion map, a density map) than to switch them all on at once, because several of them pull in opposite directions.
At the end of each technique a small trade-off table shows its typical effect on setup, hold, congestion, area, power and runtime, the kind of violation it suits best, and the setPlaceMode or setOptMode options that control it. Section 5.13 then maps each violation to a technique, Section 5.14 collects all trade-offs in one matrix, and Sections 5.15 and 5.16 list the key setPlaceMode and setOptMode options with their defaults.
5.1 Timing-driven placement
Let us consider a simple path: a launching flip-flop, two gates and a capturing flip-flop. If the placer puts the two flip-flops on opposite sides of the block because each connects more strongly to other logic, the path picks up two long wires. From Section 2.4, a long wire costs far more than its length suggests.
Figure 5.1 · The same path placed without and with timing awareness
The tool handles this by running timing analysis between placement passes and giving extra weight to nets on critical paths, so their cells move closer. place_design and place_opt_design are timing-driven by default when constraints are loaded. The designer can also raise the weight of a known critical net directly.
## Raise timing effort only when congestion is under control setPlaceMode -place_global_timing_effort high ## Raise the weight of a known critical net; weights above 10 are treated as 10 by the placer specifyNetWeight core/alu_result_bus* 8 ## Placement plus pre-CTS optimisation in one step, reports into rpt/place_opt place_opt_design -out_dir rpt/place_opt
The cost: pulling cells together raises local density. Timing improves now and routing pays later. Thus, timing effort is usually raised only after the congestion map shows headroom.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ▲ better | ● little change | ▼ worse | ● little change | ● little change | ▼ worse |
| Best for | reg2reg setup violations caused by long wires between cells of one path. | |||||
| Key knobs | setPlaceMode -place_global_timing_effort, specifyNetWeight, path group effort | |||||
5.2 Congestion-driven placement
The router divides the die into small tiles called global routing cells (gcells). Each gcell has a fixed number of routing tracks, its supply, and the nets passing through it need some of them, the demand. When demand is larger than supply, the difference is called overflow. A group of neighbouring gcells with overflow is a hotspot.
## Assuming, 20 horizontal tracks pass through the gcell Supply = 20 tracks Demand = 24 nets want to cross it horizontally Overflow = 24 - 20 = 4 tracks (20 % over) ## The router must detour 4 nets around the gcell, or leave shorts
Figure 5.2 · A congestion map: overflow concentrates where pins are dense
A congestion-driven placer uses early global route to find overflow and spreads cells in those areas so more tracks are free between them. Typical sources are macro corners, narrow channels and logic with many pins in a small area such as multiplexers and crossbars.
## Higher congestion effort for global placement setPlaceMode -place_global_cong_effort high ## Hotspot scores and per-layer congestion from early global route reportCongestion -hotSpot -3d ## Spread cells at hotspots incrementally; use after placement or pre-CTS opt, not after post-CTS opt congRepair
The cost: spreading lengthens wires. It is better to find the cause of the hotspot first (Sections 5.3 to 5.5 give local fixes) and raise effort globally only when the problem is spread over the whole block. After every congestion fix, check timing again.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ◆ depends | ● little change | ▲ better | ● little change | ● little change | ▼ worse |
| Best for | Overflow hotspots and routing DRC risk; global congestion spread over the block. | |||||
| Key knobs | setPlaceMode -place_global_cong_effort, setDesignMode -congEffort, congRepair | |||||
5.3 Density control and padding
Sometimes the placer packs a region tightly even though the block as a whole has room. Figure 2.2 showed such a bin. There are two kinds of fix: limit the density of a region, or reserve space around particular cells. Reserving space is called padding.
Figure 5.3 · Cell padding: the tool keeps free sites next to a high pin-count cell
| Tool | Command | Use it when |
|---|---|---|
| Partial blockage | createPlaceBlockage -type partial -density 60 -box {x1 y1 x2 y2} | One known region is over-dense |
| Max local density | setPlaceMode -place_global_max_density 0.8 | Clumping everywhere while utilisation is moderate |
| Cell padding | specifyCellPad MX4X1 -left 1 -right 1 | A library cell causes pin access problems wherever it lands |
| Instance padding | specifyInstPad u_xbar/* 2 and setPlaceMode -place_detail_honor_inst_pad true | Specific instances need space around them |
| Module padding | setPlaceMode -place_global_module_padding u_xbar 1.2 | One module is congested; it gets about 20% more area |
| Uniform density | setPlaceMode -place_global_uniform_density true | Utilisation is below about 70% and an even spread is wanted |
Table 5.1 · Density and padding controls
Three details are worth remembering. Cell padding stays honoured by CTS and optimisation until the designer removes it with deleteCellPad. Instance padding is honoured by detail placement only when the honour option above is set. Module padding factors below 1.0 are ignored, and the option affects global placement only. Thus, the three kinds of padding are not interchangeable, and choosing the wrong one gives the impression that "padding does not work".
Padding counts as used area in checkPlace utilisation but not in timeDesign density. The two numbers will differ on a padded design. To compare like for like, remove padding temporarily and rerun the reports.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ◆ depends | ● little change | ▲ better | ▼ worse | ● little change | ● little change |
| Best for | Local density hotspots, pin access problems on high pin-count cells, congested modules. | |||||
| Key knobs | setPlaceMode -place_global_max_density / -place_global_module_padding / -place_detail_honor_inst_pad, setOptMode -opt_honor_density_screen | |||||
5.4 Placement blockages
A placement blockage is an area where the designer limits what the placer may put. Innovus offers several types, and they solve different problems. Figure 5.4 shows the three used most often.
Figure 5.4 · Hard, soft and partial blockages
## Hard: nothing may be placed here (coordinates illustrative) createPlaceBlockage -type hard -box {100 200 160 260} -name keep_out_A ## Soft: placement keeps out, optimisation may still add buffers, inverters and similar cells createPlaceBlockage -type soft -box {300 120 315 380} -name chan_B ## Partial: limit density to 40 percent in a crowded area createPlaceBlockage -type partial -density 40 -box {420 50 520 150} -name dens_C
So when is each one used? A hard blockage is for areas that must stay empty, for example under a sensitive analogue macro edge. A soft blockage suits macro channels, because long nets crossing the channel still need repeaters. A partial blockage is the gentle tool for a region that is too dense but still useful.
Placement honours partial blockages, but optimisation does not by default. While optDesign fixes timing it may add cells into a partial blockage until setOptMode -opt_honor_density_screen true is set. If the density limit must hold through optimisation, set that option; the trade-off is less freedom for fixes in that area.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ◆ depends | ● little change | ▲ better | ▼ worse | ● little change | ● little change |
| Best for | Areas that must stay empty, crowded regions, macro channels. | |||||
| Key knobs | createPlaceBlockage -type hard|soft|partial, setOptMode -opt_honor_density_screen | |||||
5.5 Macro channels and halos
The narrow gap between two macros is called a channel. It has few routing tracks because the macros above and below use or block them, yet the placer sees free sites in it and might fill them. Those cells then sit in the hardest place on the die to route to.
Figure 5.5 · A macro channel without and with protection
## Automatic soft blockages in narrow macro channels before global placement setPlaceMode -place_global_auto_blockage_in_channel soft ## Or protect one channel the designer has identified (coordinates illustrative) createPlaceBlockage -type soft -box {120 400 135 620} -name chan_A ## Halo: keep-out ring around each macro (left bottom right top, microns) addHaloToBlock 5 5 5 5 -allMacro
Before blaming the channel, it is prudent to check the macro pins. A macro whose pins face a wall or another macro forces every connection to detour. Thus, many "placement" hotspots near macros are really floorplan problems, and the fix belongs in macro orientation or position.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ◆ depends | ● little change | ▲ better | ▼ worse | ● little change | ● little change |
| Best for | Hotspots at macro corners and in channels; cells trapped between macros. | |||||
| Key knobs | setPlaceMode -place_global_auto_blockage_in_channel, addHaloToBlock | |||||
5.6 Guides, regions, fences and attractors
Sometimes logic that should sit together ends up spread, or logic that talks to a macro or an I/O sits far from it. Innovus offers four ways to steer it, from gentle to strict.
Figure 5.6 · Guide, region and fence for module u_dsp (green cells) with other cells (grey)
| Constraint | Command | Behaviour |
|---|---|---|
| Guide | createGuide u_dsp x1 y1 x2 y2 | Soft: cells prefer the area |
| Region | createRegion u_dsp x1 y1 x2 y2 | Module cells must be inside; other cells may enter |
| Fence | createFence u_dsp x1 y1 x2 y2 | Only this module's cells, all inside |
| Attractor | place_connected -attractor RAM1 -level 2 | Pulls cells within two logic levels of RAM1 next to it; run before placement |
The cost: over-constraining is a classic cause of bad timing. A fence that is too small forces high density inside and long wires to everything outside. It is recommended to start with a guide and move to a region or fence only with a reason, such as a power domain or a block that must be hardened separately.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ◆ depends | ● little change | ◆ depends | ● little change | ● little change | ● little change |
| Best for | Logic of one module scattered over the die; logic that talks to one macro or I/O placed far from it. | |||||
| Key knobs | createGuide / createRegion / createFence, place_connected, setOptMode -opt_honor_fences, setPlaceMode -place_hard_fence | |||||
5.7 Netlist optimisation during placement
Placement optimisation is not only moving cells. During pre-CTS optimisation the tool also changes the netlist. The designer does not call each change by name, but recognising them makes the log and the final netlist much easier to read.
High fanout nets
A reset or scan enable net might drive hundreds of flip-flops spread over the whole block. One driver cannot meet transition and capacitance limits on such a load, so the tool builds a buffer tree. These nets are usually not timing critical, but they use a lot of routing, which is why a sensible branching factor matters.
Figure 5.7 · A fanout of 400 split into a buffer tree (illustrative branching)
Long wires with small fanout
A net might have only two loads and still show a large transition. This happens when the receiver is pulled towards other logic it connects to more strongly, leaving the driver far away. Section 2.4 showed the fix: repeaters that split the wire. If the tool refuses to buffer such a net, check whether it is marked dont_touch.
Sizing, Vt swap, restructuring, pin swap and cloning
- Gate sizing: upsize a weak driver on a critical path, downsize where slack allows to save area and power.
- Vt swap: use a lower threshold voltage (faster, leakier) cell on critical paths and a higher one where slack allows.
- Restructuring: rebuild logic on a critical path so the late signal passes through fewer levels.
- Pin swap: on a gate with logically equivalent inputs, connect the late-arriving signal to the faster input pin.
- Cloning: duplicate a driver whose loads sit in two distant places, so each copy drives a short local net (Figure 5.8).
- Area recovery: downsize or remove cells on paths with spare slack, giving room back to the critical areas.
Figure 5.8 · Cloning: one driver for two distant groups becomes two local drivers
## Fix fanout limits too (off by default); keep this on through post-route setOptMode -opt_fix_fanout_load true ## Keep area recovery away from near-critical paths (value illustrative, in ns) setOptMode -opt_area_recovery_setup_target_slack 0.05 ## Ban cells the methodology does not allow (library and cell names are examples) setDontUse slow_lib/DLY4X1 true
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ▲ better | ● little change | ◆ depends | ▼ worse | ▼ worse | ▼ worse |
| Best for | Max transition, max capacitance and max fanout violations; setup on gate-dominated paths; long wires with small fanout. | |||||
| Key knobs | setOptMode -opt_drv / -opt_drv_margin / -opt_fix_fanout_load / -opt_enable_restructure / -opt_pin_swapping / -opt_area_recovery | |||||
5.8 Clock-aware placement
By default, clocks are ideal during placement: every flip-flop sees its clock edge at the same time. This is convenient, but it hides one problem. An integrated clock gate (ICG) sits early in the clock tree, so in a real design its clock arrives earlier than the clock at the flip-flops it drives. The path into the ICG enable pin therefore has less time than the ideal analysis suggests, and the ICG placed far from its flip-flops makes both the clock tree and the clock power worse.
Figure 5.9 · Clock gate placed far from its fanout (left) and at the centre of its fanout (right)
Innovus addresses this in three ways:
setPlaceMode -place_global_clock_gate_aware(on by default) places clock gates towards the centre of their fanout. It needs a clock tree specification to be loaded.setPlaceMode -place_global_clock_power_driven(on by default) gives weight to the nets from clock gates to flip-flops, which reduces clock power.- The early clock flow, enabled with
setDesignMode -earlyClockFlow true, makesplace_opt_designcluster the clock sinks and annotate clock latencies, so optimisation sees something much closer to real clock timing.
In the early clock flow, create the CTS specification with create_ccopt_clock_tree_spec before place_opt_design, and do not delete it before ccopt_design. The useful skew decisions made during placement live in that specification; deleting it throws them away.
Useful skew before CTS
Useful skew means delaying or advancing the clock at selected flip-flops on purpose, so a failing stage borrows slack from a neighbouring stage. Pre-CTS useful skew is controlled by setOptMode -opt_skew_pre_cts, which is on by default. Let us work through one case by hand.
## Assuming, three flops in a pipeline: FF1 -> FF2 -> FF3, same clock Path A (FF1 -> FF2): setup slack = -40 ps Path B (FF2 -> FF3): setup slack = +60 ps ## Delay the clock at FF2 by 50 ps Path A: capture is 50 ps later -> setup slack = -40 + 50 = +10 ps Path B: launch is 50 ps later -> setup slack = +60 - 50 = +10 ps ## The catch: hold on path A loses the same 50 ps Path A: hold slack = (old hold slack) - 50 ps
Figure 5.10 · Setup slack of the two paths before and after the 50 ps skew at FF2
Thus, useful skew does not create time; it moves it. The gain is real only if CTS later builds the clock tree with those offsets, and the hold side of the borrowing path must be checked after CTS.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ▲ better | ▼ worse | ● little change | ● little change | ▲ better | ▼ worse |
| Best for | reg2cgate violations; setup where a neighbouring stage has spare slack; clock power. | |||||
| Key knobs | setPlaceMode -place_global_clock_gate_aware / -place_global_clock_power_driven, setDesignMode -earlyClockFlow, setOptMode -opt_skew_pre_cts | |||||
5.9 Scan-aware placement
Scan chains are stitched during synthesis in an order that ignores where the flip-flops will land. If the placer followed the scan connections, they would pull functional logic out of place. That is why scan connections are ignored during global placement by default (-place_global_ignore_scan true), and the chains are then reordered by physical position.
Figure 5.11 · The same scan chain in synthesis order (left) and after reordering (right)
## Load scan chain information so reordering can run (file name is an example) defIn design_scan.def ## After placement, report chain lengths and scan wire length report_scan_chain -out_file rpt/scan.rpt
The cost: reordering is driven by wire length, so neighbouring flip-flops can end up with very short scan paths. After CTS, when real clock skew appears, those short paths often become hold violations in scan mode. It is better to expect them in hold fixing than to be surprised by them.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ● little change | ▼ worse | ▲ better | ● little change | ● little change | ● little change |
| Best for | Congestion and wire length caused by scan chains stitched in synthesis order. | |||||
| Key knobs | setPlaceMode -place_global_ignore_scan / -place_global_reorder_scan, setScanReorderMode | |||||
5.10 Power-aware placement and multi-bit flip-flops
Power can be reduced during placement in three main ways. Leakage is reduced by using higher threshold cells where slack allows. Dynamic power is reduced by keeping high-activity nets short and by downsizing. Clock power is reduced by keeping gated clock nets short (Section 5.8) and by merging single-bit flip-flops into multi-bit flip-flops (MBFF), which share clock pins and so shorten the clock tree.
## Power effort with a balanced leakage/dynamic target (0.5); dynamic needs switching activity loaded setOptMode -opt_power_effort low -opt_leakage_to_dynamic_ratio 0.5 ## Allow multi-bit merging and splitting during pre-CTS optimisation (default only splits) setOptMode -opt_multi_bit_flop_opt true ## Check how instances are spread across Vt classes after placement reportVtInstCount -outFile rpt/vt.rpt
A ratio of 1 means pure leakage optimisation and 0 means pure dynamic. Dynamic optimisation needs switching activity loaded, for example with read_activity_file; without it the tool has no basis for deciding which nets toggle often.
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ▼ worse | ● little change | ▲ better | ◆ depends | ▲ better | ▼ worse |
| Best for | Leakage or dynamic power over budget; clock power on designs with many registers. | |||||
| Key knobs | setOptMode -opt_power_effort / -opt_leakage_to_dynamic_ratio / -opt_multi_bit_flop_opt, setPlaceMode -place_global_activity_power_driven | |||||
5.11 Incremental runs
A full rerun throws away decisions that were already checked. When the placement is mostly good and only a local change was made, an incremental run is the better tool.
| Command | What it does |
|---|---|
place_opt_design -incremental | Improves the existing placement around critical paths and congestion, then re-optimises DRV, WNS and TNS. It honours new density screens, so adding a partial blockage and running this spreads cells there. |
place_opt_design -incremental_timing | Incremental DRV and timing optimisation only, without placement changes. |
optDesign -preCTS -incr | Incremental setup optimisation of violating paths: resizing and buffering, no restructuring. |
refinePlace | Legalises after manual edits. It moves only cells with a placed status. |
congRepair | Spreads cells at hotspots. Use after placement or pre-CTS optimisation, not after post-CTS optimisation. |
Table 5.2 · Incremental placement and optimisation commands
| TRADE-OFF | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| Typical effect | ▲ better | ● little change | ◆ depends | ● little change | ● little change | ▲ better |
| Best for | Small residual violations after a local change; keeping a placement that was already checked. | |||||
| Key knobs | place_opt_design -incremental / -incremental_timing, optDesign -preCTS -incr | |||||
5.12 Putting it together: a placement recipe
The techniques above are not a checklist to run in full. The script below shows a sensible default order: settings first, then one placement, then reports. The designer adds the techniques from Sections 5.3 to 5.10 only when the reports point to them.
## 1. Restore the floorplan database that passed the gate in Section 3.6 restoreDesign db/floorplan.enc.dat top ## 2. Path groups so reg2reg and reg2cgate get their own effort createBasicPathGroups -expanded setPathGroupOptions reg2reg -effortLevel high setPathGroupOptions reg2cgate -effortLevel high ## 3. Optimisation settings kept for the whole flow setOptMode -opt_fix_fanout_load true setOptMode -opt_drv_margin 0.1 ## 4. Protect macro channels before global placement setPlaceMode -place_global_auto_blockage_in_channel soft ## 5. Print every mode into the log for review getPlaceMode getOptMode ## 6. Placement plus pre-CTS optimisation place_opt_design -out_dir rpt/place_opt ## 7. Tie cells after standard cells are placed addTieHiLo ## 8. Exit checks (Section 6) checkPlace rpt/checkPlace.rpt timeDesign -preCTS -outDir rpt/preCTS reportDensityMap -threshold 0.75 reportCongestion -hotSpot -3d ## 9. Save before CTS so the flow can come back here saveDesign db/place_opt.enc
The database names and the 0.1 DRV margin are illustrative. The restore command expects the saved database directory and the top cell name used in your flow.
5.13 Choosing a technique for each type of violation
So far each technique was described on its own. In practice the designer starts from a report, not from a technique. Table 5.3 turns the question around: given the violation, which technique is tried first, which one comes next, and what should be avoided. The first column is what the timing, DRV, congestion or power report shows.
| Violation or symptom | Try first | Then | Avoid, or watch for |
|---|---|---|---|
| reg2reg setup, wire delay dominates the path | Timing-driven placement (5.1): -place_, specifyNetWeight | Guide or attractor for the logic (5.6), incremental run (5.11) | Raising congestion effort globally, which lengthens these same wires |
| reg2reg setup, gate delay dominates (fails even at zero wire load) | Back to synthesis or RTL: logic depth is the cause | Restructuring and sizing (5.7), -opt_ | Spending placement iterations; placement cannot remove gate delay |
| reg2cgate setup | Clock-gate-aware placement with the CTS spec loaded (5.8) | Early clock flow, useful skew | Ignoring it until CTS; real ICG latency only makes it worse |
| in2reg / reg2out setup | Check the I/O delays and pin positions first | place_ towards the ports, path group options | Over-constrained I/O budgets taking effort from reg2reg |
| Many failing endpoints, large TNS | setOptMode -opt_ | High effort path groups (4.1) | Runtime; check constraints before chasing TNS |
| Max transition / max capacitance | -opt_ (default), a small -opt_ | Repeaters on long wires, guiding driver and load closer | Nets marked dont_; DRV margin set too high (area) |
| Max fanout | setOptMode -opt_ | Buffer trees for high fanout nets (5.7) | Turning it on late; keep it on from the first pre-CTS run |
| Long net with small fanout | Repeaters (DRV fixing), -opt_ if the methodology sets one | Cloning, guiding the loads | Extra buffers on a congested route |
| Congestion at macros or channels | Channel blockage and halos (5.5) | Macro orientation or pin side change in the floorplan | Global congestion effort for a local problem |
| Congestion in one module | Module padding or a partial blockage (5.3, 5.4) | Cell padding on high pin-count cells | A fence that is too small |
| Congestion over the whole block | -place_, setDesignMode -congEffort high | Review utilisation and floorplan size | Setup degradation from longer wires; recheck timing |
| Pin access risk on dense cells | Cell padding (5.3) | -place_ | Padding left in place after it is no longer needed (area) |
| Scan wiring congestion | Scan reordering with the scan DEF (5.9) | Check chain lengths with report_ | Hold violations in scan mode after CTS |
| Hold before CTS | Usually wait: hold depends on real clock skew | -opt_ only for an early look | Fixing hold against ideal clocks, which wastes area |
| Leakage over budget | -opt_ with -opt_ | Area recovery, Vt mix review with reportVtInstCount | Setup on paths that lose their low-Vt cells |
| Dynamic or clock power | Ratio below 1 with switching activity loaded; clock-gate-aware placement | Multi-bit flip-flops (-opt_) | Running dynamic optimisation without activity data |
| Utilisation keeps growing | check_ for unconstrained or over-constrained paths | -opt_, area recovery, smaller DRV margin | Slack adjustments applied to every group |
| Fenced module fails timing | Resize or move the fence; use a region or guide | Check -opt_ in the setup | Very small fences forcing high density |
Table 5.3 · Violation to technique selection guide
5.14 Trade-off matrix
Every technique buys one thing with another. Table 5.4 collects the trade-off rows from Sections 5.1 to 5.11 into one view, so the designer can see what a change is likely to cost before making it. The entries describe the typical direction of the effect, not a guarantee; the real result depends on the design, and it should be confirmed with the reports in Section 6.
| Technique | Setup | Hold | Congestion | Area | Power | Runtime |
|---|---|---|---|---|---|---|
| 5.1 Timing-driven placement | ▲ | ● | ▼ | ● | ● | ▼ |
| 5.2 Congestion-driven placement | ◆ | ● | ▲ | ● | ● | ▼ |
| 5.3 Density control and padding | ◆ | ● | ▲ | ▼ | ● | ● |
| 5.4 Placement blockages | ◆ | ● | ▲ | ▼ | ● | ● |
| 5.5 Channel blockages and halos | ◆ | ● | ▲ | ▼ | ● | ● |
| 5.6 Guides, regions, fences | ◆ | ● | ◆ | ● | ● | ● |
| 5.7 Netlist optimisation | ▲ | ● | ◆ | ▼ | ▼ | ▼ |
| 5.8 Clock awareness, useful skew | ▲ | ▼ | ● | ● | ▲ | ▼ |
| 5.9 Scan reordering | ● | ▼ | ▲ | ● | ● | ● |
| 5.10 Power-aware, multi-bit | ▼ | ● | ▲ | ◆ | ▲ | ▼ |
| 5.11 Incremental runs | ▲ | ● | ◆ | ● | ● | ▲ |
Table 5.4 · Typical effect of each technique (▲ better, ▼ worse, ● little change, ◆ depends on how it is used)
A "depends" entry means the same knob can help or hurt. A guide that groups a module's logic usually helps setup; a fence that is too small hurts it. A partial blockage relieves congestion in its area but can push the same cells into a neighbour and create a new hotspot there. Thus, after any ◆ change, both the timing and the congestion reports are read again, not only the one the change was aimed at.
Three trade-offs come up so often that they deserve a sentence each. Timing against congestion: pulling cells together shortens wires and raises density; spreading them does the opposite, so the two efforts are tuned together, never one alone. Setup against hold: useful skew and scan reordering both help one check by taking margin from hold, so the hold picture after CTS has to be planned for. Timing against area and power: every buffer, upsized gate and low-Vt swap that fixes setup costs area and power, which is why area recovery and power optimisation are kept away from near-critical paths with a slack target rather than switched off.
5.15 setPlaceMode at a glance
setPlaceMode holds the persistent settings of the placement engine. They apply to place_design, place_opt_design and refinePlace until changed, and the current values are printed with getPlaceMode. Table 5.5 lists the options most often used at this stage. Defaults are given as documented; confirm them in the release you use.
| Option | Default | What it does | Use when | Trade-off |
|---|---|---|---|---|
| Global placement: timing and congestion | ||||
-place_ | medium | Weight of timing in global placement (medium or high) | Setup fails on long wires and congestion has headroom | Denser placement, more congestion; not advised for congested designs |
-place_ | auto | Spreading at overflow (low, medium, high, auto) | Hotspots spread over the block | Longer wires, possible setup loss |
-place_ | -1 (off) | Upper limit on local bin density (0 to 1) | Clumping while utilisation is moderate | Longer wires; must stay above design utilisation |
-place_ | false | Even cell distribution | Utilisation below about 70% | Wires lengthen on some paths |
-place_ | none | Spreads one module by a factor (1.0 or more) | One module is congested | Module takes more area; global placement only |
-place_ | none | Soft or partial blockage in narrow macro channels | Cells crowd channels | Fewer sites near macros |
| Global placement: clock, power, scan, spares | ||||
-place_ | true | Clock gates towards the centre of their fanout; needs a clock spec | reg2cgate paths, clock power | Gate may move away from its enable logic |
-place_ | true | Weights nets from clock gates to flip-flops | Clock power matters | Small cost to data wire length |
-place_ | false | Constrains high-activity nets | Dynamic power focus, activity loaded | Runtime, some timing freedom |
-place_ | true | Scan connections ignored in global placement | Normal flows | None in functional mode |
-place_ | true | Scan reordering during placement (needs scan info) | Scan wiring congestion | Short scan paths, hold in scan mode |
-place_ | false | Ignore spare cell connections to spread spares evenly | Spares clumping together | None for timing |
| Detail placement and legalisation | ||||
-place_ | false | Honour specifyInstPad in refinePlace and checkPlace | Instance padding is used | Area |
-place_ | false | Honour padding on fixed instances | Space needed around preplaced cells | Area |
-place_ | medium | Cell swapping for wire length (none, medium, high) | Wire length matters | High: up to about 10% more runtime for about 2% wire length |
-place_ | false | Allow electrically equivalent cell swaps for routability | Pin access problems | None for timing |
-place_ | 0 | Minimum site gap between instances | A process rule needs it | Area |
-place_ | false | Avoid DRC between fixed signal wires and pins | Prerouted signal wires exist | Slower legalisation |
-place_ | 0 | Search window for ECO legalisation (internally 10 rows if unset with -eco) | Post-route ECO moves | Too small a window may fail to legalise |
| Flow control | ||||
-place_ | true | refinePlace and checkPlace honour fences and regions | Fenced designs | Less freedom near fences |
-place_ | full | Global placement inside place_opt_design: none, seed or full | seed after concurrent macro placement | none skips placement entirely |
-place_ | false | Quick prototype placement, possibly illegal | Floorplan exploration only | Not for implementation |
-place_ | none | Script sourced after placement, before optimisation | Custom fixes between the two steps | Must be kept in step with the flow |
Table 5.5 · Key setPlaceMode options
5.16 setOptMode at a glance
setOptMode holds the settings of the optimisation engine used by place_opt_design and optDesign. Several options here decide how much of the netlist the tool may change and at what cost. Table 5.6 lists the ones that matter most before CTS, grouped by purpose.
| Option | Default | What it does | Use when | Trade-off |
|---|---|---|---|---|
| Targets | ||||
-opt_ | 0 ns | Setup goal for optimisation | A margin is wanted for later degradation | Area, power and runtime grow |
-opt_ | 0 | Hold goal (used when hold is fixed) | Margin for hold after CTS | More hold buffers |
-opt_ | false | TNS optimisation on all endpoints, not only the worst | Many failing endpoints | Runtime |
| Design rules | ||||
-opt_ | true | Repair max capacitance and max transition | Keep on | Buffers and area |
-opt_ | 0 | Scales cap and transition limits (-0.7 to 0.7) | Pre/post-route correlation | More buffers, area and power |
-opt_ | false | Fix max fanout and max load | Methodology sets fanout limits | More buffers |
-opt_ | -1 (off) | Treat a max wire length as a design rule | Long nets cause transition or noise trouble | More buffers |
| Room and boundaries | ||||
-opt_ | 0.95 | Utilisation cap for optimisation | Lower it to keep room on dense blocks | Some violations may stay unfixed |
-opt_ | false | Optimisation honours partial blockages | Partial blockages must hold during fixing | Less freedom for fixes |
-opt_ | false (true for MSV) | Keeps fences and regions legal in each optimisation step | Fenced designs | Less freedom for fixes |
| Permitted transforms | ||||
-opt_ | true | Netlist restructuring | Keep on unless the netlist must stay close to synthesis | Larger netlist changes |
-opt_ | true | Swap logically equivalent pins | Keep on | None noticeable |
-opt_ / -opt_ | true | Allow adding and deleting instances | Restrict only for very controlled runs | Restricting limits fixing power |
-opt_ / -opt_ | true | Allow moving cells and downsizing | Keep on | Restricting limits fixing power |
-opt_ | true | Allow sizing of flip-flops | Keep on unless flops are locked | None noticeable |
-opt_ | true | Remove dead and constant logic | Keep on; declare spare cells | Undeclared spares may be removed |
-opt_ | none | Cells that get high-effort setup optimisation | Known critical cells | Runtime |
| Area, skew, hold, power | ||||
-opt_ | default | When area reclaim runs (default, true, false) | true under area pressure | Can eat into near-critical slack |
-opt_ | 0 ns | Keeps area and power reclaim off near-critical paths | Protect paths near zero slack | Less area recovered |
-opt_ | true | Useful skew before CTS | Setup with spare slack in a neighbouring stage | Hold; offsets must be built by CTS |
-opt_ | true | Master switch for useful skew in optDesign | false disables all useful skew | Less setup recovery when off |
-opt_ | none | Hold fixing inside place_opt_design (ideal or propagated clocks) | An early look, mainly with the early clock flow | Area spent on approximate hold numbers |
-opt_ | none | Power-driven optimisation (none, low, high) | Leakage or dynamic budget | Runtime and memory |
-opt_ | 1 | 1 leakage only, 0 dynamic only, between both | Set together with power effort | Dynamic needs switching activity |
-opt_ | splitOnly | Multi-bit flip-flop merging and splitting | Clock power and area | Merging can cost timing on some paths |
Table 5.6 · Key setOptMode options
## A balanced starting point for a congested, timing-critical block (values illustrative) setPlaceMode -place_global_cong_effort high -place_global_timing_effort medium setPlaceMode -place_global_auto_blockage_in_channel soft setOptMode -opt_fix_fanout_load true -opt_drv_margin 0.1 setOptMode -opt_area_recovery_setup_target_slack 0.05 ## Print both into the log so the run can be reproduced getPlaceMode getOptMode
Thus, the two tables are not a list of switches to flip. Most defaults are sensible, and each change in these tables should answer a specific line in a report. Table 5.3 says which report line leads to which option.
06After Placement: Check Before CTS #
A placement is finished when the evidence says so, not when the command returns. This section lists the reports to read and what each one should show before the design moves to CTS.
## Legality: overlaps, off-grid cells, blockage and fence violations checkPlace rpt/checkPlace.rpt ## Pre-CTS timing: runs early global route and extraction, then writes setup and DRV reports timeDesign -preCTS -outDir rpt/preCTS ## Density map; bins above 75 percent are listed reportDensityMap -threshold 0.75 ## Hotspots and per-layer congestion reportCongestion -hotSpot -3d
6.1 Reading the pre-CTS timing summary
The summary that timeDesign -preCTS writes has one row per path group with the worst negative slack (WNS), the total negative slack (TNS) and the number of violating paths, followed by a table of design rule violations (max transition, max capacitance, max fanout) and the density. Two details are easy to misread.
- The overall TNS and the overall count of violating paths are counted per endpoint, so they need not equal the sum of the path group values. An endpoint failing from two groups counts once overall.
- The density in this report ignores padding, while
checkPlaceincludes it (Section 5.3).
## Assuming, one register has two failing paths into its D pin
From an input port : slack -0.6 ns (in2reg group)
From another register: slack -0.3 ns (reg2reg group)
in2reg TNS = -0.6 ns, reg2reg TNS = -0.3 ns
Overall TNS = -0.6 ns (one endpoint, its worst slack only)
Violating endpoints overall = 1, not 26.2 The exit gate
| Exit check | Evidence to look at | Status |
|---|---|---|
| Legal placement | checkPlace shows zero violations | PASS / FAIL |
| Pre-CTS setup | reg2reg WNS close to zero, or within the margin the team expects CTS and post-CTS optimisation to recover | PASS / FAIL |
| reg2cgate paths | Clean or explained; these get worse once real clock latency appears | PASS / FAIL |
| DRV | No max transition or max capacitance violations on data nets | PASS / FAIL |
| Congestion | Low overflow and no large contiguous hotspot in reportCongestion | PASS / FAIL |
| Density | No large region near 100% in the density map | PASS / FAIL |
| Room to grow | Utilisation leaves space for CTS and hold buffers | PASS / FAIL |
| Saved | saveDesign written before CTS | PASS / FAIL |
Do not stop at the summary line. Open the worst five paths and read them stage by stage. One bad net, one high-fanout driver or one macro in the wrong place usually explains most of the violations, and the summary hides which one it is.
07Debug Playbook #
Table 7.1 maps the symptoms seen most often after placement to their usual causes. The first column is what the report shows; the last column is where to look first, not a guaranteed fix.
| Symptom | Likely cause | What to try first |
|---|---|---|
| Hotspot at macro corners or in channels | Cells crowding narrow channels; macro pins facing a wall | Channel blockage (5.5), larger halo, review macro pin side and orientation |
| Good timing, red congestion map | Timing effort pulled cells too close | Partial blockage or module padding (5.3), then place_opt_design -incremental |
| WNS jumps between identical runs | Timing loops broken at different arcs | Break loops in the SDC with set_disable_timing (3.2) |
| Large transition on a net with small fanout | Driver far from receiver, no repeater | Check DRV settings, check for dont_touch, guide the logic closer |
| reg2cgate paths fail | Clock gates far from their fanout; ideal clock optimism | Clock-gate-aware placement with the CTS spec loaded, early clock flow (5.8) |
| Utilisation keeps growing | Buffering on unconstrained or over-constrained paths | check_timing again, review slack adjustments and the DRV margin |
| A fenced module fails timing | Fence too small, or far from the logic it talks to | Resize or move the fence, or use a region or guide instead (5.6) |
| Large displacement in the legalisation log | Global placement packed a region beyond capacity | Density control in that region (5.3), then place again |
| Pre-CTS timing clean, post-route timing much worse | Pre-route estimates do not track routed RC | Check RC scale factors and the DRV margin, look for detoured nets in congested areas |
| Many hold violations in scan mode after CTS | Scan reordering created very short scan paths | Expected; fix in hold optimisation (5.9) |
checkPlace and timeDesign utilisation differ | Padding counted in one but not the other | Expected; remove padding temporarily to compare (5.3) |
Table 7.1 · Symptom to cause to first action
Thus, most debugging at this stage is a question of asking what the tool believed: which constraints it saw, which areas it thought were free, which nets it thought were critical. Once that is clear, the fix is usually small.
PnR Flow Mentor Guide
Master the Physical Design Implementation Flow
Read the complete 8-chapter PnR Flow Mentor Guide free on the web — library setup through placement, clock tree synthesis, routing, chip finishing, hierarchical implementation, and ECO, all the way to stream-out.

08Interview Questions #
The questions are grouped by the experience level at which they are typically asked. Each one has four parts: why the interviewer asks it, the expected answer, and a pair of follow-up questions with short answers. The answers are written in the first person because that is how they will be spoken.
Level 1: Basic (0 to 2 years)
Why the interviewer asks: it shows whether you treat placement as a step with inputs, or as a button.
Expected answer: I check that every cell has LEF and Liberty views and that the netlist has no floating or multi-driven nets (checkDesign, checkNetlist), that the design is unique, and that the constraints are complete with no loops (check_timing). I run a zero wire-load timing baseline to see if the design can meet timing even with ideal wires. Then the floorplan: macros fixed with halos, blockages in place, end caps and well taps inserted, preplaced cells legal. Finally the inputs for options: scan DEF if reordering is needed, don't-use list, and a utilisation target with room to grow.
Follow-up questions: 1. What happens if a clock is missing in the SDC? 2. Why fix macros before placement?
Follow-up answers: 1. Its paths are unconstrained, so the placer ignores them and the report looks clean only because nothing was checked. 2. A macro with a placed status can be moved by the placer, which might block a planned channel or break the power hookup.
Why the interviewer asks: basic vocabulary, and a check that you know where displacement comes from.
Expected answer: Global placement finds rough positions that keep connected cells close and spread cells evenly; overlaps are allowed. Detail placement puts each cell on a legal site in a row, removes overlaps, honours blockages and improves locally for timing, wire length and congestion. Legalisation is the part that only makes the placement legal; in Innovus that is refinePlace, which place_opt_design calls at the end.
Follow-up questions: 1. What does a large legalisation displacement tell you? 2. Which cells does refinePlace move?
Follow-up answers: 1. Global placement over-packed a region, so cells had to move far from where timing wanted them. 2. Only cells with a placed status; fixed cells stay where they are.
Why the interviewer asks: it tests whether you think ahead to CTS, hold and ECOs.
Expected answer: Utilisation is standard cell area divided by the area available to standard cells, which excludes macros and hard blockages. If the block starts at 90%, there is very little room for the buffers CTS adds, the hold buffers added after CTS, and ECO cells later. Routing also suffers because dense regions leave fewer free tracks. A lower starting point is chosen with that growth in mind.
Follow-up questions: 1. Is utilisation the same as density? 2. Why can a 65% block still have a 97% region?
Follow-up answers: 1. No. Density is the same ratio in a small bin; utilisation is the whole block. 2. Because the average hides local packing; the density map shows it.
Why the interviewer asks: a classic, and a quick test of whether you have used them.
Expected answer: A hard blockage keeps every standard cell out. A soft blockage keeps cells out during placement but lets optimisation add buffers, inverters and similar cells, which suits macro channels where long nets still need repeaters. A partial blockage limits the density in an area to a percentage, for a region that is too dense but still useful.
Follow-up questions: 1. Which one would you use in a macro channel? 2. What is a halo?
Follow-up answers: 1. Usually soft, so repeaters can still go in. 2. A keep-out ring around a macro, so standard cells do not sit against its edge and pins.
Why the interviewer asks: it checks whether you understand what is estimated at each stage.
Expected answer: The clock tree does not exist yet, so there is no real clock latency or skew to compute. The tool assumes every flip-flop sees the edge at the same time. That is why hold is not fixed at placement and why paths into clock gates can look better than they really are.
Follow-up questions: 1. Why is hold fixed after CTS and not before? 2. What changes the ideal assumption during placement?
Follow-up answers: 1. Hold depends on real skew, which only exists after CTS; fixing it earlier fixes the wrong numbers. 2. The early clock flow, which clusters sinks and annotates clock latencies during placement.
Level 2: Intermediate (2 to 5 years)
Why the interviewer asks: it separates people who read the log from people who only read the summary.
Expected answer: The buffers synthesis inserted were based on estimated wires, not real locations. Keeping them would make the placer place around wrong assumptions. Removing them lets the placer place the real logic, and pre-CTS optimisation then rebuilds the buffering on actual distances.
Follow-up questions: 1. Which buffers are not removed? 2. What does the rebuilt buffering fix?
Follow-up answers: 1. Clock path buffers, and anything protected with dont_touch. 2. Max transition and max capacitance violations, high fanout nets and long wires.
Why the interviewer asks: it tests whether you treat congestion as a real problem before routing proves it.
Expected answer: I find the cause first: a macro channel, a high pin-density module such as a crossbar, or cells pulled together by timing effort. Then I fix it locally with a channel blockage, a partial blockage, module or cell padding, and run an incremental placement. I check timing again afterwards because spreading lengthens wires. I do not ignore it: congestion becomes detours, shorts and DRCs after routing, when it is much more expensive to fix.
Follow-up questions: 1. When would you raise global congestion effort instead? 2. What is overflow?
Follow-up answers: 1. When the problem is spread over the whole block rather than a few hotspots. 2. Routing demand minus supply in a gcell, in tracks.
Why the interviewer asks: the three look similar and behave differently; mixing them up is common.
Expected answer: Cell padding applies to every instance of a library cell, for example high pin-count multiplexers, and stays honoured by CTS and optimisation until removed. Instance padding applies to named instances and is honoured by detail placement only when the honour option is set. Module padding spreads all cells of one module by a factor, for example 1.2 gives about 20% more area, and works in global placement only.
Follow-up questions: 1. Why do checkPlace and timeDesign report different utilisation on a padded design? 2. When would you remove cell padding?
Follow-up answers: 1. checkPlace counts padding as used area, timeDesign ignores it. 2. When the area is needed later or the padding was only for a congestion phase.
Why the interviewer asks: it links DFT, placement and hold in one question.
Expected answer: The chain order from synthesis ignores physical positions. Reordering by location shortens scan wiring and reduces congestion, and scan connections are ignored in global placement so they do not distort it. The risk is very short scan paths between neighbouring flip-flops, which often become hold violations in scan mode after CTS.
Follow-up questions: 1. What input does reordering need? 2. Why ignore scan connections in global placement?
Follow-up answers: 1. The scan chain information, usually a scan DEF. 2. They are not timing relevant in functional mode and would pull flip-flops away from their functional logic.
Why the interviewer asks: it checks run-to-run discipline.
Expected answer: If the tool breaks a loop, it disables one arc of its choice, and it might pick a different arc in another run. WNS then changes between runs for no physical reason and results cannot be compared. Breaking the loops in the SDC with set_disable_timing makes every run analyse the same graph.
Follow-up questions: 1. Which command reports loops? 2. Is a broken loop verified for timing?
Follow-up answers: 1. check_timing. 2. No; timing through the disabled arc is not checked, so the loop needs a functional reason to be safe.
Why the interviewer asks: it checks whether you think in wires, not only in fanout.
Expected answer: The driver is far from its loads, often because the loads are pulled towards other logic they connect to more strongly. Wire delay grows roughly with the square of length, so the transition degrades fast. I would add repeaters, size the driver, or guide the logic closer. I would also check the net is not dont_touch, which stops optimisation from touching it.
Follow-up questions: 1. Why does splitting a wire in two help so much? 2. When would you clone instead?
Follow-up answers: 1. Two half-length segments each cost about a quarter of the full wire, so even with a repeater the total drops. 2. When the loads sit in two distant groups; each clone drives a short local net.
Level 3: Advanced (5 to 8 years)
Why the interviewer asks: it tests knowledge of clock gating timing and of the flow.
Expected answer: With ideal clocks, paths into clock gates look better than they are, because a gate's real clock arrives earlier than its flip-flops' clock. The early clock flow clusters the sinks and annotates latencies during place_opt_design, so optimisation sees closer to real clock timing and makes useful skew decisions. The risk is in the setup: the CTS specification must exist before placement and must not be deleted before ccopt_design, or the useful skew decisions are lost.
Follow-up questions: 1. Which path group shows the problem first? 2. Does an incremental place_opt_design rebuild the early tree?
Follow-up answers: 1. reg2cgate. 2. No, it reuses the existing tree and only adjusts useful skew through virtual delays.
Why the interviewer asks: it checks whether you understand slack borrowing, not only the term.
Expected answer: It shifts the clock arrival at selected flip-flops so a failing stage borrows slack from its neighbour. For example, delaying the clock at FF2 by 50 ps turns a -40 ps path into it into +10 ps, and a +60 ps path out of it into +10 ps. The catch: the next stage loses the same amount, hold on the borrowing path gets worse, and the gain is real only if CTS implements the offsets.
Follow-up questions: 1. Why can useful skew not fix a whole design? 2. Which check gets worse on the capture side?
Follow-up answers: 1. It moves time, it does not create it; a loop of failing stages has nowhere to borrow from. 2. Hold on the path whose capture clock was delayed.
Why the interviewer asks: it tests judgement about over-constraining.
Expected answer: Whether the fence is too small, giving high density inside; whether it sits far from the logic it talks to, giving long wires at its boundary; and whether optimisation honours fences in this setup. If the fence exists only to keep the module together, a region or a guide often gives the grouping without the hard boundary.
Follow-up questions: 1. When is a fence really needed? 2. Difference between a region and a fence?
Follow-up answers: 1. For a power domain or a block that must be hardened separately. 2. In a region other cells may enter; a fence is exclusive.
Why the interviewer asks: correlation is where experience shows.
Expected answer: First I compare the same path before and after routing to see where the delay grew: wire delay, a detour, or crosstalk. If wires are consistently longer than estimated, the pre-route RC scale factors or the DRV margin need tuning. If only some nets grew, they usually cross congested areas, so the real fix is the congestion at placement. Crosstalk appears only after routing, so its share has to be fixed later or margined earlier.
Follow-up questions: 1. How does a DRV margin help correlation? 2. Why look at congestion for a timing problem?
Follow-up answers: 1. It tightens transition and capacitance limits before routing, which absorbs part of the later degradation. 2. Congested nets are detoured, and detours add wire the placer never saw.
Why the interviewer asks: it tests iteration strategy.
Expected answer: When the placement is mostly good and the change is local: a new blockage, padding, a few constraint updates. place_opt_design -incremental keeps the checked decisions and works around critical paths and congestion; it also honours new density screens. A full rerun is for large changes, such as a new floorplan, new macro positions or a new netlist.
Follow-up questions: 1. Which incremental option avoids moving cells? 2. Can congRepair be used after post-CTS optimisation?
Follow-up answers: 1. -incremental_timing. 2. It is not recommended; it moves many cells, which disturbs the built clock tree.
Level 4: Expert (8+ years: Senior, Lead, Staff)
Why the interviewer asks: leads have to order work, not only do it.
Expected answer: I fix congestion first unless the timing failures are structural. Congestion that survives placement turns into detours and DRCs that also destroy timing, so timing fixes on top of it are not stable. I check whether the two problems share a cause, often a macro placement or a dense module, and fix that cause. If timing fails even at zero wire load, the problem is logic depth, and I take it back to synthesis or architecture instead of spending placement iterations on it.
Follow-up questions: 1. How do you prove a timing problem is structural? 2. What do you report to the team?
Follow-up answers: 1. Zero wire-load timing of the cone: if it fails there, placement cannot help. 2. The cause, the options with their cost, and which stage each fix belongs to.
Why the interviewer asks: it tests planning under a constraint you cannot remove.
Expected answer: I would make the room before placement: review macro placement and channels, and check the don't-use list and cell choices so optimisation does not grow the design. During placement I would control density locally rather than globally, use cell padding only where pin access needs it, keep area recovery on with a slack target that protects near-critical paths, and watch the growth after each step. I would also agree early with the team on how much room CTS and hold fixing need, because they come last and have no other place to go.
Follow-up questions: 1. Which cells grow the design most after placement? 2. Why local density control?
Follow-up answers: 1. CTS buffers and hold buffers. 2. A global limit spreads everything; local control spends area only where the hotspots are.
Why the interviewer asks: staff roles multiply through others.
Expected answer: A gate before placement with fixed checks and a gate after it with fixed evidence, both scripted, so every run produces the same reports. Modes printed into the log, a saved database before every big step, one change per iteration with a short note of why. A shared debug table like the one in Section 7, and a habit of reading the worst five paths rather than the summary line.
Follow-up questions: 1. The single habit that helps a junior most? 2. What do you never allow?
Follow-up answers: 1. Reading full timing paths until they can predict where the delay is. 2. Moving to CTS with an unexplained placement report.
Why the interviewer asks: senior engineers must push back upstream with evidence.
Expected answer: If the hotspot stays at the same place across different placement settings, sits at macro corners, channels or along pins that face a wall, and local placement fixes only move it a little, it is structural. I would show the congestion map with the macro pins overlaid, try an alternative macro orientation or channel width as a quick experiment, and bring the result to the floorplan owner with the cost of each option.
Follow-up questions: 1. What is the quickest experiment? 2. Why bring options and not only the problem?
Follow-up answers: 1. A placement run on a floorplan with one macro rotated or one channel widened. 2. It turns a complaint into a decision, and the floorplan owner can weigh the cost.
09Chapter Summary #
Placement turns a netlist into positions, and with positions come real wire lengths, a congestion picture and the first timing report that can be trusted. We saw that most bad placements come from bad inputs, so a gate of library, netlist, constraint, floorplan and physical cell checks comes first. We then looked at what place_opt_design does inside, why wire length costs more than distance suggests, and twelve techniques for timing, congestion, density, guidance, netlist changes, clock and scan awareness, power and incremental runs. Each technique has a cost, and several of them pull against each other, which is why they are applied in response to a report rather than all at once.
Getting placement wrong is expensive in a chain: congestion that survives becomes detours, detours become timing failures after routing, and those become late ECOs and a moving tapeout date. A clean exit gate before CTS is what breaks that chain. In the next stage, clock tree synthesis, the ideal clock assumption ends; the reg2cgate paths, the useful skew offsets and the room left for buffers all come back into play.
10Top 15 Quick Revision Questions #
- Placement in one line? Mapping cells to legal row sites so timing, congestion and density all agree.
- Global vs detail? Rough, overlapping, spread positions vs legal sites with local improvement.
- Legalisation command?
refinePlace, called byplace_opt_designat the end. - First step inside place_opt_design? Removing synthesis buffer trees.
- Utilisation vs density? Whole-block ratio vs ratio inside one bin.
- Why zero wire-load timing first? If it fails there, placement cannot fix it.
- Why break loops in SDC? So every run analyses the same timing graph.
- Hard, soft, partial blockage? Nothing; no placement but buffers in opt; density limit.
- Fix for a crowded macro channel? Soft blockage plus halos, and a look at macro pins.
- Guide, region, fence? Preference; module inside, others allowed; module only, all inside.
- Overflow? Routing demand minus supply in a gcell.
- Why clock-gate-aware placement? Real ICG clock arrives early, so its enable path has less time.
- Useful skew catch? Moves slack, worsens hold on the borrowing path, needs CTS to implement it.
- Scan reorder risk? Short scan paths become hold violations after CTS.
- Incremental vs full rerun? Local change vs new floorplan, macros or netlist.
11Important Definitions #
| Term | Definition |
|---|---|
| Global placement | First placement step: rough positions that minimise wire length and spread cells; overlaps allowed. |
| Detail placement | Second step: legal sites in rows, no overlaps, local improvement for timing, wire length and congestion. |
| Legalisation | The part of detail placement that only makes the placement legal (refinePlace). |
| Utilisation | Standard cell area divided by the area available to standard cells. |
| Density (bin) | The same ratio measured inside a small window of the core. |
| gcell | A global routing tile with a fixed number of tracks per layer and direction. |
| Overflow | Routing demand minus supply in a gcell; a cluster of overflowing gcells is a hotspot. |
| Halo | Keep-out ring around a macro where standard cells may not be placed. |
| Channel | Narrow gap between macros, with few routing tracks. |
| Placement blockage | Area where placement is forbidden (hard), deferred to optimisation (soft) or density-limited (partial). |
| Padding | Reserved free sites around a library cell, an instance or a whole module. |
| Guide / region / fence | Constraints from soft preference to hard exclusive area for a module. |
| High fanout net | A net with many loads, such as reset, that needs a buffer tree. |
| Cloning | Duplicating a driver so each copy drives a nearby group of loads. |
| Integrated clock gate (ICG) | A cell that gates a clock with an enable; its clock arrives earlier than its flip-flops' clock. |
| Early clock flow | Innovus flow that clusters clock sinks and annotates latencies during placement. |
| Useful skew | Intentional clock arrival shift that moves slack between neighbouring stages. |
| Scan reordering | Re-stitching scan chains by physical position after placement. |
| Path group | A set of paths that optimisation treats with its own effort and targets. |
| WNS / TNS | Worst negative slack / total negative slack, counted per endpoint. |
12Important Commands #
| Command | Purpose |
|---|---|
checkDesign -all | Library, netlist, P/G and floorplan integrity report |
checkNetlist · checkUnique | Netlist health; unique module instantiation |
check_design -type place | Placement preconditions: rails, pin access, taps, termination cells |
check_timing -verbose | Missing clocks, unconstrained endpoints, loops |
timeDesign -prePlace | -preCTS | Zero wire-load baseline; pre-CTS timing with early global route |
checkFPlan -reportUtil | Floorplan checks with target and effective utilisation |
addHaloToBlock | Keep-out ring around macros |
addEndCap · addWellTap · addTieHiLo | Physical cells before and after standard cell placement |
createPlaceBlockage -type hard|soft|partial | Steer the placer away from areas |
createGuide · createRegion · createFence | Module grouping from soft to hard |
place_connected -attractor | Pull connected logic towards a macro or I/O |
specifyCellPad · specifyInstPad | Padding for library cells or instances |
specifyNetWeight | Priority weight for a net in placement |
createBasicPathGroups -expanded | Standard path groups |
setPathGroupOptions | Effort, slack adjustment and target per group |
setPlaceMode · setOptMode · setDesignMode | Placement, optimisation and flow-level settings |
place_opt_design (-incremental) | Placement plus pre-CTS optimisation; incremental improvement |
optDesign -preCTS -incr | Incremental setup optimisation |
refinePlace · checkPlace | Legalise; check legality |
reportDensityMap · reportCongestion | Density bins; hotspots and per-layer congestion |
congRepair | Spread cells at hotspots (not after post-CTS optimisation) |
report_scan_chain · reportVtInstCount | Scan chain lengths; Vt distribution |
13Quick Revision Notes #
| Stage | Do this | Watch for |
|---|---|---|
| Data | checkDesign, checkNetlist, checkUnique | Cells without LEF or Liberty, floating inputs |
| Constraints | check_timing, timeDesign -prePlace | Missing clocks, loops, failing even at zero wire load |
| Floorplan | Macros fixed, halos, channel blockages, checkFPlan | Placed (not fixed) macros, pins facing walls |
| Physical cells | End caps, then well taps, before placement | Fillers added too early |
| Inputs | Scan DEF, don't-use list, CTS spec for early clock | Skipped reordering, banned cells used |
| Setup | Path groups, fanout fixing, DRV margin, modes logged | Slack adjustments on every group |
| Run | place_opt_design, then addTieHiLo | Large legalisation displacement |
| Timing | Read worst 5 paths per group | reg2cgate optimism, long wires, dont_touch nets |
| Congestion | reportCongestion -hotSpot -3d | Hotspots at macros, crossbars, channels |
| Density | reportDensityMap -threshold 0.75 | Bins near 100%, padding differences |
| Fix locally | Partial blockage, padding, guide, incremental run | Fences too small, global effort for local problems |
| Exit | All exit gate rows PASS, saveDesign | No room left for CTS and hold buffers |
Fix the inputs before placing. Change one thing at a time and save a database before each big step. Read the worst paths, not only the summary.
The Innovus PnR guides go deeper into the rest of the flow, and the interview Q&A on PrepSprint can be read free on the web.
The same handbook, print-ready
The 47-page A4 PDF edition, with every figure and table at full size. Free.
Free interview practice
Practise interview questions on this topic
- What is standard cell placement, and what are its primary goals? Beginner
- What is Half-Perimeter Wire Length (HPWL), and why is it used in Global Placement? Beginner
- What is the difference between Core Utilization and Local Placement Density? Beginner
- What is Placement Cell Padding, and how does it relieve routing congestion? Beginner
- What's the actual difference between a cluster and a region as global placement grouping mechanisms? Beginner
- How do modern analytical and force-directed global placement algorithms work? Intermediate
- How does Scan Chain Re-ordering work, and why is ScanDEF necessary during placement? Intermediate
- What design rules and site constraints does Placement Legalization verify? Intermediate
- What is Multi-Bit Flip-Flop (MBFF) Banking, and why is it performed during placement? Intermediate
- How do you analyze and debug placement routing congestion heatmaps? Intermediate
Premium libraries
Go deeper with the pdVerse libraries
Free 8-stage ICC2 PnR walkthrough: library setup to GDS output, with the real command driving each stage. Plus the full 8-chapter mentor guide.
Free to read · PDF ₹199 14 chaptersDesign Planning HandbookMaster VLSI physical design planning. Read 14 chapters free online or get the complete PDF bundle with floorplanning, power, CTS & timing budgeting.
Free to read · PDF ₹179 10 chaptersSTA LibrarySTA checks every timing path for setup and hold without simulation. See slack, Liberty delay tables and PrimeTime reports explained, free, no login.
Full bundle ₹199 9 chaptersTiming Constraints (SDC) LibrarySynopsys Design Constraints handbook: create_clock, generated clocks, I/O delays, clock groups, false paths, multicycle paths, and SDC linting.
Full bundle ₹179 10 chaptersMMMC LibraryMMMC / MCMM timing signoff: modes vs corners, PVT, RC parasitics, analysis views, ICC2 vs PrimeTime correlation, and scenario explosion.
Full bundle ₹179 9 chaptersLow Power LibraryLearn low-power VLSI design through practical eBooks on power domains, isolation, level shifting, retention, UPF and multivoltage implementation.
Full bundle ₹179 13 guidesSignoff Academy13 ASIC signoff guides: DRC, LVS, ERC, antenna, metal fill, extraction, STA/SI, CLP, EM/IR, LEC, and tapeout handoff evidence.
Full bundle ₹179