Part 4 of the Tcl command reference covering Placement commands used to place standard cells, macros, and I/O pads within the core area. Placement determines the physical location of every cell and directly impacts timing, congestion, and power.
The complete physical design flow follows this order:
- Design & Database Setup
- Floorplanning
- Power Planning
- Placement
- Clock Tree Synthesis
- Routing
- Optimization
- Signoff & Reports
Quick Reference: Placement Commands for EDA Tools
Placement assigns physical locations to all standard cells and macros in the design. The placer uses global and detailed phases to optimize for wirelength, timing slack, and routability while respecting legality constraints like site alignment and row placement.
| Command | Description |
|---|---|
set_placement_mode | Sets placement mode and options |
place_opt | Runs optimized placement with concurrent timing optimization |
global_placement | Runs global placement to find approximate cell locations |
detailed_placement | Runs detailed placement for legal alignment |
legalize_placement | Legalizes placement by fixing site violations |
place_design | Runs complete placement flow (global + detailed) |
set_placement_strategy | Sets placement optimization strategy |
fix_cells | Fixes cells at their current locations |
place_pins | Places I/O pins on the block boundary |
report_placement | Reports placement status and statistics |
check_placement | Checks placement for violations |
check_legality | Checks placement legality (site, row, overlap) |
report_utilization | Reports core utilization and density |
report_congestion | Reports routing congestion hotspots |
Typical Placement Flow Script
# === Typical Placement Flow ===
set_placement_mode -timing_driven true
# Global placement (coarse)
global_placement
# Detailed placement (fine-tune)
detailed_placement
# Legalize to fix any violations
legalize_placement
# Placement optimization with timing
place_opt -concurrent
# Check results
report_placement > reports/placement.rpt
report_utilization > reports/utilization.rpt
report_congestion > reports/congestion.rpt
check_legality
Command Deep-Dive: Understanding Each Command
What it is: set_placement_mode configures the placement engine options including timing driven, congestion driven, and power aware modes. It controls whether the placer optimizes for speed, area, or power during placement.
Where we use it: Run before any placement command to set the desired optimization goals. For timing critical designs you enable timing driven mode. For congested blocks you enable congestion driven mode to spread cells and reduce routing density.
Syntax: set_placement_mode -mode <mode> [-effort <effort>]
# Enable timing driven placement
set_placement_mode -timing_driven true
# Enable congestion driven mode
set_placement_mode -congestion_driven true
# Enable power optimization during placement
set_placement_mode -power_driven true
# Set effort level
set_placement_mode -effort high
What it is: place_opt runs a comprehensive placement flow that integrates global placement, detailed placement, and timing optimization in a single command. It iteratively places cells and optimizes timing by resizing cells, inserting buffers, and restructuring logic.
Where we use it: This is the main placement command for production flows. It replaces running global and detailed placement separately. place_opt is typically run after floorplanning and power planning to get the best timing results in a single pass.
Syntax: place_opt [-effort <effort>] [-congestion] [-timing]
# Run complete placement with timing optimization
place_opt
# Run with concurrent optimization
place_opt -concurrent
# Run with area recovery mode
place_opt -area_recovery
# Run with specific effort
place_opt -effort high
What it is: global_placement performs the first phase of placement where cells are assigned approximate locations to minimize wirelength. At this stage cells can overlap and may not be aligned to site rows. The goal is to find a globally optimal arrangement.
Where we use it: Before detailed placement to get a coarse placement solution. Global placement uses analytical algorithms (quadratic or force-directed) to spread cells across the core. It handles millions of cells and produces a placement that detailed placement then refines.
Syntax: global_placement [-effort <effort>] [-timing_driven]
# Run global placement with default settings
global_placement
# Run with timing awareness
global_placement -timing_driven
# Run with routability optimization
global_placement -routability_driven
What it is: detailed_placement refines the global placement solution by legalizing cell locations. It snaps cells to placement sites, aligns them to rows, removes overlaps, and performs local optimizations like swap moves and relaxation.
Where we use it: After global placement to produce a legal placement. Detailed placement does not change cell locations drastically but makes small adjustments to fix site alignment, remove overlaps, and improve local timing. It runs much faster than global placement.
Syntax: detailed_placement [-effort <effort>] [-legalize_only]
# Run detailed placement
detailed_placement
# Run with timing refinement
detailed_placement -timing_driven
# Run with incremental mode (faster)
detailed_placement -incremental
What it is: legalize_placement fixes any remaining legality violations after placement such as cell overlaps, site misalignment, and row spacing issues. It ensures every cell is placed on a valid site without overlapping.
Where we use it: After global or detailed placement to clean up any violations. Some tools run legalization automatically but running it explicitly ensures a clean placement before moving to CTS. Also used after ECO changes to re-legalize modified cells.
Syntax: legalize_placement [-cells <list>] [-effort <effort>]
# Legalize all cells
legalize_placement
# Legalize only specified cells
legalize_placement -cells {inst1 inst2 inst3}
# Legalize with incremental mode
legalize_placement -incremental
What it is: place_design runs the full placement flow from start to finish including global placement, detailed placement, and legalization in a single command. It is a higher-level command that abstracts the individual placement phases.
Where we use it: When you want a quick complete placement without tuning individual phases. Useful for initial exploration or less critical blocks. For timing critical designs place_opt is preferred because it integrates concurrent timing optimization.
Syntax: place_design [-effort <effort>] [-timing] [-congestion]
# Run full placement
place_design
# Run placement with timing driven mode
place_design -timing_driven
# Run with congestion reduction
place_design -congestion_effort high
What it is: fix_cells prevents specified cells from being moved during subsequent placement or optimization steps. Fixed cells are locked in place and treated as obstacles by the placer. This is commonly used for clock buffers, pre-placed macros, and user-constrained cells.
Where we use it: After pre-placing critical cells like clock tree buffers, analog blocks, or user-specified locations. Fixing cells ensures they stay where you placed them and do not get moved during optimization. Use unfix_cells to release them if needed.
Syntax: fix_cells [-all] [-cells <list>]
# Fix specific cells
fix_cells {clk_buf1 clk_buf2 clk_buf3}
# Fix all clock cells
fix_cells [get_cells -hier -filter "ref_name =~ *CLK*"]
# Fix with soft attribute (can be moved if needed)
fix_cells -soft inst_list
What it is: place_pins assigns physical locations to I/O pins along the block boundary. Pin placement affects routability and timing because poorly placed pins create routing congestion and long wires to internal logic.
Where we use it: During floorplanning or before placement to define where I/O connections enter and exit the block. Pins are placed on the four sides of the core boundary and their order should match the top-level connectivity for a clean hierarchical flow.
Syntax: place_pins -ports <list> -layer <layer> [-location {x y}]
# Auto-place all pins
place_pins -self
# Place pins on specific sides
place_pins -self -side {top bottom}
# Place pins with spacing constraint
place_pins -self -min_distance 2.0
# Place specific pins manually
place_pins -pin {clk data_in} -location {100 200}
What it is: report_placement prints a summary of the current placement including total cells placed, unplaced cells, utilization, standard cell density, and placement legality status. It is the primary command for verifying placement completeness.
Where we use it: After running placement to verify all cells are placed and legal. Check that there are no unplaced cells, utilization matches targets, and no legality violations exist. Also use check_placement and check_legality for detailed validation.
Syntax: report_placement [-verbose] [-congestion] [-utilization]
# Basic placement report
report_placement > reports/placement.rpt
# Report with utilization details
report_utilization > reports/utilization.rpt
# Report congestion hotspots
report_congestion > reports/congestion.rpt
# Check legality
check_legality > reports/legality.rpt
Mastering these Placement commands is essential for achieving timing closure and routability. A well-placed design reduces routing congestion, meets timing targets, and provides a solid foundation for Clock Tree Synthesis. Continue to Part 5: CTS Commands →