Placement: where the standard cells physically go

Placement assigns physical coordinates to the synthesized standard cells while trying to satisfy wirelength, density, routability, and timing goals.

Overview

Before placement, the netlist says:

cell A connects to cell B
cell B connects to cell C

but it does not say:

cell A is at x=43.2 µm, y=71.4 µm

Placement creates those coordinates.

Global placement

Global placement finds good approximate locations.

Cells may not yet be perfectly legal on placement sites.

It tries to optimize objectives such as:

wirelength
density
routability
sometimes timing

Detailed placement

Detailed placement legalizes cells:

inside legal rows
on legal sites
without illegal overlaps

while trying not to destroy the global-placement solution.

Why placement affects timing

Wire delay depends on physical distance and load.

A net that was "just a wire" in RTL may become:

a long RC interconnect

in silicon.

Moving connected cells closer can reduce wire delay and capacitance.

Why placement affects routing

If too many nets need the same region:

routing demand > routing capacity

and congestion appears.

Prerequisites

Steps

1. Find global placement

RUN=$(ls -dt runs/* | head -1)

GPL_DIR=$(find "$RUN" -maxdepth 1 -type d \
  -name '*openroad-globalplacement' | tail -1)

echo "$GPL_DIR"

There may be an earlier globalplacementskipio stage.

For this page use the later main global-placement state when available.

2. Open global placement in OpenROAD

librelane \
  --with-initial-state "$GPL_DIR/state_out.json" \
  --flow OpenInOpenROAD \
  "$RUN/resolved.json"

3. Identify cell clusters

Zoom in.

Try to distinguish:

flip-flops
combinational cells
buffers
physical-only cells

Use instance selection/properties in the GUI.

4. Find detailed placement

DPL_DIR=$(find "$RUN" -maxdepth 1 -type d \
  -name '*detailedplacement*' | head -1)

echo "$DPL_DIR"

Open it:

librelane \
  --with-initial-state "$DPL_DIR/state_out.json" \
  --flow OpenInOpenROAD \
  "$RUN/resolved.json"

5. Compare global vs detailed placement

Look for:

  • cells snapped to rows
  • overlap removal
  • local movement
  • row alignment

6. Open heatmaps

In OpenROAD GUI, inspect available heatmaps such as:

placement density
routing congestion
power/IR-drop views if available for the state

A heatmap converts a huge physical dataset into spatial information.

For congestion:

hot region
= lots of routing demand relative to capacity

7. Understand density

If placement is too dense:

cells compete for routing access
buffers have nowhere to go
routing detours increase
timing can worsen

If placement is too sparse:

die/core becomes larger
wirelength can grow
area efficiency decreases

The goal is not maximum density.

The goal is a design that closes:

timing
routing
power
physical verification

at acceptable area.

8. Inspect optimization cells

Physical design may insert or resize cells that were not obvious in the original RTL:

buffers
stronger/slower drive variants
timing repair cells

This is normal.

The physical netlist evolves during implementation.

9. Save screenshots

Save:

screenshots/global_placement.png
screenshots/detailed_placement.png
screenshots/congestion_heatmap.png

Results

Record:

placement itemobservation
Placement density
Visible whitespace
Congestion hotspots
Added buffers visible
Legalized rowsyes/no

Checklist

  • Understand global placement
  • Understand detailed placement
  • Can see legal standard-cell rows
  • Can explain why density is not simply "higher is better"
  • Inspected congestion
  • Saved placement screenshots
  • Continued to page 18

Questions? Ask in the network Discord.