Skip to content
Ch 10 / 14 Chapter 10: Power Planning
← Prev Next →

CHAPTER TEN

Power Planning: The Strategy You Defined Is Not Yet Metal on the Die

By the end of this chapter you will be able to wire VDD and VSS; to tell Metal 1 from Metal 2 from Metal 4; to read width, spacing, pitch and offset as four different lengths; to put a recipe on the core without thinking that is already metal; and to treat Successfully compiled PG. as a heartbeat, not a pass.

Why this chapter matters in a real project

Imagine you have just been handed Nimbus-8. The rooms are cut. The SRAMs are sitting down. Chapter 9 even wrote a power-grid recipe so the two NPU copies could share a 20 µm grid. Then it stopped. That recipe is still a card on the table. There is no metal on the die. The cells have nowhere to drink from. This chapter is the walk from “I know what I want the power grid to look like” to “the straps are actually there, and I have checked them.”

Sit with the die you already know. The core is a square 3.20 mm on each side, so an area of 10.24 mm² = 10,240,000 µm², at utilisation 0.617. The die is a square 3.44 mm on each side, so 11.83 mm² = 11,833,600 µm². A fifth of the core is still empty on purpose: the channel is 2.091 mm² = 2,091,000 µm². Power metal has to cross those rooms. It must not quietly steal that corridor.

One more thing, because it will happen to you. You will type compile_pg. The tool will print Successfully compiled PG. and return 1. That means the cook finished. It does not mean the meal is edible. Three other commands taste it: design-rule check, connectivity, missing vias.

Prerequisites

Chapter 9, because the furniture is already in the rooms. Chapter 8, because a module is a name and a block is a physical room — you plan power on the room. Chapter 4, for the die and the core. Chapter 2, for the habit of reading back what you just set. The library is nimbus8.dlib. The top is NIMBUS8.

How to read the numbers and the notation in this chapter

Table 10.1 How to read the numbers, units and the symbols in this chapter
You will seeRead it asWhat you need to know
µmmicrons, or micrometresEvery length you type. 1 mm = 1,000 µm. A ring width of 10 means 10 µm, not 10 mm.
widthhow fat one strap isThe road, not the gap. Teaching mesh: 3 µm.
spacingthe empty gap to the neighbourGrass between two roads. Teaching mesh: 3 µm. Not pitch.
pitchhow often the same net comes backVDD to the next VDD. Teaching mesh: 20 µm. 3,200 / 20 = 160.
offsetthe first step in from the edgeWhere the first strap sits. Teaching mesh: 2 µm. Not width.
Metal 1 / M1the ground floor, next to the cellsStandard-cell rails live here. One rail pair per 0.576 µm row.
Metal 2 / M2the next floor, signal streetsTrack pitch 0.048 µm. We do not put the 20 µm power mesh here.
Metal 4 / M4a higher floor, up-down meshVertical straps. Teaching width 3 µm, pitch 20 µm.
Metal 5 / M5the floor above that, left-right meshHorizontal straps. A via is the lift from M4 to M5.
Metal 7 / M8the ring floorsM7 walks left-right around the core. M8 walks up-down. Width 10 µm.
VDD / VSSpower / groundCreating the name does not connect a pin to it.
patternthe recipe cardLayers and lengths. No place on the die yet.
strategyrecipe plus kitchenWhich nets, which region. Still no metal.
compilethe cookcompile_pg is the first command that paints shapes.
MIBmultiply instantiated blockOne drawing, more than one cell. Two NPU copies share NPU_CORE.

Learning objectives

After this chapter you will be able to:

  1. Create VDD and VSS only if they do not already exist, then connect the pins.
  2. Point at Metal 1, Metal 2, Metal 4 and Metal 5 on a sandwich and say what each floor is for.
  3. Read width, spacing, pitch and offset out loud as four different sentences.
  4. Build the Nimbus-8 ring on M7/M8 and the mesh on M4/M5 without mixing those floors.
  5. Put a recipe on the core with a strategy, then admit that nothing is painted yet.
  6. Compile one strategy at a time. Know that -undo removes only the last cook.
  7. Run three checks after the cheerful compile message, and treat early analysis as early.
  8. Know the names of the advanced tools without inventing their flags.
Chapter 10 hero: four gates, the Nimbus-8 die with a Metal 4 and Metal 5 mesh in the core, and a legend for Metal 1, Metal 2, Metal 4 and Metal 5 under the die.
Figure 10.1 Same die you already know. Metal appears only at compile_pg. The legend under the die is the sandwich: M1 rails, M2 signal streets, M4 up-down mesh, M5 left-right mesh. Teaching purpose: one picture of the job, and which floor is which, before any command is typed.

The beginner’s mental model

A recipe is not dinner

Sit with a recipe card next to an empty plate. The ring pattern is “use a 10 µm strip of Metal 7 and Metal 8 around the core.” The mesh pattern is “draw 3 µm roads on Metal 4 and Metal 5, every 20 µm.” The strategy is “cook that recipe on the core, and call the two roads VDD and VSS.” None of that is dinner. compile_pg is the person who actually puts food on the plate.

The analogy stops being silicon quite quickly, and that is the point. Metal has to obey spacing rules. It has to touch pins. Two floors only talk through a via. A beautiful recipe can still leave a SRAM thirsty. A cook can finish and still leave a missing via. That is why tasting is a different command from cooking.

Recipe card, strategy place setting, compile cook, and inspected plated meal, mapped to pattern strategy compile and checks.
Figure 10.2 Pattern is recipe; strategy is recipe plus place and real nets; compile creates shapes; checks decide whether those shapes are useful. Teaching purpose: prevent a defined strategy being mistaken for metal.

The precise engineering model

Think of the chip as a sandwich. At the bottom sit the transistors, in rows 0.576 µm high. Metal 1 is the ground floor: tiny power rails that walk with those rows. Metal 2 is the next floor: dense signal streets, 0.048 µm apart on this library. We do not put the fat 20 µm power mesh there — that would be parking a lorry on a bicycle lane. Metal 4 and Metal 5 are higher floors where the mesh can be fat. Metal 7 and Metal 8 are higher still, where a ring can walk around the core. A via is a lift between two floors.

The database starts with names (VDD, VSS), pins on cells, a floorplan, and those empty floors. create_net writes a name if power intent has not already done so. connect_pg_net clips the cell pins onto that name. Pattern commands write a recipe. set_pg_strategy says which kitchen receives the recipe. compile_pg paints the metal. Then you taste.

Why all this metal? Voltage droops along a resistive road (IR). Too much current in too thin a road wears the metal (electromigration). And every power strap steals tracks the signals also wanted. There is no one formula. You choose width, pitch and vias, then you look. The practical loop is kind to beginners: ring, compile, check. Mesh, compile, check. Macro pins, compile, check. Rails, compile, check. Four small cooks are easier to debug than one giant one.

Five engineering gates: nets connected, patterns defined, strategy mapped, compile instantiated, integrity checked.
Figure 10.3 The precise model is five gates. A success at one gate does not certify the next. Teaching purpose: make the debug boundary explicit.

Do not confuse these

Table 10.2 Pairs that look alike and are not
ThisIs not thisWhy the mix-up is expensive
create_netconnect_pg_netThe first creates a net object. It does not connect PG pins.
PatternStrategyA pattern is geometry. A strategy adds region and real-net mapping.
Strategycompile_pgChapter 9 defined one and stopped. Compile creates metal.
ModuleBlockA module is logical hierarchy. A block is a physical design. Region choices that say blocks do not mean modules.
Mesh over a macroMacro-pin connectionCrossing above a macro does not prove its PG pins are connected.
Mesh pitchStandard-cell rail pitchNimbus-8 mesh pitch is 20 µm. M1 rails follow rows at 0.576 µm.
{name: pattern_name}{pattern: pattern_name}Syntax uses name:; flow examples also show pattern:. Use name: in new Tcl and confirm with man.
Compile successClean PGSuccessfully compiled PG. and return 1 do not replace three checks.
compile_pg -undoUndo all PGIt removes only the most recent compile_pg.
analyze_power_planSign-off IR analysisIt is early plan analysis, useful before later sign-off work.
Define geometry, bind it to a place, compile it, then prove it. Every verb changes a different layer of truth.

Concepts built from first principles

Part 1 — Create and connect power nets

First question, asked out loud: do VDD and VSS already exist? If committed power intent (UPF) created them, do not create them again. You will collide with a name that is already there. If they do not exist, create them. Either way, creating a name is not connecting a pin. A SRAM can sit next to a net called VDD and still be thirsty.

# Use create_net only when power intent has not already created these nets
icc2_shell> create_net -power VDD
icc2_shell> create_net -ground VSS
# Automatic is the default; spelling it out makes the teaching intent visible
icc2_shell> connect_pg_net -automatic -report_connection_summary true

Automatic connection is the default. It reads the power intent and the library pins and clips them together. You cannot mix it with a hand-written -net list on the same call. Manual connection exists for when you name the exact pins yourself. This chapter will not invent that list. Confirm the live switches with man connect_pg_net.

TRAP / MISTAKEA net object is not a connected supply

create_net -power VDD can succeed while every macro pin remains floating. The object exists. The electrical relationship does not, until connect_pg_net has done its job and connectivity is checked.

Skip duplicate creation when UPF owns the nets. Never skip connection merely because VDD and VSS appear in the database.

Part 2 — PG routing mode and via masters

set_pg_routing_mode -mode accepts default, tapeout, fast_exploration, and maximize_via. The modes change plan.pgroute.* application options. Read the mode back; do not invent a remembered default or copy hidden option values.

icc2_shell> set_pg_routing_mode -mode tapeout
icc2_shell> report_pg_routing_mode

tapeout aims for DRC-clean PG. fast_exploration trades completeness for speed and may skip DRC fixing of vias or disable via creation. maximize_via creates the maximum PG vias. Those are mode intentions, not a waiver from checking.

set_pg_via_master_rule exists for custom contact codes. This is working knowledge: default technology vias are used if you skip it. Confirm the exact custom-via syntax with man set_pg_via_master_rule; this chapter will not invent a contact-code example.

Part 3 — Ring patterns

A ring is a picture frame. It walks around a region, not across it. On Nimbus-8 the left-right sides of the frame are Metal 7. The up-down sides are Metal 8. Each strip is 10 µm fat, with 2 µm of empty gap between VDD and VSS. The strategy later sits that frame 3 µm in from the core and lets it run out to the design boundary. The pattern itself still paints nothing.

# Nimbus-8 teaching ring; every length is in micrometres
icc2_shell> create_pg_ring_pattern nimbus_ring \
    -horizontal_layer M7 -horizontal_width {10} \
    -horizontal_spacing {2} \
    -vertical_layer M8 -vertical_width {10} \
    -vertical_spacing {2} -corner_bridge true

Parameters make a pattern reusable. Put @name where a value belongs, list names in -parameters, and pass values through the strategy’s {parameters: ...} in the same order. -track_alignment accepts track, half_track, or none. Use only when that alignment is an intentional constraint.

Pattern family cards for ring mesh macro connection standard-cell rails special composite and wire patterns.
Figure 10.4 Pattern families solve different geometric jobs. The common thread is that none creates metal until a strategy is compiled. Teaching purpose: separate reusable geometry from placement.
Nimbus-8 core wrapped by a Metal 7 left-right ring and a Metal 8 up-down ring, ten micrometres wide.
Figure 10.5 A ring is a picture frame, not a mesh. Metal 7 walks left-right. Metal 8 walks up-down. Width 10 µm, spacing 2 µm, offset 3 µm. The pattern still has not painted this. Teaching purpose: see the frame before seeing the grid inside it.

Part 4 — Mesh patterns

Now the four lengths. Beginners mash them into one word, “thickness.” They are four different sentences. Say them out loud while you look at Figure 10.6.

Width 3 µm is how fat one strap is. Think of a road. Not the grass. Not the next road. The tarmac. 3 µm = 0.003 mm.

Spacing 3 µm is the empty gap to the neighbour. VDD is 3 µm fat, then 3 µm of nothing, then VSS is 3 µm fat. Spacing is the nothing. It is a coincidence that width and spacing are both 3 on this teaching mesh. They do not have to match. Do not treat them as one number because they look similar.

Pitch 20 µm is how often the same net comes back. Centre of one VDD to centre of the next VDD. That is 20 µm = 0.020 mm. Across a core 3,200 µm wide: 3,200 / 20 = 160 straps per direction. Pitch is not width. Pitch is not spacing. Pitch is not “VDD to VSS.”

Offset 2 µm is the first step in from the core edge before the first strap starts. It is not a fourth name for width. If you type 2 thinking you made a fatter road, you only moved the first strap.

Which floor? Metal 4 runs up and down. Metal 5 runs left and right. Where they cross, a via is the lift. Metal 1 is the ground floor, for rails. Metal 2 is the signal street at 0.048 µm — leave it alone. This is the same 20 µm pitch Chapter 9 borrowed. Now it becomes metal.

# Chapter 9 borrowed this 20 um pitch. Chapter 10 paints it.
# width 3 um, spacing 3 um, pitch 20 um, offset 2 um
# Metal 4 up-down, Metal 5 left-right. Not Metal 1. Not Metal 2.
icc2_shell> create_pg_mesh_pattern nimbus_mesh -layers { \
    {{vertical_layer: M4} {width: 3} {spacing: 3} \
      {pitch: 20} {offset: 2}} \
    {{horizontal_layer: M5} {width: 3} {spacing: 3} \
      {pitch: 20} {offset: 2}} }

You may later see a production script with an interleaved mesh on M6/M7/M8. That is a different sandwich. Do not silently upgrade Nimbus-8. This teaching design stays on M4 and M5 at 20 µm so the Chapter 9 grid still means the same thing.

Zoomed Metal 4 straps with four dimension arrows: offset 2 micrometres, width 3 micrometres, spacing 3 micrometres, pitch 20 micrometres. A sandwich legend from Metal 8 down to Metal 1. A crossing of Metal 4 and Metal 5 with a via labelled beside the metal.
Figure 10.6 Four lengths, four arrows. Width is fatness. Spacing is the gap. Pitch is VDD to the next VDD (3,200 / 20 = 160). Offset is the first step in. The sandwich shows Metal 1 (rails) and Metal 2 (signal streets) as different floors from Metal 4 and Metal 5 (the mesh). Teaching purpose: stop the four numbers collapsing into one word, and stop M1 being used as if it were the mesh.

Part 5 — Macro connections and standard-cell rails

A macro connection pattern reaches PG pins. Required choices are -pin_conn_type and -layers. Pin types are long_pin, ring_pin, and scattered_pin. Direction, width, nets, and parameters are optional. Because Nimbus-8 library pin layers are library facts, the worked script uses a teaching long-pin connection on M4 and tells you to confirm that layer against the macro abstract.

# Confirm macro PG pin geometry before using this teaching layer
icc2_shell> create_pg_macro_conn_pattern nimbus_macro_conn \
    -pin_conn_type long_pin -direction vertical -layers {M4}

Standard-cell rails are a different floor and a different job. They live on Metal 1, next to the transistors, one pair per 0.576 µm row. They collect current locally. The M4/M5 mesh is the highway 20 µm away. If you copy pitch 20 onto Metal 1, most rows get no rail. Default rail width is the longest PG pin the tool can see. If there are no standard cells yet, you must give -rail_width — the tool has nothing to measure.

# M1 rails align with standard-cell PG pins and the 0.576 um rows
icc2_shell> create_pg_std_cell_conn_pattern nimbus_rails -layers {M1}

Optional rail controls include -rail_width {top bottom}, -rail_shift, masks, DRC checking, and marking as follow-pin. Defaults already align rails with standard-cell pins. Set an option only when you mean to change that contract.

Macro with long PG pins reached by a macro connection, contrasted with mesh merely crossing above the macro.
Figure 10.9 Mesh-over-macro is not macro-pin connectivity. A macro-connection pattern must meet the actual PG pin geometry. Teaching purpose: expose a common false visual connection.
Ten standard-cell rows with maroon Metal 1 rails, row height 0.576 micrometres, and a note that Metal 1 is not Metal 4.
Figure 10.10 Metal 1 is the ground floor. Rails follow 0.576 µm rows. Metal 2 is the signal street. The 20 µm mesh lives on Metal 4 and Metal 5. Teaching purpose: stop the mesh pitch being copied onto the rails.

Part 6 — Special, composite, and wire patterns

create_pg_special_pattern handles channel or alignment straps. create_pg_wire_pattern and create_pg_composite_pattern support shapes such as centre-aligned vias, bridging, via bridging, tapering, and checkerboards. create_pg_pattern_shapes and create_via_matrix are also working knowledge. These are useful when ring-plus-mesh-plus-connections cannot express the intended geometry. Confirm exact syntax with man; do not improvise flags from the feature names.

create_pg_strap and create_pg_vias are manual atomic tools. This chapter’s teaching path is pattern-based because reusable intent, strategy scoping, and staged compilation are easier to review than many one-off shapes.

Part 7 — Regions, strategy, blockage, and extension

The recipe still does not know which room to cook in. set_pg_strategy answers that. You pick exactly one region: the core, the design boundary, a voltage area, a polygon, some macros, some blocks, or a named PG region. One. Not two. And a block is still not a module.

# Ring: symbolic positions map to VDD VSS; offset is 3 um in x and y
icc2_shell> set_pg_strategy nimbus_ring_s -core \
    -pattern {{name: nimbus_ring} {nets: {VDD VSS}} \
              {offset: {3 3}}} \
    -extension {{stop: design_boundary}}
# Mesh: stop at the outermost ring and stay off hard macros
# Documented blockage shape is macros:{ cell cell }. Expand names first;
# extra braces would freeze a get_cells call as literal text.
icc2_shell> set hm [get_object_name [get_cells -hierarchical \
    -filter "is_hard_macro==true"]]
icc2_shell> set_pg_strategy nimbus_mesh_s -core \
    -pattern {{name: nimbus_mesh} {nets: {VDD VSS}}} \
    -extension {{stop: outermost_ring}} \
    -blockage [list macros: $hm]

The documented blockage shape is {macros:{ cell1 cell2 }}. Expand a collection into that list; extra braces freeze get_cells as literal text. Confirm the accepted expansion with man set_pg_strategy.

The pattern expression’s syntax uses {name: pattern_name}. Flow examples also write {pattern: mesh_pattern} for mesh and macro patterns. Name both forms when reviewing old Tcl; use {name: ...} in new Tcl and confirm with man set_pg_strategy on the build you run.

Extension stop tokens include first_target, innermost_ring, outermost_ring, pad_ring, design_boundary, design_boundary_and_generate_pin, and distance_in_microns. A blockage can name PG regions, blocks, macros, polygon, or voltage areas, with nets, layers, and area where appropriate. Use the simplest form your geometry requires.

create_pg_region, report_pg_regions, and remove_pg_regions -all manage reusable PG regions. The -tag on a strategy can support later organisation. Parameters passed through a strategy must remain in the same order as the pattern’s -parameters.

Left, a recipe card for the nimbus mesh. An arrow labelled assign. Right, a simple die with an empty core labelled the core, and notes that sit beside the die rather than on top of it.
Figure 10.7 A strategy answers where. On Nimbus-8 that where is the core — the dashed square 3.20 mm on each side. The recipe still has not painted metal. Labels sit beside the die so they can be read. Teaching purpose: separate the card from the kitchen, without burying the kitchen under overflowing names.

Part 8 — Instantiating with compile_pg

compile_pg is the cook. Until you type it, the die is still empty of straps. By default it cooks every strategy you have defined. While you are learning, name one. Cook the ring. Taste it. Then the mesh. Taste it. That way a burnt mesh does not hide inside a burnt everything.

icc2_shell> compile_pg -strategies nimbus_ring_s
icc2_shell> compile_pg -strategies nimbus_mesh_s -show_phantom

-show_phantom reports wires or vias that should have been created but failed DRC fixing. -ignore_drc and -ignore_via_drc are mutually exclusive. They do not make violations disappear; they alter what blocks creation. Signal routes are ignored for PG DRC by default. Set plan.pgroute.honor_signal_route_drc true when the flow requires PG to honour them.

compile_pg -undo removes only the most recent compile_pg. If you compiled ring, then mesh, then macro connections, one undo removes the macro-connection cook, not all PG and not the mesh. Tags can help organise a cook, but they do not change the one-level undo rule.

Console prints Successfully compiled PG and return 1, while three red inspection lamps show DRC connectivity and missing-via failures.
Figure 10.8 Quiet success is a command status, not integrity. Successfully compiled PG. may coexist with failures in all three checks. Teaching purpose: make the chapter’s central trap impossible to miss.
TRAP / MISTAKESuccessfully compiled is not successfully checked

The compiler can finish every recipe it was able to instantiate and still leave spacing trouble, floating pin clusters, or absent vias. Read the message as “the command completed”. Never paraphrase it as “the mesh is clean”.

Compile one strategy, inspect phantoms, run checks, then add the next structure. Undo is one cook deep.

Part 9 — Integrity checks and analysis

The three checks ask different questions. check_pg_drc asks whether PG geometry obeys rules. check_pg_connectivity asks whether wires, vias, and PG pins form the intended electrical graph. check_pg_missing_vias asks whether adjacent orthogonal-layer intersections lack expected vias.

icc2_shell> check_pg_drc -nets {VDD VSS} -no_gui -output nimbus8_pg_drc.rpt
icc2_shell> check_pg_connectivity -nets {VDD VSS} \
    -check_macro_pins all -check_std_cell_pins all \
    -error_view_name nimbus8_pg_conn
icc2_shell> check_pg_missing_vias -nets {VDD VSS} \
    -output_file nimbus8_missing_vias.rpt -filter_by_drc
icc2_shell> analyze_power_plan

Connectivity defaults matter: macro pins one, block pins all, pad pins one. State those defaults in an interview, then say when you would request all. Standard-cell pin checking is selectable too; this worked script requests all explicitly.

Missing-via checking defaults to adjacent orthogonal layers. Options can narrow a bounding box, honour blockages, ignore small intersections, or use a via-rule file. DRC checking can limit layers or coordinates and can include detailed-route shapes. Use only the filters that match the question; an aggressively filtered report is not a clean design.

analyze_power_plan is early analysis of the plan. It helps compare topology and metal choices before later sign-off analysis. It does not turn this chapter into sign-off IR closure.

Orthogonal M4 and M5 straps with present via, missing via, and DRC-filtered impossible via examples.
Figure 10.13 A crossing is geometry; a via is connectivity. Missing-via checking focuses on adjacent orthogonal-layer intersections by default. Teaching purpose: separate visual crossing from electrical connection.
Three inspection lenses over the same PG: ruler for DRC, continuity meter for connectivity, and via map for missing vias.
Figure 10.14 Three checks, three questions. None is a synonym for another, and none is replaced by the compile message. Teaching purpose: establish the minimum integrity triad.

Part 10 — Working knowledge: switches, trim, merge, stapling, ladders

trim_pg_mesh can trim rings, stripes, library-cell pin connections, macro-pin connections, or macro connections to a target wire or via. Default -trim_to is target_wire. DRC choices are no_check or check_but_no_fix. It has its own -undo. Confirm that your -types match the shapes you intend before trimming.

merge_pg_mesh, create_pg_stapling_vias, and connect_pg_via_ladders repair or consolidate specialised connectivity. create_power_switch_ring, create_power_switch_array, set_power_switch_placement_pattern, and connect_power_switch support switched supplies. Nimbus-8 is not switch-heavy, so these remain working knowledge. Confirm each syntax with man; do not infer flags from the command name.

generate_pg_script accepts input, input spreadsheet, output, run, and template paths. A syntax line prints -outut; the argument is -output. Use -output and confirm with man generate_pg_script. The PG Planning Task Assistant offers a GUI path; this chapter stays in the shell so every database transition is visible.

Distributed PG routing is available for larger work. Treat host setup and partition behaviour as working knowledge and confirm them locally. Early data checks can be managed with set_early_data_check_policy and report_early_data_checks; use them as an early warning layer, not as replacements for the integrity triad.

Mentor checkpoint 1: establish who owns VDD and VSS

Sit with the database before typing creation commands. There are only two sensible starting states:

The dangerous third state is uncertainty. Re-running creation because “the script always starts that way” can collide with power intent. Skipping connection because the names appear in a browser leaves pins floating. Ownership first, connection second.

A connection summary is evidence about logical PG relationships. It is not evidence that M4 meets M5 through a via or that an SRAM long pin reaches the mesh. Those questions become available after compilation.

Mentor checkpoint 2: choose a mode for the question being asked

If you are testing only whether a pattern covers the intended rooms, fast_exploration may be useful. Its speed has a price: via creation or via DRC fixing may be reduced. Do not compare its connectivity report with a tapeout-mode report as if the mode were irrelevant.

If you are preparing a result that should aim for DRC-clean PG, tapeout expresses that intention. If via redundancy is the explicit experiment, maximize_via expresses a different intention. default returns to the normal mode contract.

Whatever the choice, use the same three-step habit:

  1. Set the named mode.
  2. Report the mode.
  3. Record it beside the check reports.

That small record prevents a fast exploratory cook from being promoted accidentally as the final checked mesh.

Mentor checkpoint 3: read the ring as four sides, not one word

Nimbus-8’s teaching ring uses M7 for horizontal sides and M8 for vertical sides. Each listed width is 10 µm; each listed spacing is 2 µm. The strategy places the pattern at {3 3} µm and extends it to the design boundary. Corner bridging is true.

Each fact answers a separate review question:

If an image looks like a ring but one side belongs to the wrong layer, it is not the specified ring. Geometry is reviewed by attributes and checks, not by colour alone.

Mentor checkpoint 4: preserve Chapter 9 mesh continuity

The mesh borrowed in Chapter 9 was not a placeholder to be silently upgraded. It was M4 vertical and M5 horizontal, width 3 µm, spacing 3 µm, pitch 20 µm, offset 2 µm. The block grid depended on that intent.

A flow-style interleaved M6/M7/M8 mesh can be a useful alternative complete-script shape. It is not the Nimbus-8 teaching mesh. Changing to it would change layer use, via interfaces, and the relationship with the ring. That is a new design decision, not formatting.

Use the simple arithmetic as a review alarm:

If a report or picture suggests twenty straps, someone probably copied the Altair-5 pitch or counted the wrong structure.

Mentor checkpoint 5: protect macros, then reconnect them deliberately

A macro blockage keeps regular mesh straps away from macro area. That protects routing and pin-access resources, but it also creates an electrical obligation: the macro still needs a path to VDD and VSS.

The macro-connection pattern fulfils that obligation. Choose long_pin, ring_pin, or scattered_pin from the actual abstract. Choose layers from the same evidence. A command that parses with the wrong type can still create an unhelpful pattern object.

Review in this order:

  1. Confirm macro PG pin geometry.
  2. Confirm the mesh blockage does not pretend to be a connection.
  3. Compile the macro strategy separately.
  4. Check macro pins with all.

Nimbus-8 contains 72 SRAMs at 0.0320 mm² = 32,000 µm² each, totalling 2.304 mm² = 2,304,000 µm². A connectivity shortcut repeated over that many macros is not a small shortcut.

Mentor checkpoint 6: let rails follow rows

The row is 0.576 µm high. The rail pattern aligns with standard-cell PG pins on those rows. The higher M4/M5 mesh is spaced at 20 µm. One is local collection; the other is distribution.

If cells already exist, the default rail width comes from the longest PG pin. If no cells exist, there is no pin to inspect, so -rail_width is required. That requirement is not an inconvenience to bypass with a guessed number. Obtain the intended rail dimensions from the technology and library setup, then confirm them with man and the database.

Shift 0 centres a rail at the row boundary. A positive shift moves it into rows. Use a non-zero shift only when the cell-pin geometry requires it and the DRC consequences are understood.

Mentor checkpoint 7: make strategy scope visible

Every strategy must answer “where?”. Core, design boundary, voltage areas, polygon, macros, blocks, and PG regions are distinct answers, and only one region selector belongs on a strategy.

Then answer four more questions:

A block selector refers to a physical design. It does not turn a logical module into a block. That distinction survives every chapter.

For new Tcl, the pattern expression uses {name: ...}. When an older example uses {pattern: ...}, do not hide the conflict. Confirm the accepted form with man set_pg_strategy on the running build.

Mentor checkpoint 8: compile in slices

Compile the ring alone. Check it. Compile the mesh alone. Check it. Compile macro connections alone. Check them. Compile rails alone. Check them. This is not ceremony; it is fault isolation.

If everything is compiled at once and macro pins float, possible causes include connection, blockage, pin type, pin layer, via suppression, or extension. If macro connections were the most recent isolated cook, the search space is smaller.

-show_phantom adds evidence about shapes that should have existed but failed DRC fixing. It should be read alongside, not instead of, DRC and missing-via reports.

Keep an explicit compile ledger:

  1. Strategy name.
  2. Routing mode.
  3. Compile status.
  4. Phantom observations.
  5. Three check report names and finding counts.

Then compile_pg -undo has a known target: the last line in that ledger.

Mentor checkpoint 9: interpret the three checks together

A DRC-clean wire can float. A connected path can violate spacing. Two orthogonal shapes can each be legal yet miss the via that joins them. That is why no single check dominates the other two.

Start broad enough to expose the problem. Narrow by net, coordinate, layer, or bounding box only after the first evidence points to a region. Keep the broad report so the narrowed debug run cannot be mistaken for full-design closure.

Connectivity pin defaults are part of the result:

When reviewing every macro connection, request macro pins all. When reviewing pad closure, request pad pins all. Defaults are useful starting points, not universal coverage claims.

Mentor checkpoint 10: know where working knowledge stops

Trim, merge, stapling vias, via ladders, switch rings, switch arrays, pattern-shape creation, via matrices, distributed routing, and script generation belong in the wider PG toolbox. They solve real problems. They are not reasons to invent option lists.

State the job each family performs, then use man before typing. For generate_pg_script, the known spelling conflict is explicit: use -output, not the printed -outut. For custom via masters, confirm contact-code syntax locally.

The GUI Task Assistant can help organise PG planning, but shell commands remain the teaching path because the pattern, strategy, compile, and check boundaries are visible in the transcript.

Inputs, outputs, and readiness

Table 10.3 What this chapter consumes and what it writes
StageNeedsWrites
NetsCommitted UPF, or a decision that nets do not yet existNet objects only; creation does not connect pins.
PG connectionPower intent and libraries with PG pins for automatic modePin-to-net connectivity; no wires or vias.
PatternsTechnology layers and intentional dimensionsReusable recipe objects; no region and no metal.
StrategiesPattern, exactly one region, real netsPlacement intent, parameters, offsets, extension, blockage; still no metal.
CompileDefined strategy and connected netsPG wires and vias in the design database.
Macro connectionActual macro PG pin type and layerShapes that reach macro pins after compile.
RailsRows and standard-cell PG pins, or explicit width if no cells existM1 follow-pin-style rails after compile.
Integrity checksCompiled PGReports and optional error views; they do not repair the plan.
Early analysisA plausible connected planPlanning evidence, not sign-off IR closure.

Preflight checklist

  1. nimbus8.dlib and top NIMBUS8 are open; the core and placed macros match Chapter 9.
  2. VDD and VSS exist once. If UPF created them, no duplicate create_net.
  3. connect_pg_net summary matches committed power intent and PG-capable libraries.
  4. Routing mode was set intentionally and read back.
  5. Ring is M7/M8, 10 µm wide, 2 µm spacing, offset {3 3} µm.
  6. Teaching mesh is M4/M5, width 3 µm, spacing 3 µm, pitch 20 µm, offset 2 µm.
  7. Macro connection matches real pin geometry. M1 rails follow 0.576 µm rows.
  8. Hard macros and blocks are not confused with modules in blockages or regions.
  9. One strategy will compile at a time; reports have unique names.
  10. Three checks are planned after every meaningful cook, not only at the end.

Guided tool workflow

  1. Open nimbus8.dlib, current top NIMBUS8, and confirm the 3.20 mm × 3.20 mm core.
  2. Create VDD/VSS only if UPF did not. Connect PG pins automatically and request a summary.
  3. Set tapeout mode for this teaching run and report it.
  4. Define the M7/M8 ring, map VDD/VSS at offset {3 3}, stop at the design boundary, compile only the ring, check.
  5. Define the continuous M4/M5 mesh at 20 µm pitch, block hard macros, stop at the outermost ring, compile only the mesh, check.
  6. Define a macro-connection pattern from actual macro pin geometry, strategy on macros, compile, check connectivity with all macro pins.
  7. Define M1 rails, strategy on core, compile, check all standard-cell pins.
  8. Run missing-via check and early power-plan analysis. Inspect reports before accepting the cheerful compile lines.

What to record at each gate

A reproducible PG review is a sequence of small records. Sit beside the beginner and write the evidence down while the commands are still fresh.

Gate A — net and pin ownership

This gate contains no claim about metal. Its output is logical ownership and connection intent.

Gate B — reusable geometry

This gate contains pattern objects. It still contains no claim that the die has those shapes.

Gate C — placement intent

Record whether the active build accepts {name: ...} as expected. If old Tcl used {pattern: ...}, record that as a compatibility observation rather than silently mixing styles.

Gate D — instantiated shapes

At this gate, wires and vias finally exist. Their existence is not yet evidence that they are legal or connected.

Gate E — integrity

If any finding is accepted temporarily, give it an owner and a reason. “Compile returned 1” is neither.

Routability conversation before denser metal

A beginner often sees an IR concern and reaches first for more straps. More metal may help delivery, but it also consumes tracks and creates more intersections needing vias. On Nimbus-8, the channel is 2.091 mm² = 2,091,000 µm², or 20.4 per cent of the core. Chapter 9 protected it for a reason.

Before reducing pitch, ask:

  1. Is the observed weakness a disconnected macro, rather than insufficient mesh density?
  2. Are missing vias preventing the present mesh from behaving as intended?
  3. Would wider straps or stronger via population address the local concern with less routing cost?
  4. Does the proposed layer change collide with signal corridors or the M7/M8 ring?
  5. Will the MIB grid assumptions inherited from the 20 µm pitch remain valid?

No invented formula replaces that conversation. Use early analysis to compare plans, then preserve room for later sign-off work.

Reading a quiet transcript correctly

A useful transcript may look uneventful:

icc2_shell> compile_pg -strategies nimbus_mesh_s -show_phantom
# Successfully compiled PG.
# Return value: 1
# Continue: read phantom output and run three checks

The first line is an action. The next two are status. The final comment is engineering process. If a check then reports a missing M4–M5 via, the transcript is not contradictory. The compiler completed and the integrity check found a defect.

That distinction is what makes automation safe. A script should treat command completion and acceptance criteria as separate gates, just as the mentor does.

Stop conditions before the worked example

Pause the flow and debug when any of these statements is true:

Continue when the opposite evidence is recorded:

This is not a request for approval. It is a technical readiness boundary: facts before the next database mutation.

Eight-point treatment of the commands that matter

Each row records purpose, key options, defaults, units, what changes in the database, what does not, the return or quiet-success trap, and a companion report or check. Additional syntax belongs behind man <command>; no flag should be guessed from memory.

Table 10.4 Eight points for each important command
CommandThe eight points
create_net / connect_pg_net
  1. Purpose. Create supply net objects, then connect PG pins.
  2. Key options. create_net: -design, -power, -ground, -tie_high, -tie_low, -cell. connect_pg_net: -automatic, -pg, -tie, -all_blocks, -block, -design, -net, port/pin list, -create_nets_only, -reconnect, -report_connection_summary, -verbose.
  3. Defaults. connect_pg_net defaults to automatic. Automatic cannot combine with -net or a port/pin list and needs committed power intent plus PG-aware libraries.
  4. Units. No geometric units.
  5. Changes in the database. create_net writes net objects; connect_pg_net writes pin-to-net connectivity.
  6. Does not change. Neither command creates PG metal.
  7. Return / quiet-success trap. A successful create_net can leave every PG pin floating. UPF may already own the nets.
  8. Companion report or check. Use the connection summary, then check_pg_connectivity after metal exists.
create_pg_ring_pattern
  1. Purpose. Store a reusable ring recipe.
  2. Key options. Nets, horizontal/vertical or side layers, widths, spacing, corner bridge, track alignment, parameters, via rule.
  3. Defaults. Omitted width uses technology minimum. Nets are symbolic until strategy mapping.
  4. Units. Widths, spacing, and offsets are micrometres.
  5. Changes in the database. Writes a pattern object.
  6. Does not change. Does not select a region and creates no wires.
  7. Return / quiet-success trap. Status success means the recipe parsed, not that a ring exists.
  8. Companion report or check. Inspect the pattern through strategy/compile results; man create_pg_ring_pattern.
create_pg_mesh_pattern
  1. Purpose. Store repeated horizontal and vertical strap geometry.
  2. Key options. Layer expressions: layer, width, spacing, offset, pitch, trim, track alignment, mask; parameters and via rule.
  3. Defaults. Minimum and interleaving tokens are available; set explicit teaching dimensions.
  4. Units. Micrometres. Nimbus-8 pitch 20 gives 3,200 / 20 = 160 per direction as planning arithmetic.
  5. Changes in the database. Writes a mesh-pattern object.
  6. Does not change. Does not bind VDD/VSS or avoid macros until strategy.
  7. Return / quiet-success trap. Status success can coexist with a strategy that never gets compiled.
  8. Companion report or check. Compile named strategy; check DRC, connectivity, and missing vias.
create_pg_macro_conn_pattern
  1. Purpose. Describe shapes that reach macro PG pins.
  2. Key options. Required -pin_conn_type long_pin|ring_pin|scattered_pin and -layers; optional nets, parameters, direction, width.
  3. Defaults. No invented default pin type: both required choices must reflect the macro abstract.
  4. Units. Widths in micrometres.
  5. Changes in the database. Writes a macro-connection pattern object.
  6. Does not change. Does not prove mesh crossing above a macro reaches its pin.
  7. Return / quiet-success trap. Pattern status success says nothing about actual pin connectivity.
  8. Companion report or check. check_pg_connectivity -check_macro_pins all.
create_pg_std_cell_conn_pattern
  1. Purpose. Describe standard-cell PG rails.
  2. Key options. Rail width, shift, mask, layers, DRC check, mark-as-follow-pin, parameters.
  3. Defaults. Default width is longest PG pin; if no standard cells exist, rail width is required. Shift 0 centres on row boundary.
  4. Units. Micrometres; Nimbus-8 rows are 0.576 um.
  5. Changes in the database. Writes a rail-pattern object.
  6. Does not change. Does not create a 20 um mesh and creates no rail until compiled.
  7. Return / quiet-success trap. A no-cell design may reject omission of -rail_width.
  8. Companion report or check. check_pg_connectivity -check_std_cell_pins all.
set_pg_strategy
  1. Purpose. Bind one pattern to one legal region and real nets.
  2. Key options. Mutually exclusive region selector; required -pattern; extension, blockage, tag.
  3. Defaults. Exactly one region is required. New Tcl uses {name:}; examples also show {pattern:}; confirm with man.
  4. Units. Offsets and distance stops are micrometres.
  5. Changes in the database. Writes strategy intent, mapping, parameters, blockage, and extension.
  6. Does not change. Creates no metal. Chapter 9 stopped here.
  7. Return / quiet-success trap. Status success is still only a stored strategy.
  8. Companion report or check. Compile the named strategy; report or inspect resulting PG.
compile_pg
  1. Purpose. Instantiate strategy wires and vias.
  2. Key options. Strategies, via rule, ignore DRC, ignore via DRC, show phantom, undo, tag, ML data/model.
  3. Defaults. Without -strategies compiles all. -ignore_drc and -ignore_via_drc are mutually exclusive. Undo removes the latest cook only.
  4. Units. Uses pattern dimensions already expressed in micrometres.
  5. Changes in the database. Writes or, with -undo, removes PG shapes.
  6. Does not change. Does not certify DRC, connectivity, or via completeness.
  7. Return / quiet-success trap. May print Successfully compiled PG. and return 1 while checks fail.
  8. Companion report or check. check_pg_drc, check_pg_connectivity, check_pg_missing_vias.
check_pg_drc / conn / missing_vias
  1. Purpose. Inspect geometry, electrical continuity, and expected inter-layer vias.
  2. Key options. DRC: nets/layers/coordinates/output. Connectivity: nets and pin classes. Missing vias: nets/bbox/rules/output/filtering.
  3. Defaults. Connectivity defaults: macro one, block all, pad one. Missing-via default: adjacent orthogonal layers.
  4. Units. Coordinates and layer ranges use design geometry; reports preserve physical units.
  5. Changes in the database. Write reports and optional error views; optional connectivity removal switches can mutate, so do not use casually.
  6. Does not change. Do not build the intended PG plan and do not replace analysis.
  7. Return / quiet-success trap. A check command completing does not imply zero findings; read counts and details.
  8. Companion report or check. Companion: analyze_power_plan for early plan analysis, not sign-off.

One continuous worked example

Situation. Nimbus-8’s rooms and macros exist in nimbus8.dlib, top NIMBUS8. u_cpu_cluster is 2.00 mm × 1.586 mm = 3.172 mm² = 3,172,000 µm² and parents u_core_pair_0 and u_core_pair_1. u_npu_core_0 and u_npu_core_1 are a multiply instantiated block (MIB), reference NPU_CORE, each 1.03 mm × 1.154 mm = 1.189 mm² = 1,189,000 µm². u_isp is 1.55 mm × 1.108 mm = 1.717 mm² = 1,717,000 µm². u_soc_periph is 0.82 mm × 0.413 mm = 0.339 mm² = 339,000 µm².

Seventy-two SRAMs, each 200 µm × 160 µm = 32,000 µm² = 0.0320 mm², occupy 2.304 mm² = 2,304,000 µm². The DDR PHY is 1.60 mm × 0.34 mm = 0.544 mm² = 544,000 µm². The ring, mesh, macro connections, and M1 rails must reach these loads without erasing the 2.091 mm² = 2,091,000 µm² channel story.

Nimbus-8 with a ring, teal Metal 4 vertical mesh and gold Metal 5 horizontal mesh, plus a colour legend for M4, M5 and M1.
Figure 10.11 The worked die. Teal up-down is Metal 4. Gold left-right is Metal 5. Rails on Metal 1 are too fine to draw at this scale — that is the point. Pitch still 20 µm. Channel still 2.091 mm². Teaching purpose: keep one design, one sandwich, one set of arithmetic.
# Nimbus-8 pattern-based PG script
# Library nimbus8.dlib; top NIMBUS8
# Core 3,200 um × 3,200 um = 10.24 mm² = 10,240,000 µm²
# Create only if committed UPF did not already create these nets
icc2_shell> create_net -power VDD
icc2_shell> create_net -ground VSS
icc2_shell> connect_pg_net -automatic -report_connection_summary true
icc2_shell> set_pg_routing_mode -mode tapeout
icc2_shell> report_pg_routing_mode
# Ring: M7 horizontal, M8 vertical, width 10 um, spacing 2 um
icc2_shell> create_pg_ring_pattern nimbus_ring \
    -horizontal_layer M7 -horizontal_width {10} \
    -horizontal_spacing {2} \
    -vertical_layer M8 -vertical_width {10} \
    -vertical_spacing {2} -corner_bridge true
icc2_shell> set_pg_strategy nimbus_ring_s -core \
    -pattern {{name: nimbus_ring} {nets: {VDD VSS}} \
              {offset: {3 3}}} \
    -extension {{stop: design_boundary}}
icc2_shell> compile_pg -strategies nimbus_ring_s
icc2_shell> check_pg_drc -nets {VDD VSS} -no_gui \
    -output nimbus8_ring_drc.rpt
icc2_shell> check_pg_connectivity -nets {VDD VSS} \
    -check_macro_pins one -check_block_pins all \
    -check_pad_pins one -error_view_name nimbus8_ring_conn
# Mesh continuity with Chapter 9:
# M4 vertical / M5 horizontal, width 3 um, spacing 3 um
# pitch 20 um, offset 2 um; 3,200 / 20 = 160 straps per direction
icc2_shell> create_pg_mesh_pattern nimbus_mesh -layers { \
    {{vertical_layer: M4} {width: 3} {spacing: 3} \
      {pitch: 20} {offset: 2}} \
    {{horizontal_layer: M5} {width: 3} {spacing: 3} \
      {pitch: 20} {offset: 2}} }
icc2_shell> set hm [get_object_name [get_cells -hierarchical \
    -filter "is_hard_macro==true"]]
icc2_shell> set_pg_strategy nimbus_mesh_s -core \
    -pattern {{name: nimbus_mesh} {nets: {VDD VSS}}} \
    -extension {{stop: outermost_ring}} \
    -blockage [list macros: $hm]
icc2_shell> compile_pg -strategies nimbus_mesh_s -show_phantom
icc2_shell> check_pg_drc -nets {VDD VSS} -no_gui \
    -output nimbus8_mesh_drc.rpt
icc2_shell> check_pg_missing_vias -nets {VDD VSS} \
    -output_file nimbus8_mesh_missing_vias.rpt -filter_by_drc
# Macro connection: teaching long-pin shape on M4
# Confirm M4 and pin type against the actual macro abstracts with man and reports
icc2_shell> create_pg_macro_conn_pattern nimbus_macro_conn \
    -pin_conn_type long_pin -direction vertical -layers {M4}
icc2_shell> set_pg_strategy nimbus_macro_s -macros \
    [get_cells -hierarchical -filter "is_hard_macro==true"] \
    -pattern {{name: nimbus_macro_conn} {nets: {VDD VSS}}}
icc2_shell> compile_pg -strategies nimbus_macro_s -show_phantom
icc2_shell> check_pg_connectivity -nets {VDD VSS} \
    -check_macro_pins all -check_block_pins all \
    -check_pad_pins one -error_view_name nimbus8_macro_conn
# Standard-cell rails: M1 follows 0.576 um row structure, not 20 um mesh pitch
icc2_shell> create_pg_std_cell_conn_pattern nimbus_rails -layers {M1}
icc2_shell> set_pg_strategy nimbus_rails_s -core \
    -pattern {{name: nimbus_rails} {nets: {VDD VSS}}}
icc2_shell> compile_pg -strategies nimbus_rails_s
# Quiet success may print here. The checks are still mandatory.
icc2_shell> check_pg_drc -nets {VDD VSS} -no_gui \
    -output nimbus8_pg_drc.rpt
icc2_shell> check_pg_connectivity -nets {VDD VSS} \
    -check_macro_pins all -check_block_pins all \
    -check_pad_pins all -check_std_cell_pins all \
    -error_view_name nimbus8_pg_connectivity
icc2_shell> check_pg_missing_vias -nets {VDD VSS} \
    -output_file nimbus8_pg_missing_vias.rpt -filter_by_drc
icc2_shell> analyze_power_plan

Expected. Each compile may print Successfully compiled PG. and return 1. Then reports may still contain findings. Ring shapes should follow M7/M8 around the core at a 3 µm offset. Mesh arithmetic begins at 160 straps per direction. Macro pins should not float when checked with all. M1 rails should follow rows. Missing-via results need classification: true omission, DRC-blocked via, intentionally blocked intersection, or filtered small intersection.

Engineering judgement. Inspect whether 72 SRAMs totalling 2.304 mm² = 2,304,000 µm² and the 0.544 mm² = 544,000 µm² DDR PHY have credible PG access. Confirm that blocking mesh over macros did not isolate them because the macro-connection strategy failed. Then compare early plan analysis with routability: wider or denser metal can help IR and EM while consuming the same corridors Chapter 9 protected.

Failure modes and debugging

Table 10.5 Symptom, cause, check, correction, prevention
SymptomLikely causeCheckCorrectionPrevention
Successfully compiled PG. printed and return was 1, so the mesh is called “clean”Compile status was mistaken for integrityRun all three checks and read findingsRepair geometry, continuity, or vias; compile the affected strategy againQuiet success is a heartbeat, not a certificate
VDD/VSS exist but macro pins floatconnect_pg_net was skippedConnection summary; connectivity checkConnect automatically or with a verified manual pin listCreate and connect are separate verbs
Strategy parser rejects a copied pattern expressionOld flow used {pattern:} while current syntax expects {name:}man set_pg_strategyUse {name: ...} in new TclName the conflict in code review
Undo leaves ring and mesh in placeUser expected all cooks to disappearReview compile orderRemember compile_pg -undo removes only the most recent cookCompile and label one strategy at a time
Mesh steals macro channelsNo macro or block blockageOverlay straps with hard macros and blocksAdd a legal blockage area and recompileStrategy owns avoidance; pattern does not
Rails appear every 20 µmMesh pitch was copied onto railsCompare with 0.576 µm rowsUse a standard-cell connection pattern on M1Rails follow rows; mesh follows pitch
No metal appears after a perfect pattern definitioncompile_pg was forgottenInspect database shapes and compile logCompile the named strategyPattern → strategy → compile
Violations remain after -ignore_drcThe switch was treated as a repaircheck_pg_drcFix the underlying geometryIgnore changes compile behaviour, not physics
Expected vias are absentPhantom failures were not inspected-show_phantom; missing-via checkResolve DRC or via-rule causeInspect phantoms after every via-rich cook
Macro pins float beneath a visible meshNo macro-connection patternConnectivity with macro pins allDefine and compile the correct pin connectionMesh-over-macro is not pin access
Rail pattern refuses before placementNo standard cells and no -rail_widthCount standard cells; read command messageSupply verified top/bottom rail widthDefault needs a longest PG pin to inspect
Generated script fails on -oututTypo copied from a syntax lineman generate_pg_scriptUse -outputArguments win this named conflict
create_net -power VDD collidesCommitted UPF already created VDDQuery existing nets and power intentSkip creation; still connectEstablish net ownership in preflight
Connectivity fails in exploration modefast_exploration skipped via fixing or via creationReport routing mode; missing-via checkUse the intended mode and recompileRead mode back before comparing runs
Trim removed the wrong family or nothing-types did not match ring, stripe, or connection shapesClassify selected shapesUndo trim and use the correct documented typeConfirm trim types with man

Hands-on mini lab — Altair-5

Altair-5 is a new design, not Nimbus-8. The core is a square 800 µm = 0.800 mm on each side, so an area of 0.64 mm² = 640,000 µm², at utilisation 0.60. Nets are VDD and VSS. Use an M5/M6 ring, width 4 µm, spacing 1 µm, offset {2 2} µm. Use an M3 vertical / M4 horizontal mesh, width 2 µm, pitch 40 µm. First-order count: 800 / 40 = 20 straps per direction.

Steps.

  1. Confirm whether power intent already created VDD/VSS. Create only if absent; connect PG nets automatically and request the summary.
  2. Set and report the routing mode.
  3. Create altair_ring on M5/M6 with width 4, spacing 1. Map it to the core at offset {2 2}; stop at the design boundary.
  4. Compile only the ring. Run DRC and connectivity checks.
  5. Create altair_mesh on M3 vertical / M4 horizontal with width 2, pitch 40. Map VDD/VSS, stop at the outermost ring.
  6. Compile only the mesh with phantom reporting. Run all three checks.
  7. Create and compile an M1 standard-cell rail pattern if rows and cells exist. If no cells exist, supply a verified -rail_width.

Expected observations. The ring sits 2 µm inside its strategy reference. The planning count is 20 straps per direction before edge effects. Compile may say Successfully compiled PG.; the DRC, connectivity, and missing-via reports may still contain findings. A mesh line crossing a macro does not prove a pin connection.

Verification checklist. VDD/VSS exist once; connection summary is credible; ring layers are M5/M6; mesh layers are M3/M4; mesh width is 2 µm and pitch 40 µm; reports were read; no conclusion rests only on return 1.

Stretch. Compile a small final change, then run compile_pg -undo. Record exactly which most recent cook disappeared and which older ring and mesh shapes remained. Recompile it, observe quiet success, and run all three checks again.

Interview preparation

BEGINNER

1. What is the difference between a PG pattern, a strategy, and compile_pg?

Pattern is reusable geometry; strategy binds that geometry to a region and real nets; compile_pg instantiates wires and vias.

A ring pattern knows layers, widths, spacing, and perhaps symbolic net positions or parameters. It does not know whether it belongs around the core, a voltage area, or a macro collection. A strategy adds exactly one legal region selector, maps symbolic positions to VDD and VSS, and may add offset, blockage, extension, and parameter values.

compile_pg is the database transition. Before it, the design contains recipes and placement intent. After it, the design contains PG shapes. That is why Chapter 9 could define a 20 µm mesh strategy to derive an MIB grid yet truthfully say no mesh had been built.

The interview-quality sequence is pattern → strategy → compile → checks. Leaving out checks turns a correct definition answer into an unsafe flow answer.

What is being tested. Whether the candidate separates reusable intent, placement intent, database mutation, and verification.
BEGINNER

2. Why is create_net not enough?

create_net creates a net object; it does not connect PG pins. connect_pg_net performs that separate connectivity step.

If committed UPF already created VDD and VSS, creating them again can collide. Establish ownership first. Whether the net was created by UPF or Tcl, macro and standard-cell PG pins still need to be connected to it.

connect_pg_net -automatic is the default path when committed power intent and PG-aware libraries are available. Automatic cannot be combined with -net or a port/pin list. Manual mode is design-specific and should use a verified list, not one invented in an interview.

Connection is still not routing. It creates the logical PG relationship; later strategies and compile create physical wires and vias.

What is being tested. Whether net existence, pin connectivity, and physical routing are three distinct facts.
BEGINNER

3. What does Successfully compiled PG. actually prove?

It proves the compile command completed; it does not prove DRC cleanliness, connectivity, or via completeness.

The compiler can create every legal shape it can and finish while DRC fixing suppresses another shape or via. Return 1 belongs to command status. It is not a count of clean nets and not a substitute for a report.

Run check_pg_drc, check_pg_connectivity, and check_pg_missing_vias. Read their findings. A command that completes with ten violations has completed; it has not passed.

This is the chapter’s quiet-success thread. A senior answer quotes the exact message and immediately names the three checks.

What is being tested. Whether a candidate confuses command completion with engineering acceptance.
BEGINNER

4. Nimbus-8 is 3,200 µm wide and mesh pitch is 20 µm. What is the planning strap count?

3,200 / 20 = 160 straps per direction as first-order planning arithmetic; boundary treatment can affect realised edge shapes.

The teaching mesh is M4 vertical and M5 horizontal, width 3 µm, spacing 3 µm, pitch 20 µm, offset 2 µm. Divide the core dimension by pitch: 3,200 µm / 20 µm = 160.

Do not confuse count with width or spacing. Do not copy the result onto M1 rails: rails follow the 0.576 µm row structure. Also do not silently change Nimbus-8 to a flow-style M6/M7/M8 interleaved mesh; that is an alternative script shape, not this teaching plan.

The caveat about edge treatment shows judgement without refusing the arithmetic.

What is being tested. Unit discipline, pitch arithmetic, and continuity with the stated teaching design.
BEGINNER

5. How do automatic and manual connect_pg_net differ?

Automatic derives PG connectivity from committed power intent and PG-aware libraries; manual uses -net with an explicit port/pin list.

Automatic is the default. It cannot be combined with -net or a port/pin list. It depends on committed power intent and library PG-pin data, so an automatic call without those prerequisites is not magic discovery.

Manual connection is useful when you intentionally name a net and the exact ports or pins. That list is design-specific. In production Tcl it should come from verified hierarchy and library naming, not a pattern guessed from memory.

In either mode request or inspect a connection summary, then later prove physical continuity after compile.

What is being tested. Prerequisites, mutual exclusion, and the difference between deriving and explicitly naming connectivity.
BEGINNER

6. Why are M1 rails not just a 20 µm mesh?

Rails align to standard-cell PG pins and 0.576 µm rows; the 20 µm M4/M5 mesh is a coarser distribution structure.

A standard-cell connection pattern uses pin and row geometry. Default rail width is the longest PG pin. Shift 0 centres the rail on the row boundary. If there are no standard cells, a width must be supplied because the default has no pin to inspect.

The mesh distributes current across M4/M5 and repeats every 20 µm. Rails collect current along M1 rows. A via and connection structure links those scales. Giving both the same pitch would leave many rows without the intended local rail.

Say “rail follows rows; mesh follows pitch”. It is compact and technically meaningful.

What is being tested. Whether the candidate understands hierarchy of PG structures rather than only layer names.
INTERMEDIATE

7. Explain the routing modes and the safe habit around them.

Modes are default, tapeout, fast_exploration, and maximize_via; set intentionally, report back, and still run checks.

tapeout aims for DRC-clean routing. fast_exploration trades completeness for speed and may skip DRC fixing of vias or disable via creation. maximize_via creates maximum PG vias. default returns to the normal mode contract.

The mode changes plan.pgroute.* application options. Do not memorise a hidden bundle of values or claim a corrupted default. Use report_pg_routing_mode after setting it.

A mode is not a check waiver. Exploration mode especially explains why a quick topology can fail later connectivity or missing-via checks.

What is being tested. Token accuracy, trade-off awareness, and read-back discipline.
INTERMEDIATE

8. What is the {name:} versus {pattern:} conflict?

set_pg_strategy syntax uses {name: pattern_name}; flow examples also use {pattern: mesh_pattern}. Use {name:} in new Tcl and confirm with man.

The conflict is inside the strategy pattern expression, not between command names. A new script in this chapter writes -pattern {{name: nimbus_mesh} {nets: {VDD VSS}}}.

When reviewing older Tcl, do not silently “correct” {pattern: ...} without knowing the build. Name both forms, use the syntax form for new code, and check man set_pg_strategy where the script runs.

This answer demonstrates how to handle contradictory examples: preserve evidence, select deliberately, and verify locally.

What is being tested. Conflict handling rather than rote syntax recall.
INTERMEDIATE

9. What does compile_pg -undo remove?

Only the most recent compile_pg cook, not every PG shape and not every earlier strategy compile.

If you compiled ring, then mesh, then macro connections, one compile_pg -undo removes the macro-connection cook. The ring and mesh remain. A second undo is not described here as a general history stack; confirm behaviour before building a recovery plan around repeated undo.

Compile one named strategy at a time. Unique reports and tags make the most recent database mutation obvious. That practice turns one-level undo from a trap into a useful local experiment.

Do not confuse this with trim_pg_mesh -undo, which belongs to a different operation.

What is being tested. Exact undo scope and disciplined compile staging.
INTERMEDIATE

10. How do extension stops and blockages differ?

Extension says where generated shapes stop; blockage says where selected PG shapes must not be created.

Extension stop tokens include first target, inner or outer ring, pad ring, design boundary, design boundary with generated pin, and a distance in micrometres. Nimbus-8’s mesh stops at the outermost ring; its ring stops at the design boundary.

A blockage describes avoided areas such as PG regions, blocks, macros, polygons, or voltage areas, optionally scoped by nets, layers, and area. Nimbus-8 blocks the teaching mesh over hard macros, then uses a macro-connection pattern to reach actual macro pins.

Stopping at a ring and avoiding a macro solve different geometric questions. Combining them intentionally is the strategy’s job.

What is being tested. Whether the candidate can reason about termination versus exclusion.
INTERMEDIATE

11. Name the three PG checks and important connectivity defaults.

DRC checks geometry, connectivity checks electrical continuity, and missing-vias checks expected adjacent orthogonal-layer intersections; connectivity defaults are macro one, block all, pad one.

check_pg_drc finds geometry-rule trouble. check_pg_connectivity traverses wires, vias, and selected pin classes. check_pg_missing_vias looks for absent vias, by default at adjacent orthogonal layers.

Connectivity defaults are macro pins one, block pins all, and pad pins one. That means a default connectivity pass does not mean every macro or pad pin was examined. Request all when closure requires it. Standard-cell pins have their own selection.

Reports can be filtered by layer, coordinate, bbox, blockage, or DRC. Filters answer narrower questions; they must not be used to manufacture a clean headline.

What is being tested. Three distinct failure classes and awareness of default pin coverage.
SCENARIO

12. A mesh crosses every SRAM, but macro pins float. What is wrong?

A visual crossing is not a macro-pin connection; define and compile a macro connection matching pin type and layers.

A mesh strap can pass over a hard macro on a layer that never touches its PG pins. If the mesh was blocked over macros, it may not even cross the usable pin area. In either case a picture of crossing metal is not electrical evidence.

Inspect the macro abstract: long pin, ring pin, or scattered pin, and the legal layers. Create a macro-connection pattern with the required type and layers, bind it to the macro region, compile it, then run connectivity with -check_macro_pins all.

Do not “fix” this by removing every macro blockage. That can consume pin-access and signal-routing resources without creating the intended connection.

What is being tested. Visual geometry versus electrical connectivity and macro-specific access.
SCENARIO

13. Why did Chapter 9 define a strategy but refuse to compile it?

It needed pitch to derive an MIB block grid; defining strategy supplied that intent, while compiling metal belonged after rooms and macros were final.

Nimbus-8’s two NPU instances share the NPU_CORE drawing. Chapter 9 aligned that multiply instantiated block (MIB) to a grid derived from the M4/M5 mesh strategy and row structure. Grid derivation needed the 20 µm pitch, not physical straps.

Compiling before shaping and macro placement would have created metal through rooms that were still changing. The next placement step could invalidate channels or remove PG in specialised flows. Waiting preserved stage ownership.

Chapter 10 inherits the exact M4/M5 geometry, compiles it after floorplan placement, then checks it. “Borrow pitch now; build straps later” is the concise answer.

What is being tested. Stage ordering, MIB grid derivation, and pattern continuity.
SCENARIO

14. A generated PG script says -outut. What do you type?

Use -output; the syntax-line spelling -outut conflicts with the argument name, so confirm with man generate_pg_script.

The known command options include input, input spreadsheet, output, run, and template. The misspelling is not a second supported feature and should not be propagated into new automation.

This is the same professional pattern as {name:} versus {pattern:}: name the conflict rather than hiding it. Here the argument name is -output, so use that and confirm on the active build.

A generated script is still code to review. It does not excuse skipped net ownership, wrong layers, or missing post-compile checks.

What is being tested. Handling a known spelling conflict and refusing to trust generated output blindly.
SCENARIO

15. When do power-switch commands belong, and how much syntax should you claim from memory?

They belong in switched-supply planning; Nimbus-8 is not switch-heavy, so know the command family and confirm exact syntax with man.

The working-knowledge family is create_power_switch_ring, create_power_switch_array, set_power_switch_placement_pattern, and connect_power_switch. Together they cover physical arrangement and connection of switch structures.

Do not dump invented flags in an interview. Explain the design need: switched domains require controlled current entry, legal placement, and connectivity consistent with power intent. Then say you would inspect library switch cells and confirm each command with man.

Nimbus-8’s teaching goal is the always-on ring, mesh, macro connections, and rails. Mentioning switches shows breadth; forcing them into this script would obscure the core flow.

What is being tested. Knowing the feature boundary and being honest about working knowledge.
SCENARIO

16. Fast exploration compiled quickly, then connectivity failed. How do you debug?

Report the routing mode, inspect phantoms and missing vias, then recompile in the intended mode and run all three checks.

fast_exploration may skip DRC fixing of vias or disable via creation. A quick compile followed by floating clusters is therefore evidence to inspect mode behaviour, not evidence that connect_pg_net alone is broken.

Read back the routing mode. Re-run or inspect compile with -show_phantom. Run missing-via checking and connectivity with the pin classes you actually need. If the topology is worth keeping, switch to the intended mode, often tapeout for this teaching flow, and recompile the affected strategy.

Then run DRC too. Adding maximum vias without understanding DRC is not a universal cure; maximize_via is another deliberate mode, not a panic button.

What is being tested. Evidence-led debugging across mode, vias, connectivity, and DRC.

Chapter close

Sign-off checklist for this planning stage

  1. VDD and VSS exist once; committed UPF ownership was respected.
  2. PG pins were connected; automatic prerequisites or manual pin lists were verified.
  3. Routing mode was intentional and reported.
  4. Ring is M7/M8, width 10 µm, spacing 2 µm, offset {3 3} µm, corner bridge true.
  5. Teaching mesh remains M4/M5, width 3 µm, spacing 3 µm, pitch 20 µm, offset 2 µm.
  6. Strategies use one legal region, explicit VDD/VSS mapping, deliberate stops and blockages.
  7. Macro connections meet actual pin geometry; mesh-over-macro was not treated as proof.
  8. M1 rails follow 0.576 µm rows, not 20 µm mesh pitch.
  9. Each structure was compiled in a debuggable stage; one-level undo scope is understood.
  10. DRC, connectivity, and missing-via reports were read after quiet success. Early analysis was not called sign-off.

Key-concept flashcards

Recipe is not metal

Pattern stores geometry. Strategy adds place and nets. compile_pg creates shapes.

Create versus connect

create_net makes an object. connect_pg_net connects PG pins. Neither routes metal.

Quiet success

Successfully compiled PG. and return 1 are command status, not three clean checks.

Nimbus ring

M7 horizontal, M8 vertical, width 10 µm, spacing 2 µm, offset {3 3} µm.

Nimbus mesh

M4 vertical, M5 horizontal, width 3 µm, pitch 20 µm, offset 2 µm.

Pitch arithmetic

3,200 / 20 = 160 straps per direction as first-order planning count.

Macro access

Mesh over a macro is not a macro-pin connection. Match pin type and layer.

Rails

M1 rails follow standard-cell pins and 0.576 µm rows, not mesh pitch.

Strategy spelling

Use {name:} in new Tcl; {pattern:} appears in examples. Confirm with man.

Undo

compile_pg -undo removes only the most recent compile cook.

Three checks

DRC, connectivity, missing vias: geometry, graph, intersections.

Early analysis

analyze_power_plan informs planning. It is not sign-off IR closure.

Compact glossary

Table 10.6 Chapter 10 glossary
TermMeaning as used in this book
BlockA physical hierarchy design. Not a logical module.
CompileInstantiation of strategy intent into PG wires and vias.
Connectivity checkElectrical traversal of selected PG nets and pin classes.
EMElectromigration risk driven by current density in metal and vias.
ExtensionA strategy rule telling generated shapes where to stop.
IRVoltage loss through resistive power-delivery paths.
Macro connectionPatterned PG access to actual long, ring, or scattered macro pins.
MeshRepeated orthogonal distribution straps across a region.
Missing viaAn expected inter-layer connection absent at a qualifying intersection.
PatternReusable PG geometry without a placement region.
PhantomA wire or via that should have been created but failed DRC fixing.
RailLocal standard-cell PG connection aligned with row and pin geometry.
RingPG conductors surrounding a core or another selected region.
StrategyPattern bound to one region, real nets, and optional offset, blockage, extension, or parameters.

Five-question self-check

Deneb-2 has a core that is a square 1,200 µm = 1.200 mm on each side, so an area of 1.44 mm² = 1,440,000 µm². Its teaching mesh pitch is 40 µm, so 1,200 / 40 = 30 straps per direction as first-order arithmetic.

  1. VDD and VSS already exist from committed power intent. Which creation step do you skip, which connection step remains, and what prerequisite does automatic connection need?
  2. A pattern and strategy both return success, but no metal appears. Which command is missing, and which three checks follow it?
  3. Deneb-2 uses 40 µm mesh pitch across 1,200 µm. Compute the planning strap count and explain why it is not the M1 rail pitch.
  4. Ring, mesh, and rails were compiled in that order. What does one compile_pg -undo remove?
  5. A compile says Successfully compiled PG.; macro pins default to one in connectivity checking. What stronger check would you request and why?

Answers.

1. Skip create_net because committed power intent already owns the net objects. Still run connect_pg_net -automatic, optionally with a connection summary. Automatic mode requires committed power intent and libraries that describe PG pins; it cannot be combined with -net or a manual port/pin list.

2. compile_pg is missing. Pattern and strategy are recipe and placement intent, not wires. After compiling the named strategy, run check_pg_drc, check_pg_connectivity, and check_pg_missing_vias. Read findings rather than only command status.

3. 1,200 / 40 = 30 straps per direction as first-order planning arithmetic. M1 rails follow standard-cell row and PG-pin geometry, which is much finer. Mesh pitch distributes power at a higher layer; it does not decide which rows receive rails.

4. One compile_pg -undo removes only the most recent cook: the rails. Ring and mesh remain. This is why staged compile order and unique report names matter.

5. Request check_pg_connectivity -check_macro_pins all for the selected nets, and inspect the error view or connectivity output. The default one does not claim every macro pin was checked. Also run DRC and missing-via checks because a connected pin does not certify geometry or every expected via.

Why Chapter 11 follows

The rooms now contain macros and a checked early power structure. Chapter 11 asks how global signals and buses travel through the same rooms and around the same blockages. That is global and topology planning, not an extra tail on compile_pg. This chapter ends with VDD and VSS. The next begins by negotiating signal corridors with the metal and channels already present.

Chapter 10 recap: connect nets, define ring and mesh, map strategy, compile in stages, connect macros and rails, run three checks, bridge to global topology planning.
Figure 10.12 Chapter 10 on one page: connect, pattern, strategy, compile, check. Quiet success is not clean PG. Chapter 11 will plan buses through the same rooms; it does not begin here. Teaching purpose: a photographable end-of-chapter flow.