How do you ECO-buffer a long routed bus without the buffers clumping?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
Buffering each bit of a bus at the same interval puts all the buffers in one column, where they fight for sites and pin access and push cells aside. ICC2 has bus buffer patterns for this: define a stagger with create_eco_bus_buffer_pattern (ICC2), then place the buffers with add_buffer_on_route -user_specified_bus_buffers (ICC2), giving the pattern, the library cell and the first buffer location.
Technical Explanation
- Why they clump: a bus is many parallel nets of the same length.
add_buffer_on_route -repeater_distance(ICC2) with the same first distance and interval on every bit puts every bit's buffer at the same distance from the driver, stacked across the bus. - A pattern defines the stagger.
create_eco_bus_buffer_pattern(ICC2) requires-name,-first_buffer(which edge bit gets the first buffer: top or bottom for a horizontal bus, left or right for a vertical one) and-measure_from, plus either-distancefor a regular stagger (with the optional-repeat_after; without it the pattern does not repeat) or-user_specified_distancefor a list of different steps. - For a horizontal bus,
create_eco_bus_buffer_pattern -name BP1 -first_buffer top -measure_from left -distance 2 -repeat_after 4(ICC2) puts the first buffer on the topmost bit, staggers each next buffer by 2 to the right, and starts the pattern again after every four buffers. The ICC2 UG example is the same with-repeat_after 3. - Apply it with
add_buffer_on_route [get_nets data_A*] -user_specified_bus_buffers {BP1 BUF2 100 70}(ICC2): pattern name, library cell and the location of the first buffer. Repeat the group format for more buffer groups along the bus. -last_distancecannot be combined with-user_specified_bus_buffers, so the pattern and group locations must cover the whole route.report_eco_bus_buffer_patterns(ICC2) andget_eco_bus_buffer_patterns(ICC2) show what is defined;remove_eco_bus_buffer_patterns(ICC2) removes patterns.- This is a different question from choosing between
add_buffer(ICC2) andadd_buffer_on_route(ICC2). In PrimeTime the equivalent insertion command isinsert_buffer(PT), which does not know about bus patterns; bus staggering is done in ICC2.
What To Check
- Buffer locations per bit after insertion: are they staggered as intended?
- Local density and legality where the groups land.
- Skew between bits of the bus after buffering.
- Routing DRC and opens after ECO routing of the bus.
Command Checks & Actions
create_eco_bus_buffer_pattern -name BP1 -first_buffer top -measure_from left -distance 2 -repeat_after 4Defines a staggered pattern for a horizontal bus.
report_eco_bus_buffer_patternsReports the defined bus patterns.
add_buffer_on_route [get_nets data_A*] -user_specified_bus_buffers {BP1 BUF2 100 70}Adds BUF2 buffers on the bus using pattern BP1 from the first location.
route_ecoConnects the new buffers.
check_routesConfirms the bus routes are clean after ECO routing.
report_timing -through [get_nets data_A*]Checks timing and bit-to-bit spread in PrimeTime after extraction.
Healthy, Suspicious & Hard-stop Results
- Healthy (illustrative): Buffers spread across four columns per group, all legal in place, and bit-to-bit delay spread under 10 ps.
- Suspicious (illustrative): Pattern applied but one group lands on a macro edge, so several buffers move far from their route.
- Hard stop: All bits buffered at the same column with cells displaced out of a timing-critical region. Remove and redo with a pattern.
Common Mistake
The Trap: Buffering a 64-bit bus with one add_buffer_on_route -repeater_distance 150 (ICC2) command. All 64 buffers of each stage land in the same column, legalization pushes half of them and the neighbouring cells several rows away, and the post-ECO run shows the bus bits spread by 40 ps plus new violations on the displaced logic.
What The Interviewer Is Testing
- Understanding why uniform interval buffering clumps on a bus.
- Can you describe the pattern options and the group format?
- Knowing where staggering lives: ICC2, not PrimeTime.
Follow-up Question & Model Response
"When would you use -user_specified_distance instead of -distance and -repeat_after?"
Candidate Model Response: When the space beside the bus is not uniform, for example with a PG strap or a blockage crossing it at a known point, so a regular stagger would drop some buffers into blocked sites. A list of step distances lets me shape the pattern around it, as in the UG example with steps of 2, 3 and 2 before the pattern repeats. For an open area, a regular distance and repeat count is simpler to review.
Practical Example
Tapeout Scenario: A 32-bit routed bus, 1,800 um long, needs two buffer stages (illustrative). Interval buffering stacks 32 buffers in each of two columns and displaces 40 cells. With a pattern of distance 2 that repeats after 4 buffers, each stage becomes eight staggered groups of four. add_buffer_on_route (ICC2) places both stages with no displacement of existing cells, check_routes (ICC2) is clean after route_eco (ICC2), and PrimeTime shows the bit-to-bit spread at 7 ps.
PnR Flow Mentor Guide
Master the Physical Design Implementation Flow
Read the complete 8-chapter PnR Flow Mentor Guide free on the web — library setup through placement, clock tree synthesis, routing, chip finishing, hierarchical implementation, and ECO, all the way to stream-out.

Continue practising