Skip to content
Ch 02 / 8 Chapter 2: Creating the Floorplan
โ† Prev Next โ†’
Detailed Design Analysis / Floorplan ICC2 Implementation Mentor Guide

Detailed Design Analysis

Floorplan in ICC2: A Mentor Guide

How a linked, checkable block becomes a die with rows, tracks, placed macros, a compiled power network, and assigned pins — taught the way a senior engineer would explain it at the whiteboard.

Teaching project: Nimbus‑8 Stage 2 of 8 Beginner → working engineer
An abstract illustration of a chip die holding four macro blocks โ€” two SRAM macros, a DDR PHY, and a core region โ€” connected by light dashed routing lines, labelled Nimbus-8 teaching project.
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 linked, checkable ICC2 block with no shape at all, and turn it into a die with a legal core, rows, and routing tracks; hard macros placed where a reviewer would expect them; a compiled power network; and pins assigned on the right sides, in the right order — and you will be able to prove each of those claims with the tool's own reports, not your impression of the layout view.

Concretely, you will be able to: create an initial floorplan with initialize_floorplan and explain what "core" and "die" mean as distinct, related boundaries; define rows and routing tracks and tell a legal site grid from an illegal one; place hard macros relative to one another with a named, reproducible offset instead of dragging them by eye; reserve space with the correct blockage strength for the stage you actually need to affect; compile a first power network and insert a power switch into a switched domain; assign block-level pins with defensible side, spacing, and layer rules; and compute utilization the way the tool computes it, not by eyeballing a picture.

None of this is about memorizing flags. It is about building the same mental model of "the floorplan is ready" that a design planning lead uses when deciding whether a block is safe to hand to placement — so that when placement congestion or a routing DRC shows up two stages later, you already know which floorplan decision to go back and question first.

Why this stage matters

Why this stage matters in the full flow

A floorplan is the one decision in the whole flow that almost nothing downstream can cleanly undo. Placement can be re-run. Clock tree synthesis can be re-balanced. Routing can be re-attempted with different effort. But a die that is too small for its macros, a macro placed against the wrong edge, or a power ring that leaves a corner starved is a geometry problem, and geometry problems propagate forward as congestion, timing closure difficulty, and IR drop — not as a clean error message at the stage that actually caused them.

This is also the first stage in this guide that produces something you can look at and be wrong about. A floorplan that looks reasonable in the layout view can still have macros placed without a real keepout margin, rows that do not actually align to the site grid at every macro edge, or a power network that is topologically fine but electrically thin in one quadrant. The habit this chapter builds — report before opinion — matters more here than anywhere so far, because floorplan mistakes are the ones a whiteboard sketch cannot catch.

Stage boundary

What enters, what must leave

Stage boundary for Floorplan
Enters this stageMust leave this stage
A linked, saved block with no floorplan shape (or a DEF-derived shape awaiting validation)A die with a legal core, rows, and routing tracks, validated against the site grid
Hard macros in the netlist with no placementEvery hard macro placed, keepout-protected, and legal against its neighbors
Committed power intent (multivoltage) or a default power domain (single-voltage)A compiled power network: rings, mesh, rails, and switches where a domain calls for them
Block-level pin intent (sides, layers, spacing, bundles) from the interface specificationPins assigned to real physical locations, consistent with that intent
A target core utilization from the design planning ownerAn achieved utilization figure the tool computed, not an estimate

What does not leave this stage: standard cells placed, a clock tree, or detailed routing. Those belong to Placement and Optimization, Clock Tree Synthesis, and Routing, in that order. This chapter's exit gate is a shape the placer can trust, not a placed design.

Prerequisite knowledge

What you should already be comfortable with

  • Everything from Preparing the Design: a linked block, committed power intent where applicable, and a first set of physical and optimization constraints.
  • Basic geometry: rectangles, offsets, and the idea of a coordinate grid with an origin at the lower-left.
  • What a hard macro is — a pre-designed, fixed-shape block such as an SRAM or a PHY — as distinct from a standard cell.
  • Basic Tcl, as used throughout this guide: variables, lists, and running a command with options from icc2_shell.

You do not need prior floorplanning 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 the difference between the die boundary and the core boundary, and create an initial floorplan with initialize_floorplan using either as the control reference.
  • Define rows and routing tracks, and use report_tracks to confirm what a track command actually created.
  • Distinguish channeled, abutted, and narrow-channel floorplan styles, and say what each one costs and buys you.
  • Place a hard macro relative to another object with set_macro_relative_location, and run floorplan-stage placement with create_placement -floorplan.
  • Choose the correct placement blockage strength for the stage you actually need to affect, and explain why "it shows up in the layout view" is not proof a blockage is doing what you think.
  • Compile a first power network with compile_pg and insert a power switch into a switched domain with create_power_switch.
  • Set block-level pin constraints and place pins with a defensible, reviewable rationale for every side, layer, and spacing choice.
  • Compute achieved core utilization the way the tool computes it, and use modify_die_area to correct a die that misses its target.
Beginner mental model

Think of it as laying out an unfurnished apartment's floor plan

Analogy. In the last chapter you confirmed the lease and checked the utilities. Now you actually draw the floor plan: where the walls go (the die and core boundary), where the floorboards run (rows and tracks — the grid everything else will snap to), where the built-in furniture goes that cannot move once installed (hard macros — the SRAM and DDR PHY), where the electrical wiring and breaker panel go (the power network), and where the doors and windows are cut into the walls (pins). You still are not moving in the everyday furniture — the standard cells — that is next chapter's job. What you need here is a floor plan a contractor could bid on without guessing.

Engineering translation. "Drawing the walls" is initialize_floorplan, choosing whether you are dimensioning the core or the die. "Floorboards" is create_track and derive_tracks, which must align to the site grid the technology file defines. "Built-in furniture" is macro placement, most defensibly done with set_macro_relative_location so a second engineer can see exactly why a macro sits where it does. "Wiring" is compile_pg and, for switched domains, create_power_switch. "Doors and windows" is pin assignment with set_block_pin_constraints and place_pins.

Vocabulary

Terms this chapter depends on

Core vocabulary for Floorplan
TermPlain-English meaning
Die boundaryThe outer physical edge of the chip, including any margin reserved for I/O pads or a pad ring.
Core boundaryThe inner boundary that holds standard cells and macros, typically inset from the die by a core offset.
Site array / rowThe grid of legal standard-cell placement sites, laid out as horizontal rows across the core.
Routing trackA line on a routing layer, at a defined pitch, that wires on that layer are expected to align to.
Channeled / abutted / narrow-channel floorplanThree floorplan styles distinguished by whether space is left between blocks for top-level cells and routing.
Hard macroA pre-designed, fixed-shape physical block, such as an SRAM instance or the DDR PHY, that placement cannot resize or restructure.
Relative placement constraintA rule that fixes one macro's position as an offset from a named anchor object, instead of an absolute coordinate.
Placement blockageA named region with a declared strength that limits what can be placed inside it, and during which stages.
Power ring / mesh / railThe three tiers of a compiled power network: a ring around the core perimeter, a coarser mesh crossing the interior, and fine rails feeding standard cells directly.
Power switchA cell inserted between an always-on supply and a switched domain's rail, turned on and off by a control signal.
Block pin constraintA rule restricting which sides, layers, and spacing a block's or design's pins may use.
Core utilizationThe fraction of the core area actually occupied by standard-cell and macro area, computed from real geometry, not assumed.
Stage flow diagram

The Floorplan pipeline

Figure 1 — The Floorplan pipeline Seven boxes connected left to right: linked block; initial floorplan; rows and tracks; macro placement; power planning; pin assignment; validated floorplan. Each arrow is a gate the tool must clear before the next stage is trustworthy.
Read it: as in the previous chapter, each arrow is a verification gate, not just a handoff. A command completing without error means the database changed; it does not mean the change is what you intended.
Inputs and outputs

What comes in, what must go out

Inputs to Floorplan
ItemOwnerFormatRequired?ValidationFailure impact
Linked, saved blockPreparing the Design (this engineer, previous chapter)Design library checkpointRequiredopen_lib succeeds; current_block matches the manifestFloorplanning an unverified block re-surfaces problems this guide's previous chapter exists to catch
Technology file and site definitionsLibrary / PDK teamTechnology file with site and layer dataRequiredreport_tracks and floorplan reports show real site and layer names, not defaultsAn unresolved or default site definition produces a floorplan that looks fine but is not legal on the real grid
Target core utilization and die size guidanceDesign planning leadA single ratio, or a fixed die dimensionRequiredUsed directly as -core_utilization or -side_length to initialize_floorplanGuessing a utilization target produces a die that is either too tight to route or wastes area
Hard macro list with placement intentArchitecture / design planningA macro table with relative or fixed placement rulesRequired if hard macros existreport_macro_relative_location matches the table exactlyUnplanned macro placement produces routing congestion that looks like a placement bug three stages later
Power domain and switching intentPower architecture teamUPF (already committed in the previous chapter) plus a power planning strategyRequired for any domain that is switched or has a distinct voltagecompile_pg succeeds with no unresolved strategy; every switched domain's power switch confirmed against the power architecture owner's domain listAn uncompiled or thin power network shows up as IR drop or a missing power pin far downstream
Block-level pin intentInterface / integration ownerA pin table: sides, layers, spacing, bundlesRequiredreport_block_pin_constraints matches the tableUnplanned pin placement produces long top-level routes and awkward feedthroughs at integration
Outputs from Floorplan
ArtifactConsumerPersistenceHandoff rule
Legal die, core, rows, and tracksPlacement and Optimizationsave_lib checkpointNever hand off a floorplan that has not been re-validated after the last edit
Placed, keepout-protected hard macrosPlacement, CTS, routingStored in the blockEvery macro's placement should be traceable to a named constraint, not a manual drag
Compiled power networkEvery later stageStored in the blockRe-run compile_pg and network-integrity checks after any floorplan edit that moves a macro or blockage
Assigned pinsIntegration, top-level routingStored in the blockDocument any pin that was placed manually outside the bundle constraints, with a reason
Achieved utilization figureDesign planning, Placement and Optimizationreport_utilization output kept with the checkpointReport the achieved number; never carry the target number forward as if it were measured
Figure 2 — Input and output handoff map Four input boxes on the left โ€” linked block, technology and site data, macro and power-domain intent, pin intent โ€” feed into a central Floorplan box, which produces four output boxes on the right consumed by Placement and Optimization: legalized rows and tracks, placed and keepout-protected macros, a compiled power network, and assigned pins.
Read it: the same discipline as the previous chapter applies — nothing on the right exists without a validated item on the left. A macro placed with no traceable constraint is not really an output yet, even if it appears in the layout view.
Readiness checklist

Before you open icc2_shell

  • You have a target core utilization or a fixed die size from design planning, not a guess.Evidence: a one-line utilization or dimension target, with its source named.
  • You know which hard macros exist and have at least a rough placement intent for each one.Evidence: a macro table with names, sizes, and either fixed coordinates or a relative-placement rule.
  • You know which power domains are switched, and which strategy each one should compile against.Evidence: confirmation from the power architecture owner, matching the UPF committed in the previous chapter.
  • You have a pin intent table for this block's sides, layers, and spacing, even in draft form.Evidence: a pin table from the interface owner, or your own draft awaiting review.
Concepts in dependency order

Building the shape, one dependency at a time

1. Flow boundary and the floorplan database model

Everything in this chapter operates on the same block object the previous chapter linked and saved — floorplanning does not create a new design, it adds physical geometry to an existing one. Before this chapter, the block has no die, no core, no rows, no tracks: every coordinate-based command in this chapter would either error or silently operate on an undefined space. The first real action in this chapter, initialize_floorplan, is what gives the block a coordinate system at all.

Once a floorplan exists, ICC2 tracks it as a set of distinct, related objects: a die boundary, a core boundary, a site array (rows), and independently-managed routing tracks per layer. Commands that change one of these do not automatically change the others — resizing the die does not resize the core unless you ask it to, and neither resizes the routing tracks, which is why modify_die_area and create_track/derive_tracks stay separate concerns throughout this chapter.

2. Channeled, abutted, and narrow-channel floorplans

ICC2 supports three named floorplan styles for hierarchical designs with multiple blocks. A channeled floorplan leaves open space between blocks so the tool can place top-level standard cells and route freely in the gap. An abutted floorplan pushes blocks directly against one another, leaving no room for top-level cells; this avoids wasted area but usually requires over-the-block routing and much more careful clock and feedthrough planning. A narrow-channel floorplan is a deliberate middle ground: some block edges abut, while a narrow channel is reserved only where a specific purpose — typically top-level clock routing — actually needs one.

Figure 3 — Channeled, abutted, and narrow-channel floorplan styles Three side-by-side die outlines. Channeled: blocks with open channels between them for top-level standard cells. Abutted: blocks touching with no channel, requiring over-the-block routing. Narrow-channel: a mix, with some block edges abutted and a narrow channel reserved only where needed.
Read it: Nimbus‑8 in this guide is a single flat block with hard macros, not a multi-block hierarchy, so these styles apply to it only in miniature — the keepout margins around its SRAM macros and DDR PHY play the same "reserve exactly what you need" role a channel plays between blocks.

3. Creating the initial floorplan

initialize_floorplan is the command that gives a linked block its first die boundary, core boundary, site array, and wire tracks in one step. It accepts a -control_type of either core (the default) or die: with core, you specify the core's dimensions and the tool adds the core offset outward to compute the die; with die, you specify the die's dimensions and the tool subtracts the core offset inward to compute the core. Either the exact side lengths (-side_length) or a target utilization (-core_utilization) can drive the sizing, and non-rectangular shapes — L, T, and U — are supported through -shape for designs that need them.

For Nimbus‑8, the core dimension is already fixed by the project's floorplan target at 3.20 mm × 3.20 mm, so this chapter uses -control_type core with an explicit -side_length and a modest -core_offset for the die-to-core margin, rather than deriving the die from a utilization target. Utilization arithmetic, below, shows how utilization is used here in reverse — as a validation check on the achieved density, not as the input that sized the die.

4. Rows, site arrays, and routing tracks

initialize_floorplan creates a default site array and a first set of tracks, but real designs routinely need to redefine tracks explicitly — for a nondefault routing rule, a specific pitch, or a layer the default pass did not cover correctly. create_track creates tracks on a named layer with an explicit pitch (-space), track count, and starting offset; remove_tracks clears existing tracks before a clean re-creation; report_tracks reports the direction, start point, count, and pitch of every track set in the design, which is the only reliable way to confirm a track command did what you intended rather than what you typed.

Where track constraints have already been defined (through set_track_constraint, out of this chapter's scope but worth knowing by name), derive_tracks generates tracks automatically from those constraints across one or more layers, which is less error-prone than hand-specifying pitch and offset per layer once a project has standardized its track rules.

Figure 4 — Die and core anatomy with a rows-and-tracks inset A die boundary containing a core area offset inward on all four sides, with a zoomed inset showing standard-cell rows, wire tracks, and a hard macro sitting on the site grid.
Read it: rows are the horizontal lines standard cells snap to; tracks are the vertical lines wires on a given layer snap to. A macro placed off either grid is a legality problem the tool will eventually refuse to route around, not a cosmetic one.
Figure 5 — Row and track pitch detail A zoomed grid showing standard-cell rows on the site pattern, with the row height dimensioned, and vertical wire tracks on one metal layer with the track pitch dimensioned, plus the create_track and derive_tracks calls that produced them.
Read it: row height comes from the technology's site definition; track pitch is whatever create_track -space or the derived constraint says. Neither is arbitrary, and report_tracks is how you confirm the pitch you see here is the pitch actually in the database.

5. Adjusting die size, aspect ratio, and utilization target

A floorplan is rarely right on the first attempt. modify_die_area resizes the core or die of an existing floorplan without starting over: by an explicit scaling factor on area, height, or width; by a target -core_utilization, which the tool uses to compute how much resizing is needed; or by -sizing_type, which fixes one dimension (width, height, or aspect ratio) while the tool solves for the other. -fixed_edges lets you pin specific sides so a resize grows only in the direction you intend, which matters when a macro or pin is already placed against an edge you do not want to move.

6. Utilization arithmetic: from cell area to achieved density

Utilization is not a setting you choose once and trust — it is a measured ratio the tool computes from real geometry with report_utilization: the standard-cell and macro area actually present, divided by the core area actually defined. For Nimbus‑8, working from this guide's fixed teaching numbers (9.90 million standard cells, 72 SRAM macros, one DDR PHY macro, on a 3.20 mm × 3.20 mm = 10.24 mm² core), the worked example below computes an achieved utilization of roughly 82%, with macro area alone accounting for about 24% of the core.

Figure 6 — Floorplan utilization arithmetic Three stacked horizontal bars at one scale โ€” standard-cell area, macro area, and core area โ€” plus the utilization formula and Nimbus-8's worked numbers: (5.94 + 2.45) divided by 10.24 equals 81.9 percent.
Read it: the core-area bar is the capacity, not a measured quantity; the other two bars are what is actually occupying it. A target utilization from design planning is a plan for this bar chart, not a substitute for measuring it after macros are placed.

This is also where a target utilization set earlier (as a -core_utilization argument to initialize_floorplan or modify_die_area) gets checked against reality: those commands use the target to size or resize the die before anything is placed; report_utilization tells you what actually landed once macros and standard cells occupy real space.

7. Setting macro constraints and keepouts

Hard macros carry their own constraint surface, separate from ordinary placement blockages: a macro can be given an orientation, a legal placement region, and a keepout margin using the same create_keepout_margin command introduced in Preparing the Design. In a floorplan context, that margin is almost always what keeps the placer from butting a standard cell directly against a macro's pin edge, which is one of the most common sources of legalization failures once real placement begins.

8. Relative macro placement

set_macro_relative_location is the command that makes macro placement reviewable instead of anecdotal: it fixes a target macro's position as a named offset from a named anchor object's corner, rather than an absolute coordinate a second engineer has no way to sanity-check without re-deriving it. The target can be a hard macro or a macro array; the anchor can be another hard macro, a block, an I/O pad, a voltage area, or the core area itself if no anchor is given. report_macro_relative_location confirms the constraint is recorded exactly as intended before anything is placed against it.

Figure 7 — Macro relative placement: target, anchor, corner, and offset An anchor macro with its top-left corner marked, and a target macro whose bottom-left corner is placed a fixed X and Y offset away from the anchor's marked corner.
Read it: the constraint names four things explicitly — which corner of the anchor, which corner of the target, and the X and Y offset between them. Nothing about this placement depends on where the anchor itself happens to sit.

9. Running floorplan-stage placement

Defining relative-placement constraints does not, by itself, place anything — create_placement -floorplan is the command that actually executes macro placement, honoring every set_macro_relative_location constraint in force and applying floorplan-tuned effort and congestion controls distinct from ordinary coarse placement. This is also the point where application options such as plan.macro.style (on-edge, freeform, or an automatic mix) and plan.place.auto_create_blockages (automatic thin-channel blockage creation between macros) start to matter, though this chapter treats their defaults as adequate for Nimbus‑8 and flags them by name for later tuning rather than covering every option in depth.

10. Reserving space with placement blockages

Placement blockages, introduced for physical constraints in the previous chapter, do real work at the floorplan stage: reserving a region for a future macro that has not been placed yet, protecting a thin channel between two hard macros from being silently filled with standard cells, or capping density near a pad ring margin with a partial blockage instead of forbidding placement outright. The strength you choose determines which later stages honor it — a distinction that matters more here than anywhere else in the flow, because a floorplan-stage blockage chosen at the wrong strength quietly stops protecting its region the moment legalization or optimization runs.

Figure 8 — Placement blockage strength gallery Four columns โ€” hard, soft, partial, and category blockages โ€” each showing which stages, coarse placement, legalization, optimization, and CTS, honor that blockage strength. Hard is honored in all four; soft, partial, and category are honored only in coarse placement by default.
Read it: only a hard blockage survives past coarse placement by default. If a region must stay clear through legalization and CTS — a routing channel you are protecting for a purpose, say — soft or partial is the wrong strength no matter how convincing it looks in the layout view today.

11. Power planning interfaces: domains, PG nets, and routing mode

Floorplan is where the power intent committed in the previous chapter becomes physical. connect_pg_net, already introduced for logical PG connectivity, is the same command used here as the entry point into physical power planning — without real connectivity in place, there is nothing for a compiled power network to attach to. From there, the design's PG routing mode (which strategy patterns are legal, and on which layers) is set up through the power planning strategy commands this chapter treats as configuration, deferring their full option surface to the reference documentation, and used directly by compile_pg in the next concept.

12. Building the power network: rings, mesh, and rails

compile_pg is the single command that builds the actual power and ground network — straps, rings, macro connections, standard-cell connections, and vias — from one or more named power planning strategies you have defined in advance. It supports an -ignore_drc escape hatch for exploratory passes, a -show_phantom preview mode, and an -undo option for backing out a strategy that did not work, but the default, careful path is: define a strategy, compile it, and check the result before moving on.

Figure 9 — Power ring, mesh, and standard-cell rail pattern A core area with a power and ground ring around its perimeter, a coarser mesh of straps crossing the interior on upper metal layers, and fine standard-cell rails at the bottom of the stack, with vias connecting each layer down to the rails.
Read it: three tiers, three purposes. The ring feeds the mesh at the boundary, the mesh distributes current across the die on layers that can carry it, and the rails deliver it to individual standard-cell rows. A gap at any tier shows up as IR drop, not as a routing error.

13. Inserting power switches for switched domains

A switched power domain needs an actual switch cell between its unswitched input supply and the switched rail its cells connect to — create_power_switch defines that cell: its domain, its input and output supply ports, its control port (the signal that turns it on and off), and optionally an acknowledge port, on/off states, and resistance characteristics for the cells it represents. This is a UPF-adjacent, power-architecture-defined object, not a purely physical one — the switch's electrical behavior comes from the power intent, and floorplanning is where it becomes a real, placeable, physical cell.

Figure 10 — Power switch inserted in a switched power domain A PD_SWITCHED domain box containing a power switch cell with an unswitched input supply pin, a switched output supply pin feeding the domain's cells, and a control pin driven from an always-on control signal, plus an open SPST switch symbol showing the conceptual on and off behavior.
Read it: the switch symbol on the right is conceptual, not a physical cell shape — it is there to make the on/off behavior legible. The real cell, on the left, has real supply and control pins that compile_pg and connectivity checks can verify.

14. Block pin constraints and pin placement

Block-level pin rules are set with set_block_pin_constraints: which layers pins may use, how much spacing separates adjacent pins, how much keepout distance protects a block's corners, and which sides are allowed or explicitly excluded. The reference documentation itself flags set_block_pin_constraints as scheduled for retirement in favor of create_block_pin_constraint in later releases — both exist in this release, and this chapter uses the still-current command while naming its replacement, exactly the kind of transition worth knowing about before it surprises you in a release upgrade. place_pins is the command that actually places pins — on specified cells, nets, pins, or ports — honoring every constraint set beforehand, with a -legalize option for adjusting existing pin placement into compliance rather than starting over.

Figure 11 — Block pin constraints: sides, spacing, and corner keepout A rectangular block with its four sides numbered 1 through 4, a corner-keepout zone marked at each corner, an allowed-layers note, and evenly spaced pin marks along the top and right sides only, with the bottom and left sides shown excluded.
Read it: sides are numbered, not named "top" or "left" by the tool — always confirm which number maps to which physical side for your current orientation before excluding one.

15. Validating the floorplan before handoff

The floorplan exit gate rests on the same principle as the previous chapter's: prove it, do not assume it. report_utilization confirms achieved density against the target. Floorplan rule validation (density, spacing, enclosure, and area rules for advanced technology nodes, covered by name here since this guide's teaching node does not require deep coverage of them) catches geometry that violates a technology-specific constraint the layout view will not visually flag. Power network integrity checks — named here, detailed further in later chapters where routing makes them fully actionable — catch missing vias and connectivity gaps. Together with the reports in Reports and how to read them, these are what actually justify a handoff to Placement and Optimization.

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.

Die, core, and rows

initialize_floorplan

Creates an initial floorplan: die, core, site array, and wire tracks, in one step.

  1. What it isCreates a die boundary, a core boundary, a default site array, and a first set of wire tracks, either coincident or offset from one another.
  2. Why you run itIt is the first command that gives a linked block a real coordinate system to place anything into.
  3. When in flowFirst in this chapter, immediately after the previous chapter's saved checkpoint is reopened.
  4. Exact Tcl
    icc2_shell> initialize_floorplan -control_type core \
       -side_length {3200 3200} -core_offset {40 40 40 40}
  5. What ICC2 changesCreates the die and core boundaries, a default site array, and default wire tracks; with -control_type core, the die is computed by adding the core offset outward.
  6. What to read back โ€” proof it took effectA floorplan report showing the die and core dimensions matching what you specified; the layout view showing a nonzero core area.
  7. Trap-control_type changes what your dimensions mean. The same -side_length value produces a smaller core under -control_type die than under -control_type core, because the offset is subtracted instead of added.
  8. If you skip itNo coordinate system exists; every later command in this chapter that references a location errors or has nothing to operate on.

create_track

Creates routing tracks for a named layer at an explicit pitch.

  1. What it isCreates a set of routing tracks on one layer, with an explicit pitch, count, starting offset, and direction.
  2. Why you run itThe default tracks initialize_floorplan creates are not always what a specific layer or a nondefault rule requires.
  3. When in flowRight after the initial floorplan exists, before macro placement.
  4. Exact Tcl
    icc2_shell> remove_tracks -all
    icc2_shell> create_track -layer METAL3 -space 0.5
    icc2_shell> report_tracks
  5. What ICC2 changesRemoves any existing tracks on the target scope, then creates a new track set on the named layer at the given pitch, starting by default at half the pitch inside the die area.
  6. What to read backreport_tracks for the direction, start point, count, and pitch actually created — not just that the command returned without error.
  7. TrapRedefining tracks after macros are placed can shift the effective pitch relative to pins that were positioned against the old grid; sequence this before macro placement.
  8. If you skip itWhatever tracks initialize_floorplan defaulted to remain in force, which is not always what the technology's routing rules for that layer actually intend.

derive_tracks

Generates tracks automatically from previously defined track constraints.

  1. What it isCreates a set of track objects for the current block that satisfy a previously defined track constraint, by layer and label.
  2. Why you run itOnce track rules are standardized as constraints, this is less error-prone than hand-specifying pitch and offset per layer with create_track.
  3. When in flowAlternative to create_track, wherever track constraints already exist.
  4. Exact Tcl
    icc2_shell> derive_tracks -layers {M1 M2} -verbose
  5. What ICC2 changesCreates tracks on the named layers that satisfy the default-label track constraint, or a named one if -labels is given.
  6. What to read backThe -verbose output during generation, plus report_tracks afterward for the same confirmation create_track needs.
  7. TrapWith no -labels, the command searches only default-label constraints in the given layers; a project-specific labeled constraint set is silently skipped unless named explicitly.
  8. If you skip itNothing breaks — this is a convenience over create_track, not a required step, unless your project standardizes on labeled track constraints.
Sizing and utilization

modify_die_area

Resizes an existing die or core area without starting the floorplan over.

  1. What it isShrinks or expands the die or core, by an explicit scaling factor, a target utilization, or a fixed sizing type, with specific edges optionally held fixed.
  2. Why you run itTo correct a floorplan that misses its utilization target, or to grow a die that congestion analysis shows is too tight, without discarding placed macros.
  3. When in flowAny time after initialize_floorplan, most often after an early utilization check.
  4. Exact Tcl
    icc2_shell> modify_die_area -core_utilization 0.80 \
       -sizing_type fixed_aspect_ratio
  5. What ICC2 changesResizes the core (and, correspondingly, the die) to approach the target utilization, holding the aspect ratio fixed unless a different -sizing_type is given.
  6. What to read backreport_utilization after the resize, compared against the target you set.
  7. TrapLarge single resizes risk excessive utilization or macros that no longer fit; the reference documentation itself recommends small increments with a routability check after each one.
  8. If you skip itA floorplan that misses its target stays missed — there is no automatic correction elsewhere in the flow.

report_utilization

Reports the achieved utilization of the current block, measured from real geometry.

  1. What it isComputes and reports the fraction of a scoped area — by default the whole core — occupied by placed standard-cell and macro area.
  2. Why you run itIt is the only trustworthy way to know achieved density; a target utilization is a plan, not a measurement.
  3. When in flowAfter macro placement, and again after any later floorplan edit that changes occupied area.
  4. Exact Tcl
    icc2_shell> report_utilization -verbose
  5. What ICC2 changesNothing — this is a read-only report.
  6. What to read backThe reported utilization ratio itself, plus, with -verbose, the breakdown that produced it.
  7. TrapScoping with -region or -of_objects reports utilization for a subset, not the whole core — easy to misread as a global figure if the scope is not checked.
  8. If you skip itYou are trusting a target number you never actually measured, which is exactly the "looks fine" failure mode this guide keeps warning against.
Macro placement

set_macro_relative_location

Constrains a macro's placement as a named offset from an anchor object.

  1. What it isRecords a constraint fixing a target macro's specified corner at a given X/Y offset from an anchor object's specified corner.
  2. Why you run itIt makes macro placement traceable and reviewable, instead of a coordinate nobody can independently justify.
  3. When in flowAfter the floorplan exists, before running create_placement -floorplan.
  4. Exact Tcl
    icc2_shell> set_macro_relative_location \
       -target_object [get_cells I_REG_FILE_D_RAM] \
       -target_orientation R0 -target_corner bl \
       -anchor_object [get_cells I_REG_FILE_B_RAM] -anchor_corner tl \
       -offset {0.0000 35.2550} -offset_type fixed
  5. What ICC2 changesRecords the constraint; it does not move anything by itself.
  6. What to read backreport_macro_relative_location for a table confirming target, anchor, corners, and offset exactly as intended.
  7. TrapWith no -anchor_object, the constraint is relative to the parent design, not to nothing — a common misreading when a constraint appears to "not do anything" against another macro.
  8. If you skip itcreate_placement -floorplan is free to place the macro anywhere legal, which is rarely where a reviewer would expect it.

create_placement -floorplan

Runs floorplan-tuned coarse placement, honoring relative-placement constraints.

  1. What it isThe -floorplan option to create_placement, which performs macro placement using effort levels and controls tuned specifically for floorplanning, honoring every macro constraint already in force.
  2. Why you run itDefining relative-placement constraints does not place anything by itself; this command executes them.
  3. When in flowAfter all macro constraints for this pass are defined.
  4. Exact Tcl
    icc2_shell> create_placement -floorplan
  5. What ICC2 changesPlaces hard macros (and, depending on application options, creates automatic thin-channel blockages) according to every macro constraint currently defined.
  6. What to read backThe layout view for a visual check, plus report_macro_relative_location re-confirmed against actual placed coordinates.
  7. TrapThe application option plan.place.auto_create_blockages can create blockages you did not explicitly ask for, in thin channels between macros; review what actually got created, not just where macros landed.
  8. If you skip itMacros stay unplaced, and nothing downstream — keepouts, the power network, pin assignment — has real macro geometry to plan against.
Reserving space

create_placement_blockage

Reserves a named region with a declared placement strength.

  1. What it isA rectangular or rectilinear region with a declared strength — hard, soft, partial, category, and related variants — limiting what may be placed inside it.
  2. Why you run itTo protect a thin channel between macros, reserve space for a future macro, or cap density near a sensitive region without forbidding placement outright.
  3. When in flowAfter the floorplan and macro placement exist, before standard-cell placement in the next chapter.
  4. Exact Tcl
    icc2_shell> create_placement_blockage -boundary {{1550 200} {1650 3000}} \
       -type hard -name ddrphy_channel_reserve
  5. What ICC2 changesCreates the named blockage at the declared strength; each call creates exactly one strength of blockage.
  6. What to read backget_placement_blockages for a collection of what actually exists; cross-check strength against the stage you meant to protect, using the blockage-strength gallery above.
  7. TrapSoft, partial, category, and relative-placement blockages all bind coarse placement only by default — the single most common misreading of this command, repeated from the previous chapter because it matters even more here.
  8. If you skip itThe channel or region you meant to protect is open to whatever placement or legalization decides to put there.
Power planning

compile_pg

Builds the power and ground network from one or more named strategies.

  1. What it isCreates straps, rings, macro connections, standard-cell connections, and vias, based on the power planning strategies named in -strategies.
  2. Why you run itIt is the command that turns a power planning strategy definition into an actual, physical power network.
  3. When in flowAfter macros are placed and PG connectivity exists, before pin assignment.
  4. Exact Tcl
    icc2_shell> compile_pg -strategies {core_ring core_mesh std_cell_rail}
  5. What ICC2 changesBuilds the physical PG network geometry for every named strategy, in the order strategies were defined unless a via rule between strategies says otherwise.
  6. What to read backA power network integrity report for missing vias and connectivity, plus a visual check of ring, mesh, and rail coverage in the layout view.
  7. Trap-ignore_drc is meant for exploratory passes; a network compiled with DRC ignored and never re-compiled cleanly is not a signoff-ready network no matter how complete it looks.
  8. If you skip itThere is a floorplan and placed macros, but no real power delivery network for anything placed inside the core to connect to.

create_power_switch

Defines a power switch cell for a switched power domain.

  1. What it isDefines a switch's domain, its input and output supply ports, its control port, and optionally its acknowledge port, on/off states, and resistance characteristics.
  2. Why you run itA switched domain has no way to actually turn off without a real switch cell tying its rail to an unswitched supply through a controlled path.
  3. When in flowAfter power intent is committed and the domain's physical region exists, before or alongside compile_pg for that domain.
  4. Exact Tcl
    icc2_shell> create_power_switch PSW_0 -domain PD_SWITCHED \
       -input_supply_port {VDD_UNSW VDD} \
       -output_supply_port {VDD_SW VDD_SW_NET} \
       -control_port {SLEEP_B sleep_b_net}
  5. What ICC2 changesDefines the switch object with its supply and control associations; a physical switch cell is instantiated and connected through the power planning flow that follows.
  6. What to read backA power switch report confirming the domain, ports, and control association match what the power architecture owner specified.
  7. TrapGetting the control polarity wrong (active-high versus active-low, matching the _B naming convention or its absence) produces a domain that is on when it should be off, a mistake that does not show up until functional or power-aware simulation.
  8. If you skip itA domain marked switched in UPF has no physical way to switch; downstream checks will flag the gap, later and more expensively than here.
Pin assignment

set_block_pin_constraints

Sets side, layer, and spacing rules for a block's pins.

  1. What it isRestricts which metal layers, sides, spacing, and corner keepout apply to a block's or the top design's pins.
  2. Why you run itTo make pin placement defensible against an interface specification, rather than wherever the placer finds room.
  3. When in flowBefore place_pins, once macro placement and the power network are stable enough that pin sides make sense.
  4. Exact Tcl
    icc2_shell> set_block_pin_constraints -allowed_layers {M2 M3 M4 M5 M6 M7 M8 M9} \
       -pin_spacing 5 -corner_keepout_num_tracks 5
  5. What ICC2 changesRecords the constraint set for subsequent pin placement to honor.
  6. What to read backreport_block_pin_constraints for the effective layer, spacing, and keepout values.
  7. TrapThis command is flagged for retirement in favor of create_block_pin_constraint in later releases — both exist in this release, but confirm which one your installed release actually expects before scripting around it long-term.
  8. If you skip itplace_pins falls back to whatever technology defaults apply, which rarely matches a specific interface specification.

place_pins

Places pins on the current block or design, honoring existing pin constraints.

  1. What it isPlaces pins for specified cells, nets, pins, or ports, honoring any block, individual, or bundle pin constraints already defined.
  2. Why you run itIt is the command that actually turns pin intent into real physical pin locations.
  3. When in flowAfter block and any individual pin constraints are set, near the end of this chapter's flow.
  4. Exact Tcl
    icc2_shell> place_pins -self
  5. What ICC2 changesPlaces pins consistent with every constraint currently defined; -legalize instead adjusts existing pin placement into compliance without a full re-placement.
  6. What to read backThe layout view for side and spacing sanity, plus a pin report confirming placed count matches the interface specification's pin count.
  7. TrapIndividual net or pin constraints that conflict with bundle constraints cause the bundle constraint to be dropped for that net, silently, rather than raising an error — check for this explicitly when a bundle looks incompletely honored.
  8. If you skip itNo pins exist at real physical locations, and nothing at integration or in top-level routing has a defined attachment point.
Worked example

Nimbus‑8: floorplanning a teaching design end to end

Continuing from the previous chapter's saved checkpoint: 9.90 million standard cells, 72 SRAM macros, one DDR PHY hard macro, a 3.20 mm × 3.20 mm core target, and four clocks. This chapter works the single-voltage path for Nimbus‑8 itself; the switched-domain power-switch flow is exercised on Lyra‑2 in the mini lab below, reusing the PD_SWITCHED domain already established for it.

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 validated state, not a fresh unlinked design.

Step 2 — initial floorplan

icc2_shell> initialize_floorplan -control_type core \
   -side_length {3200 3200} -core_offset {40 40 40 40}
/* core fixed at 3.20mm x 3.20mm per teaching target; 40um core_offset on every side */

Proof: a floorplan report shows a 3200 × 3200 (micron) core and a 3280 × 3280 die, and the layout view shows a nonzero core area for the first time in this guide.

Step 3 — rows and tracks

icc2_shell> remove_tracks -all
icc2_shell> create_track -layer METAL3 -space 0.5
icc2_shell> report_tracks
Layer          Direction     Start         Tracks    Pitch          Attr
------------------------------------------------------------------------
METAL3             Y         0.250          6398     0.500       default

Proof: the reported pitch and direction match what was requested; the track count is consistent with a 3.20 mm core at a 0.5 µm pitch, not a stale default from initialization.

Step 4 — macro constraints and relative placement

icc2_shell> create_keepout_margin -outer {10 10 10 10} nimbus8_ddrphy
icc2_shell> set_macro_relative_location \
   -target_object [get_cells nimbus8_sram_01] -target_orientation R0 -target_corner bl \
   -anchor_object [get_cells nimbus8_ddrphy] -anchor_corner tl \
   -offset {0.0000 20.0000} -offset_type fixed
icc2_shell> report_macro_relative_location

Proof: report_macro_relative_location lists the constraint with the exact target, anchor, corners, and offset intended — before anything has actually moved.

Step 5 — run floorplan placement

icc2_shell> create_placement -floorplan

Proof: the layout view shows the DDR PHY macro and its relatively-placed SRAM neighbor at the intended offset; report_macro_relative_location re-run against actual placed coordinates confirms the constraint was honored, not just recorded.

Step 6 — reserve the routing channel and check utilization

icc2_shell> create_placement_blockage -boundary {{1550 200} {1650 3000}} \
   -type hard -name ddrphy_channel_reserve
icc2_shell> report_utilization -verbose
Utilization: 81.9%

Proof: the reported utilization matches the arithmetic worked out in Utilization arithmetic — roughly 82%, not an assumed or carried-forward target number.

Step 7 — power network

icc2_shell> connect_pg_net -automatic
icc2_shell> compile_pg -strategies {core_ring core_mesh std_cell_rail}
/* single-voltage: one strategy set covers the whole core */

Proof: a power network integrity report shows zero missing vias, and the layout view shows a ring at the core perimeter, a mesh crossing the interior, and rails at every standard-cell row.

Step 8 — pin assignment

icc2_shell> set_block_pin_constraints -allowed_layers {M2 M3 M4 M5 M6 M7 M8 M9} \
   -pin_spacing 5 -corner_keepout_num_tracks 5
icc2_shell> place_pins -self

Proof: a pin report shows every top-level port placed, on an allowed layer, with the specified spacing and corner keepout honored.

Step 9 — checkpoint

icc2_shell> save_lib nimbus8_lib
Saving library 'nimbus8_lib'
1

Checkpoint / rollback point: this is the floorplan Placement and Optimization will build on. Treat the return value 1 as confirmation, the same discipline carried from the previous chapter.

Figure 12 — Nimbus‑8 floorplan exit snapshot The finished Nimbus-8 floorplan: a 3.20 by 3.20 millimetre core inside a slightly larger die, ringed by a power and ground ring, holding the DDR PHY hard macro and a scattering of SRAM macros with keepout margins, a mesh of power straps, and pins assigned around all four sides, ready to hand to Placement and Optimization.
Read it: this is a floorplan, not a placement — the pale interior is core area that Placement and Optimization will fill with standard cells next chapter. Everything shown here is fixed geometry the placer must work around, not suggestions it can move.
Visual inspection guide

What to look for in the GUI

As in the previous chapter, no screenshots are supplied — the habit of looking with intent outlasts any static picture. After each step above, open the layout view and check:

  • After initialize_floorplan: does the core outline match the 3.20 mm × 3.20 mm teaching dimension, with a visibly distinct die boundary offset outward by the core offset?
  • After track creation: zoom in far enough to see individual track lines, and confirm the pitch visually matches the numeric value reported — a pitch off by a factor of ten is a common, easy-to-miss unit mistake.
  • After macro placement: does the SRAM macro placed relative to the DDR PHY actually sit at the offset you specified, not just "somewhere nearby"?
  • After compile_pg: toggle power/ground layers on their own, separate from routing layers, and confirm ring, mesh, and rail all appear as distinct, connected tiers, not a single undifferentiated mass.
  • After place_pins: confirm pins landed on the sides and layers you specified, and that no pin sits inside a keepout margin or placement blockage you defined earlier.
Reports and how to read them

Reading proof, not just running commands

Reports that prove Floorplan is actually done
ReportWhat it provesRed flag to look for
report_tracksTrack direction, start point, count, and pitch match intent, per layerA pitch or start point that does not match what you specified, or a layer missing entirely
report_macro_relative_locationEvery macro relative-placement constraint is recorded and honored, target and anchor bothA macro whose reported placement does not match its constrained offset after create_placement -floorplan
get_placement_blockagesEvery blockage exists at the strength and boundary intendedA blockage with the wrong strength for the stage you meant to protect
report_utilization -verboseAchieved core utilization, measured from real geometry, not assumed from a targetAn achieved figure far from the target with no explanation on record
Power network integrity report (post-compile_pg)No missing vias, no unresolved connectivity gaps in the compiled networkAny nonzero missing-via or connectivity-gap count left unexplained
Power switch reportEvery switched domain has a real switch cell with correct supply and control associationsA domain marked switched in UPF with no corresponding switch object
report_block_pin_constraintsLayer, spacing, and corner-keepout pin rules match the interface specificationAn allowed-layers list wider or narrower than the specification intends
Pin placement report (post-place_pins)Every expected pin is placed, on an allowed side and layerA missing pin, or a pin placed on an excluded side
Failure symptoms and triage

When something is wrong, start here

Common failure symptoms during Floorplan
SymptomLikely causeWhere to look first
Core dimensions are not what you specifiedConfusion between -control_type core and -control_type die in initialize_floorplanThe floorplan report's die vs. core dimensions, compared against your intended control type
Track pitch looks wrong by a large factorA units mismatch, or a stale track set that was never actually removed before re-creationreport_tracks output, and whether remove_tracks ran first
A macro is not where its relative-placement constraint says it should becreate_placement -floorplan was never re-run after the constraint was added or changedCommand order in your script; re-run and re-check
Standard cells land in a region you meant to protectA soft, partial, or category blockage was used where a hard blockage was neededBlockage strength table in Reserving space with placement blockages
Achieved utilization is far from targetThe target was set before macro placement changed the occupied area, and never re-checkedreport_utilization -verbose, run again after every placement change
compile_pg completes but a region shows no rail coverageA strategy's -region or extension setting did not actually cover that areaThe power planning strategy definitions used in -strategies
A switched domain never actually powers down in simulationPower switch control polarity is inverted relative to the intended control signalcreate_power_switch's -control_port definition and the UPF supply-state logic
A pin lands on a side you explicitly excludedAn individual pin or bundle constraint overrode the block-level side exclusionPrecedence between individual, bundle, and block pin constraints
Stage completion checklist

The Floorplan exit gate

This is the same checklist a careful design planning reviewer would use before approving a handoff to Placement and Optimization. Every item names its evidence; "looks fine" is not evidence.

  • Die and core boundaries match the intended dimensions and control type.Evidence: a floorplan report compared line by line against the design planning target.
  • Rows and tracks are legal on every layer that matters, with no stale or default track sets left unreviewed.Evidence: report_tracks output for every layer touched.
  • Every hard macro is placed with a traceable constraint, not a manual coordinate.Evidence: report_macro_relative_location matching the macro placement table.
  • Every macro carries a real keepout margin at the correct strength.Evidence: keepout report or get_attribute check on every macro.
  • Placement blockages are named, scoped, and set to the strength that actually protects the stage intended.Evidence: get_placement_blockages reviewed strength by strength.
  • Achieved utilization is measured, documented, and reconciled with the target.Evidence: report_utilization -verbose output kept with the checkpoint.
  • The power network is compiled with no missing vias or unresolved connectivity gaps.Evidence: power network integrity report reviewed line by line.
  • Every switched domain has a real, correctly associated power switch.Evidence: power switch report matching the power architecture owner's domain list.
  • Block pin constraints match the interface specification, and every pin is placed accordingly.Evidence: report_block_pin_constraints and the post-placement pin report, both checked.
  • Floorplan rules for the target technology node are validated, or findings are tracked.Evidence: floorplan rule validation output, or an issue register entry for anything outstanding.
  • Saved checkpoint, logs, reports, and manifest are reproducible.Evidence: a second engineer can open_lib your saved checkpoint and reproduce the same reports.
Mini lab

Lab: inserting a power switch into Lyra‑2's PD_SWITCHED domain

Lyra‑2, the small multivoltage teaching design from the previous chapter's mini lab, already carries two power domains — PD_ALWAYS_ON and PD_SWITCHED — and a DEF with a floorplan already defined, including a region reserved for PD_SWITCHED. This lab picks up exactly there: PD_SWITCHED has a physical home, but nothing yet actually switches it. All numbers remain synthetic teaching data.

Setup

  • Lyra‑2's design library, with its committed UPF (lyra2.upf) and the DEF-derived floorplan reopened from the previous chapter's checkpoint.
  • Confirmation from the power architecture owner of the intended control signal name and polarity for PD_SWITCHED.

Tasks

  1. Reopen the Lyra‑2 checkpoint and confirm the PD_SWITCHED voltage area still resolves correctly with report_voltage_areas -verbose.
  2. Define a power switch with create_power_switch for PD_SWITCHED, with an unswitched input supply, a switched output supply, and a control port matching the owner's specification.
  3. Compile the power network for both domains with compile_pg, using a strategy set that covers PD_ALWAYS_ON and PD_SWITCHED separately.
  4. Run a power network integrity check and resolve or document every finding.
  5. Save the checkpoint and write a one-paragraph handoff note, as if for a reviewer who has not seen this lab, stating the control polarity you used and why.

Expected observations

The switched rail inside PD_SWITCHED should show no power connectivity until the switch's control port is driven active; if your first compile_pg pass reports a connectivity gap on the switched rail, check whether the switch was defined before or after connect_pg_net ran for that domain — sequencing this incorrectly is a common first-attempt mistake, not a tool defect.

Cleanup

Close the library with close_lib once you have confirmed the saved checkpoint reopens cleanly with open_lib in a fresh session, the same discipline as the previous chapter's lab.

Interview questions

25 questions worth being able to answer cold

Beginner

Q1. What is the difference between the die boundary and the core boundary?

The die is the chip's outer physical edge; the core is the inner region that holds standard cells and macros, typically inset from the die by a core offset.

What is happening
The die-to-core margin often reserves space for I/O pads or a pad ring, which is not part of the placeable core area.
The trap
Treating "floorplan size" as one number instead of two distinct, related boundaries.
What is being tested
Whether the die/core distinction is automatic before relying on it in a command's -control_type option.
Beginner

Q2. What does -control_type core versus -control_type die change about initialize_floorplan?

What is happening
With core, your dimensions apply to the core and the offset is added outward to compute the die. With die, your dimensions apply to the die and the offset is subtracted inward to compute the core.
The trap
Assuming the same numeric -side_length value produces the same core size under either control type.
What is being tested
Reading an option's default and effect precisely, instead of assuming from the option's name alone.
Beginner

Q3. What is the difference between a row and a routing track?

What is happening
A row is part of the site array — the grid standard cells snap to. A track is a per-layer routing grid that wires snap to. They are independent grids, not the same thing at different scales.
The trap
Using "grid" loosely enough that rows and tracks get conflated in a design review.
What is being tested
Precision about which grid a given legality problem actually belongs to.
Beginner

Q4. Name the three floorplan styles and the one-sentence tradeoff each one makes.

What is happening
Channeled: open space between blocks for top-level cells and routing, at the cost of area. Abutted: no wasted area, at the cost of over-the-block routing and harder clock/feedthrough planning. Narrow-channel: a deliberate middle ground, reserving a channel only where a specific purpose needs one.
The trap
Treating "abutted" as always better because it wastes less area, ignoring its routing and clock-planning cost.
What is being tested
Whether the reader can state a real tradeoff, not just a definition.
Beginner

Q5. What does set_macro_relative_location actually record, and what does it not do by itself?

What is happening
It records a constraint: a target macro's corner at a fixed offset from an anchor object's corner. It does not move anything — create_placement -floorplan is what executes the placement.
The trap
Assuming the macro has moved immediately after the constraint command returns.
What is being tested
The general habit, repeated throughout this guide, of separating "constraint defined" from "constraint executed."
Beginner

Q6. Why does a hard macro almost always need a keepout margin?

What is happening
Without one, the placer can butt a standard cell directly against a macro's pin edge, which is a common source of legalization failures once real placement begins.
The trap
Treating the keepout margin as cosmetic spacing rather than a legalization safeguard.
What is being tested
Connecting a physical constraint to the concrete failure it prevents.
Beginner

Q7. What does report_utilization actually measure?

What is happening
The fraction of a scoped area, by default the whole core, occupied by real, placed standard-cell and macro geometry — not an estimate and not the target you set earlier.
The trap
Quoting a target utilization as if it were a measured, achieved one.
What is being tested
The distinction between a plan and a measurement, applied to the one number floorplan reviews ask for most often.
Beginner

Q8. What does a power switch's control port actually do?

What is happening
It is the signal that turns the switch, and therefore the switched domain's power, on and off.
The trap
Assuming a switch is inherently "on" by default with no attention to its control polarity.
What is being tested
Basic fluency with what a power switch definition actually specifies.
Intermediate

Q9. You defined a hard blockage to protect a routing channel, but standard cells still landed there during optimization two chapters from now. What is the most likely explanation?

What is happening
If the blockage was actually created with a different strength — soft, partial, or category — it stops protecting the region after coarse placement, by default.
The trap
Assuming a blockage's visual presence in the layout view proves its strength, rather than checking the report.
What is being tested
Whether "it shows up in the layout view" is treated as proof, which it is not.
Intermediate

Q10. Why might redefining routing tracks after macro placement cause a problem that did not exist before?

What is happening
Macro pins may already be positioned against the old track grid; redefining tracks can shift the effective pitch relative to those fixed pin locations.
The trap
Treating track redefinition as a purely cosmetic, low-risk change late in the flow.
What is being tested
Understanding why command order matters, not just command correctness in isolation.
Intermediate

Q11. A colleague scales the die down 20% in one modify_die_area call to hit a utilization target. What is the risk?

What is happening
A large single resize risks excessive utilization or macros that no longer physically fit; the reference documentation itself recommends small increments with a routability check after each one.
The trap
Treating utilization arithmetic as the only success criterion and ignoring routability and macro fit.
What is being tested
Whether the reader applies the "small increments, re-check each time" discipline under a real scenario.
Intermediate

Q12. What is the difference in behavior between create_track and derive_tracks?

What is happening
create_track creates tracks directly from explicit pitch, count, and offset arguments. derive_tracks generates tracks automatically from previously defined track constraints, searching default-label constraints unless a label is specified.
The trap
Running derive_tracks expecting it to work without any track constraints having been defined first.
What is being tested
Whether a "convenience" command's actual dependency is understood, not just its name.
Intermediate

Q13. Why does this chapter treat set_block_pin_constraints and create_block_pin_constraint as both worth knowing?

What is happening
The reference documentation flags set_block_pin_constraints as scheduled for retirement in favor of create_block_pin_constraint; both exist in the current release.
The trap
Scripting long-term automation around a command flagged for retirement without checking its replacement.
What is being tested
Reading a deprecation notice as an action item, not a footnote.
Intermediate

Q14. What happens when an individual net's pin constraint conflicts with a bundle constraint covering that net?

What is happening
For side, offset, or layer conflicts, place_pins ignores the bundle constraint for that net and places the other bundle pins together regardless; for width, length, or spacing conflicts, both individual and bundle constraints are honored together.
The trap
Assuming any conflict simply errors out, rather than checking which category of conflict actually applies.
What is being tested
Precision about precedence rules that do not fail loudly when they apply.
Intermediate

Q15. Why is a power switch's association part of the physical floorplan flow, even though its behavior comes from UPF?

What is happening
UPF defines the power architecture's intent that a domain is switched; create_power_switch and the floorplanning flow around it turn that intent into a real, placeable, physically connected cell.
The trap
Treating power switch insertion as purely a UPF or purely a physical concern, when it is genuinely both.
What is being tested
Whether the reader can trace one concept across the logical/physical boundary this guide keeps returning to.
Intermediate

Q16. Why does this chapter check achieved utilization with report_utilization rather than trusting the -core_utilization value passed to initialize_floorplan?

What is happening
The target value sizes the die before anything is placed; only measurement after macro and standard-cell placement reflects what actually landed.
The trap
Reporting the input target in a design review as if it were the output measurement.
What is being tested
The plan-versus-measurement discipline applied specifically to utilization.
Scenario

Q17. A reviewer asks you to prove a specific macro's placement is actually constrained, not just visually correct today. What do you show them?

What is happening
report_macro_relative_location for the recorded constraint, plus the macro's actual current coordinates, to show the two agree — a snapshot alone proves nothing about whether the placement is protected against a future re-run.
The trap
Pointing at the layout view as if today's visual state were the same as a durable, recorded constraint.
What is being tested
The same proof-over-opinion discipline from the previous chapter, applied to geometry instead of text reports.
Verified Tcl snippet
icc2_shell> report_macro_relative_location
Scenario

Q18. Your die comes out of initialize_floorplan noticeably larger than expected. Walk through your triage.

What is happening
Check -control_type first — a die-controlled sizing subtracts the offset while a core-controlled sizing adds it, which alone can explain an unexpected size before assuming a units or macro-fit problem.
The trap
Jumping straight to re-scaling with modify_die_area before confirming the original command's option choice was correct.
What is being tested
Checking the simplest, most likely explanation before reaching for a corrective command.
Scenario

Q19. Two macros that should be adjacent per the placement table are separated by an unexpected gap after create_placement -floorplan. What do you check first?

What is happening
Whether plan.place.auto_create_blockages inserted an automatic thin-channel blockage between them, which is legitimate congestion-reduction behavior but easy to mistake for a placement bug.
The trap
Assuming the relative-placement constraint itself is wrong before checking for an automatically inserted blockage.
What is being tested
Awareness of a specific automatic-behavior application option named in this chapter, not just the explicit constraint commands.
Scenario

Q20. A power network integrity report shows missing vias only in one quadrant of the die. What do you investigate?

What is happening
Whether a power planning strategy's region or extension setting actually covers that quadrant, or whether a placement blockage or macro keepout there is blocking mesh or rail geometry from landing.
The trap
Re-running compile_pg unchanged, hoping a transient issue resolves itself, instead of checking strategy coverage against the geometry actually present.
What is being tested
Diagnosing a localized failure by checking what differs about that region, not re-running the same command blind.
Scenario

Q21. A pin you explicitly excluded from side 3 with -exclude_sides still appears there after place_pins. What are the two most likely explanations?

What is happening
Either an individual pin or bundle constraint for that specific net overrides the block-level exclusion, or the exclusion was set after place_pins had already run once in the same session.
The trap
Assuming the tool ignored the constraint outright, rather than checking constraint precedence and command order first.
What is being tested
The same command-order and object-scope diagnosis habit from the previous chapter's dont_touch scenario, applied to pin constraints.
Scenario

Q22. Your achieved utilization comes back at 91%, well above the 80% target, after macro placement. What do you fix, and in what order?

What is happening
Confirm the figure with report_utilization -verbose to rule out a scoping mistake, then use modify_die_area with a target -core_utilization to grow the core in small increments, re-checking routability and macro fit after each step, rather than one large resize.
The trap
Jumping straight to a single large resize instead of the incremental, re-checked approach this chapter recommends.
What is being tested
Applying the die-scaling discipline from earlier in this chapter to a concrete, numeric scenario.
Expert

Q23. How would you decide between a channeled and a narrow-channel floorplan style for a design with three tightly-coupled blocks?

What is happening
The deciding factor is whether the design genuinely needs top-level cell placement and routing across most block boundaries (channeled) or only along specific paths, most commonly clock distribution, that justify a reserved channel while the rest of the boundary abuts (narrow-channel). Congestion analysis on a trial floorplan, not intuition, should confirm which paths actually need the reservation.
The trap
Defaulting to channeled everywhere out of caution, absorbing area cost the design does not actually need.
What is being tested
Judgment about matching floorplan style to a measured need, not a default habit.
Expert

Q24. A junior engineer asks why this chapter insists on relative macro placement instead of just dragging macros in the GUI to where they look right. How do you answer?

What is happening
A dragged placement has no recorded rationale a second engineer, or the same engineer six months later, can verify or reproduce; it also silently breaks the moment the design is re-floorplanned from an earlier checkpoint. A relative-placement constraint is both reviewable and durable across re-runs, at the cost of slightly more upfront ceremony.
The trap
Answering only "because it's more precise," without naming the reproducibility and review failure a dragged placement actually causes.
What is being tested
Whether the engineer can explain the underlying engineering-process reason, not just recite the recommended command.
Expert

Q25. How would you justify, to a skeptical lead, spending extra time on power switch polarity verification when functional simulation would eventually catch a mistake anyway?

What is happening
A polarity mistake caught in floorplan review costs a one-line constraint edit and a re-compile. The same mistake caught in functional or power-aware simulation costs a debug cycle across two additional flow stages before the root cause is even localized to floorplan. The cost asymmetry, not the certainty of eventually catching it, is the argument.
The trap
Arguing "it might not get caught otherwise," which is both weaker and less true than the actual cost-asymmetry argument.
What is being tested
Whether the engineer can make a cost-based case for early verification, the kind of argument that actually persuades a schedule-conscious lead.
Flashcards

Twelve facts worth having cold

Die vs. core
Die is the outer physical edge; core is the inner placeable region, typically inset by a core offset. Two distinct, related boundaries, not one number.
initialize_floorplan control type
-control_type core adds the offset outward to get the die; -control_type die subtracts it inward to get the core. Same numbers, different results.
Row vs. track
Rows are the standard-cell site grid. Tracks are the per-layer routing grid. Independent grids, checked with different reports.
Channeled vs. abutted vs. narrow-channel
Channeled: open space for top-level cells. Abutted: no wasted area, harder routing and clock planning. Narrow-channel: reserve a channel only where a specific purpose needs one.
set_macro_relative_location vs. create_placement -floorplan
The first records a constraint. The second actually places macros, honoring every constraint recorded so far. Constraint defined is not constraint executed.
Blockage strength, repeated
Only hard survives past coarse placement by default. Soft, partial, and category protect coarse placement only — the single most repeated trap in this guide for a reason.
modify_die_area discipline
Small increments, re-check routability and macro fit after each one. A single large resize risks excessive utilization or macros that no longer fit.
report_utilization
Measures achieved density from real geometry. A target utilization is a plan for this number, not a substitute for measuring it.
Power network tiers
Ring at the perimeter, mesh across the interior, rails at each standard-cell row. A gap at any tier shows up as IR drop, not a routing error.
create_power_switch scope
Defines domain, input/output supply ports, and control port. Behavior comes from UPF; floorplanning makes it a real, connected physical cell.
set_block_pin_constraints future
Flagged for retirement in favor of create_block_pin_constraint. Both exist now; confirm which your installed release expects for new scripts.
Pin constraint precedence
Individual net constraints can override a bundle constraint for side/offset/layer conflicts, silently, per net. Width/length/spacing conflicts honor both together.
Glossary

Terms used in this chapter

Abutted floorplan
A floorplan style with no channel between blocks; blocks touch directly.
Channeled floorplan
A floorplan style with open space between blocks for top-level cells and routing.
Checkpoint
A saved, reopenable state of a design library on disk, written with save_lib.
Core boundary
The inner region of a floorplan holding standard cells and macros.
Core offset
The margin between the die boundary and the core boundary.
Core utilization
The fraction of core area occupied by standard-cell and macro area, either as a target or as a measured, achieved figure.
Die boundary
The outer physical edge of the chip.
Keepout margin
A region around a fixed object, inner or outer, where no other cell may be placed. Carried forward from Preparing the Design; used heavily around macros in this chapter.
Narrow-channel floorplan
A floorplan style mixing abutted edges with a channel reserved only where a specific purpose needs one.
Placement blockage
A named region with a declared strength limiting what may be placed inside it. Strength determines which stages honor it.
Power ring
A power and ground network tier running around the core perimeter.
Power mesh
A coarser power and ground network tier crossing the core's interior on upper metal layers.
Power switch
A cell inserted between an always-on supply and a switched domain's rail, controlled by a defined control port.
Relative placement constraint
A rule fixing one macro's position as an offset from a named anchor object's corner.
Routing track
A line on a routing layer, at a defined pitch, that wires on that layer are expected to align to.
Site array / row
The grid of legal standard-cell placement sites, laid out as horizontal rows.
Standard-cell rail
The finest tier of the power network, feeding individual standard-cell rows.
Switched domain
A power domain whose supply can be turned off by a power switch under control-signal direction.
Self-check questions

Test yourself before moving on

  1. Explain, in one sentence each, what changes between -control_type core and -control_type die on initialize_floorplan.
  2. A macro you constrained with set_macro_relative_location is not where you expect after create_placement -floorplan. Name two things you would check before assuming the constraint is wrong.
  3. Why does this chapter recommend defining routing tracks before running macro placement, not after?
  4. You need a region to stay clear of standard cells through legalization and CTS, not just coarse placement. Which blockage strength do you use, and why not soft or partial?
  5. Explain why report_utilization is described in this chapter as a measurement, and a target -core_utilization value as a plan.
  6. Name the three tiers of a compiled power network, and state which failure mode — not a routing error — a gap in any tier produces.

Answers

  1. With core, your dimensions apply to the core and the offset is added outward to compute the die. With die, your dimensions apply to the die and the offset is subtracted inward to compute the core.
  2. Whether create_placement -floorplan was actually re-run after the constraint was added, and whether the constraint's anchor and target corners were set as intended, via report_macro_relative_location.
  3. Because redefining tracks after macros are placed can shift the effective pitch relative to macro pins already positioned against the old grid.
  4. Hard. Soft, partial, and category blockages bind coarse placement only, by default, and stop protecting a region once legalization or optimization runs.
  5. The target value sizes the die before anything is placed; only report_utilization, run after macro and standard-cell placement, reflects what actually occupies the core.
  6. Ring, mesh, and rail. A gap at any tier shows up as IR drop, not as a routing error.
Part summary

What to carry forward

Facts worth carrying into every later chapter
TopicFact worth carrying forward
Die and coreTwo distinct, related boundaries; -control_type decides which one your dimensions actually describe.
Rows and tracksIndependent grids; define tracks before macro placement, and re-verify with report_tracks after any change.
Macro placementA relative-placement constraint is recorded, not executed, until create_placement -floorplan runs.
Blockage strengthOnly hard survives past coarse placement by default — the single most repeated trap in this guide.
Utilizationreport_utilization measures; a target value only plans. Never carry the plan forward as if it were the measurement.
Power networkRing, mesh, and rail are three tiers with three purposes; a gap in any one is an IR-drop risk, not a routing error.
Pin assignmentIndividual and bundle constraints can silently override a block-level rule per net; check precedence, not just intent.
Sign-off checklist

Before you call this stage done

This is the same eleven-item exit gate from earlier in this chapter, repeated here as the final gate before handoff. See Stage completion checklist for the full evidence requirements attached to each item.

  • Die and core boundaries match the intended dimensions and control type.
  • Rows and tracks are legal on every layer that matters.
  • Every hard macro is placed with a traceable constraint.
  • Every macro carries a real keepout margin at the correct strength.
  • Placement blockages are named, scoped, and set to the correct strength.
  • Achieved utilization is measured, documented, and reconciled with target.
  • The power network is compiled with no missing vias or unresolved gaps.
  • Every switched domain has a real, correctly associated power switch.
  • Block pin constraints match the interface specification, and pins are placed accordingly.
  • Floorplan rules for the target technology node are validated, or findings are tracked.
  • A saved checkpoint, with logs, reports, and manifest, reproduces cleanly for a second engineer.
Last word

Last word and bridge to Placement and Optimization

This chapter drew the shape everything else in this guide will be built inside of. That shape is now mostly fixed: the die will not casually resize again, hard macros will not casually move, and the power network's topology is set. What comes next fills that shape in. When placement congestion looks worse in one corner of the die than everywhere else, or a net refuses to route cleanly near a macro edge, the first productive move is almost always back here: is the keepout margin really what you think it is, is the blockage strength really what the stage in question honors, is the power mesh really covering that region.

Next

The next chapter, Placement and Optimization, picks up exactly where this one leaves off: a legal, checkable floorplan with macros placed, power compiled, and pins assigned, but not a single standard cell placed yet. It covers coarse and detailed placement, timing- and power-driven optimization, and congestion — the discipline of filling in the shape this chapter defined without breaking anything this chapter proved.