Power planning
QR code to pdverse.netexplore more at pdverse.net
Innovus PNR Mentor Guide

Power Planning: Connectivity, Grid Creation, Checks and Handoff

By the end of this chapter you will be able to tie supply pins to nets and build a checked power grid. You will read back what was made, choose the check for each claim, and hand over the grid with evidence.

Why this chapter matters in a real project

A power grid is the first large piece of metal in the design. Every later stage routes around it, so a grid is expensive to move.

The danger is not a missing command. It is a grid that looks finished and is not. A ring with no source carries no current, yet every geometry check passes. A macro pin tied to the wrong supply is a real failure, and a pin-type check can stay quiet about it. Those are missed real violations, and they surface late, as an expensive engineering change order (ECO) or a failed silicon test.

The opposite error costs time. Open-pin findings before the cuts exist are expected, not failures. Chasing them as false violations wastes runs.

This chapter teaches one habit for both. For each claim, we name the object and the command that made it. Then we name the readback that shows it and the check that proves it.

Prerequisites

Learning objectives

  1. Follow supply from a source terminal to a cell pin, and name the object, command and check for each hop.
  2. Separate command acceptance, object creation, logical correctness, physical connectivity, design-rule correctness and power-integrity adequacy.
  3. Map library power and ground (PG) pins to supply nets. Explain why a blanket mapping is safe only for a single-supply ledger.
  4. Create a ring, stripes, row rails, macro connections and vias, and read back the stored geometry instead of the request.
  5. Select the check that fits each claim, and record its scope, settings, limits and result.
  6. Calculate a current, a resistance and a voltage drop by hand, and state what the toy model cannot show.
  7. Diagnose a wrong supply, a missing via and a floating grid from a symptom, a first query and a next check.
  8. Save, restore in a fresh session, and hand over the grid with its evidence and its open items.

The whole chapter fits on one page in Figure 1. Come back to it whenever you lose your place.

Power planning on one page
The supply path, the pass that builds it, and the checks that read it
Power planning on one page
Figure 1 The supply path, the steps of a power-planning pass, and the checks that judge the result.

What to notice: Each hop of the path is a different object made by a different command. The checks row shows that no single check covers every claim.

Before you start

1  The complete power path

Why this matters. A power grid is not a picture of metal. It is a chain of connections that must all hold. The links are a supply, a net, a pin, a route, a cut between layers, and a return. Each link is made by a different command and read by a different check. If you treat the chain as one thing, a break in the middle hides behind clean reports on either side.

1.1  Terms and how they are used

Each term keeps one meaning throughout the chapter. Read the table once, and come back when a later section leans on a word.

Table 1 Terms used throughout the chapter
TermMeaning hereWhy it matters
PGPower and ground. A PG net is a supply net, such as VDD or VSS. A PG pin is a cell or macro pin that must be tied to one.PG pins are tied by name, and the tie is not metal.
Supply netA net that carries one supply value. In the example, VDD at 0.8 V and VSS at 0 V.The grid must put each net only on pins that belong to it.
Supply domainA part of the design powered from one supply arrangement. A block with its own switch or voltage is a separate domain.Ownership decides which net a pin may be tied to. The example has one domain.
Source terminalA pin shape on the block boundary or on the ring that stands for the external supply. Current enters the grid there.A grid with no source has no power, however complete it looks.
RingA closed loop of power wires around the core or a block.It feeds the stripes and gives them a common edge.
StripeA long straight power wire, usually on a high metal layer, repeated across the core.Stripes carry the bulk of the current across the block.
MeshThe grid formed where stripes on one layer cross stripes or rings on another and are joined by vias.Current has many paths, so one weak spot matters less.
Followpin (row rail)A power wire on the lowest layer that follows each standard-cell row, so cells meet it.Cells draw their current from rails.
Cut layer (via layer)The layer between two metals. A cut is the small square of conductor that joins them.Two overlapping wires on different layers are not joined until a cut sits in the overlap.
EnclosureThe amount of metal that must extend past a cut on each side.Enclosure sets how big a cut array can be in a given overlap.
IR dropThe voltage lost along the grid: current times resistance.It lowers the supply that reaches a cell.
EMElectromigration: slow movement of metal atoms under current, which wears wires and cuts.It limits the current per wire or cut, by a limit the project owns.

1.2  The path in one picture

Let us follow one milliampere. Current leaves the supply and enters at a source terminal. It runs round the ring and along a stripe. It drops through a stack of cuts to the row rail and reaches the pin of a cell. It returns the same way on the other supply net. Both halves must be whole.

Every metal figure in this chapter uses one color key, shown in Figure 2. The colors are a teaching convention, not the Innovus GUI colors.

Layer key for every metal figure
Eight metals, their directions and roles, and the sheet resistance of the example
Layer key for every metal figure
Figure 2 The layer key of the worked example; directions alternate and every value is fictional.

What to notice: Odd layers run horizontal and even layers vertical. Sheet resistance falls as the layers get thicker toward the top.

Figure 3 draws the whole loop. Each box is a different object, checked by a different command.

Source to cell, and back
The supply half and the return half of the loop
Source to cell, and back
Figure 3 The supply path from a source terminal to a cell pin, and the return path on VSS (schematic: ring, stripe and rail widths labeled, not drawn to scale).

What to notice: The loop is complete only when both rows are. A continuous VDD path with a broken VSS return still fails.

1.3  Six different results

A power-planning command can succeed in six different senses. Only the last three say whether the grid works. Table 2 lists them.

Table 2 Six results a power-planning step can claim
ResultWhat it saysTypical evidenceWhat it does not say
Command acceptedThe tool parsed the command and ran it.No error at the prompt; a line in the logThat anything was made
Object createdWires, vias or pins exist in the database.A readback of counts and boxesThat they touch, or belong to the right net
Logically correctEach PG pin is tied to the intended net.Terminal-to-net readback, checkDesign -⁠powerGroundThat any metal reaches the pin
Physically connectedA path of metal and cuts joins a source to the pin on the right net.verifyConnectivity, cut readbackThat the path obeys design rules
Design-rule correctThe shapes obey spacing and width rules.verify_drc on the special routesThat the path is connected
Power-integrity adequateVoltage drop and current density stay inside project limits.Rail analysis with models and limitsAnything about geometry

Thus, a clean design-rule check (DRC) report, a clean connectivity report and a clean power-integrity report each answer a different question. None implies the next.

Where the analogy breaks - read this twice

Think of a building's water supply. The street main is the source. A ring main runs round the basement, risers climb each wall, and floor pipes feed each tap.

  • A label is not a pipe. A mapped pin is like a tap labeled "cold". The label says which pipe it should join. It does not say a pipe reaches it.
  • Pipes on different floors do not join by crossing. In the grid, two layers join only where a cut sits. Plumbing needs a fitting too, but a plan view hides the missing one.
  • Water has no return; current does. The VSS half of the loop must be as whole as the VDD half.

Figure 4 separates the logical claim from the physical one. Panel C shows a trap that looks finished.

Logical mapping against physical connection
A name map, a metal path, and a closed ring with no source
Logical mapping against physical connection
Figure 4 A logical map, a physical connection, and a closed ring that has no source and no macro connection.

What to notice: In panel C the ring is closed and has cuts at its corners, yet nothing injects current. A map says which net a pin belongs to; only metal and cuts carry current to it.

Common beginner mistake

Reading "connected" in a log message as "powered". A logical connection says which net a pin belongs to. It does not say that any metal reaches the pin. Nor does it say that the metal is on that net, or that a source feeds it.

1.4  What a power-planning pass is

A pass takes the accepted floorplan and ends at a grid whose geometry is checked. Its power integrity is either analyzed or clearly marked not run. Its steps are the sections that follow.

  1. Confirm the entry conditions (section 2, Entry readiness).
  2. Map PG pins to nets (section 3, Logical PG mapping).
  3. Decide who owns the source and where it sits (section 4, Supply entry). Create its terminals (section 4) once the ring exists (section 6, Ring creation).
  4. Choose layers and keep-outs (section 5, Layer planning).
  5. Build the ring (section 6) and the stripes (section 7, Stripe creation). Then build the rails and macro connections (section 8, Macro connections and row rails). Add the cuts last (section 9, Vias and cut arrays).
  6. Check geometry and connectivity (section 10, Checks).
  7. Estimate voltage drop by hand, and say what that cannot show (section 11, IR and EM).
  8. Refine without leaving stale geometry (section 12, Refinement), and hand over (section 15, Acceptance and handoff).
Stop here if

Stop here if you cannot say which net each supply pin of each macro belongs to. Every later step builds on that answer.

2  Entry readiness

Why this matters. A grid built on a wrong macro orientation, a missing library pin or an undecided supply is rebuilt. Checking the entry conditions costs a few read-only commands. Rebuilding costs a whole pass.

Training values and real rules

Every width, spacing, pitch, cut size and resistance in the examples is a fictional training value. It was chosen so the arithmetic is easy to follow. None is a process rule, and none is a project requirement. On a real project the numbers come from the process rule deck and from the project's power plan.

2.1  What must be true before the first change

Table 3 Entry conditions for a power-planning pass
Entry itemHow to confirm itIf it is missing
Accepted floorplanThe floorplan gate passed; checkFPlan report on hand; macros fixedReturn to Floorplanning. Do not power-plan a trial floorplan.
PG pin namesRead each library pin by name from the LEF and from the databaseStop. Ask the library owner. Never guess pin names.
Layers and directionsRead the layer list and directions from the technology fileDo not assume the layer plan is yours to invent.
Supply ledgerA table of nets, values and owners, signed by whoever owns power intentWrite the ledger first. The example's ledger is below.
Source arrangementWhere current enters: pads, bumps or block terminalsThe project decides. The example uses block terminals.
Rules for width, spacing, cutsFrom the process rules and the projectTraining values are fine for practice. Mark them as such.

2.2  The supply ledger of the worked example

The example design is a fictional single-domain block. Its core is 1000 µm square with three fixed macros, the same shape as in Floorplanning. No netlist comes with this chapter. The names in Table 4 exist only so the examples can be read.

Table 4 Supply ledger of the worked example (fictional)
NetValueOwner of the decisionLibrary pins tied to itNotes
VDD0.8 VExample ledger (fictional)standard cells: VDD; buf_ram: VDD; coef_rom: VDDMOne always-on supply
VSS0 VExample ledger (fictional)standard cells: VSS; buf_ram: VSS; coef_rom: VSSMReturn of the same supply

The two buffers are RAMs (random-access memories) of master buf_ram; the coefficient macro is a ROM (read-only memory) of master coef_rom. The coef_rom macro names its supply pins differently from the other masters. A mapping that listed only VDD and VSS would leave its two supply pins tied to nothing.

2.3  Read the entry conditions

Each command below only reads. It works on the accepted floorplan, restored in a fresh session (section 15). The core box and instance names belong to the worked example; replace them with your own.

INSPECTION - ENTRY CONDITIONS (READ ONLY)
innovus> dbGet top.name ;# top cell name
innovus> dbGet top.fPlan.coreBox ;# core box llx lly urx ury, in um
innovus> dbGet head.layers.name ;# layer names in stack order
innovus> dbGet [dbGet -p top.nets.isPwrOrGnd 1].name ;# nets flagged power or ground
# Select ONE instance. dbGet -p returns object pointers, or 0x0.
innovus> set i [dbGet -p top.insts.name u_coef] ;# pointer to u_coef
# Refuse to continue on no match or on more than one match.
innovus> if {$i eq "0x0" || [llength $i] != 1} { ;# guard the selection
    puts "ERROR: expected exactly one u_coef, got: $i"
} else {
    puts "u_coef PG pins: [dbGet $i.pgCellTerms.name]"
}

Return value, not a report. dbGet returns a Tcl list. Nothing is written to a file, and the log shows only the echoed command.

Empty answers. A result of 0x0 means nothing matched. It is not a count of zero and not a coordinate. An error means the read itself failed. Keep the three outcomes apart: a value, no match (0x0 or empty), and an error. Only the first is data. The other two stop the step until you can explain them.

Acceptance gate

Continue only if (1) the accepted floorplan restores and its core box matches. Next, (2) every supply pin name was read from the library and matches the ledger. Also (3) the layer names must match the plan, and (4) the source arrangement must be decided. If any item is open, write it down with the name of who decides it, and stop.

2.4  Missing-input decisions

Table 5 Who decides a missing input, and what you may do meanwhile
Missing inputWho decidesWhat you may do meanwhile
Supply value or net namesPower-intent ownerDraw preliminary geometry under declared assumptions. The PG plan is not accepted without the ledger.
Source arrangementProject or package ownerUse block terminals as a stated stand-in, as the worked example does.
Width, pitch, cut rulesProcess rules and projectUse training values and mark them fictional.
Layer allocationTechnology and routing ownersKeep the example allocation as a teaching convention.
Current budgetPower-estimate ownerUse an assumed average and say it is not a peak.
Analysis modelsRail-analysis ownerMark rail analysis NOT RUN. Never fill a gap with zero.

3  Logical PG mapping

Why this matters. A supply pin is tied to a net by name before any metal exists. If the name map is wrong, the metal you build later feeds the wrong supply. Every physical check can still pass. The map is cheap to read and cheap to repair, so read it first.

3.1  Purpose and what must exist

3.2  Inspect before changing

INSPECTION - PG NETS (READ ONLY)
innovus> dbGet [dbGet -p top.nets.isPwrOrGnd 1].name ;# nets treated as power or ground

Then read the library PG pin names and their nets, one validated instance at a time.

INSPECTION - PIN TIES OF TWO SAMPLE INSTANCES (READ ONLY)
innovus> foreach name {u_coef u_inv0} { ;# two sample instances
    set i [dbGet -p top.insts.name $name]
    if {$i eq "0x0" || [llength $i] != 1} {
        puts "ERROR: $name matched: $i"
        continue
    }
    puts "$name pins: [dbGet $i.pgCellTerms.name]"
    puts "$name nets: [dbGet $i.pgTermNets.name]"
}

3.3  The mapping command

STEP - TIE LIBRARY SUPPLY PINS TO NETS (MODIFIES THE DESIGN)
# Tie each library supply pin to the example supply nets, all instances.
innovus> globalNetConnect VDD -type pgpin -pin VDD -all ;# cell and RAM VDD pins
innovus> globalNetConnect VSS -type pgpin -pin VSS -all ;# cell and RAM VSS pins
innovus> globalNetConnect VDD -type pgpin -pin VDDM -all ;# ROM VDDM pins to VDD
innovus> globalNetConnect VSS -type pgpin -pin VSSM -all ;# ROM VSSM pins to VSS
Table 6 Parts of the mapping command
PartWhat it does
VDD (first word)The global net to tie to. It is positional.
-⁠type pgpinThe object kind is a PG pin, selected by name. -⁠pin is then required.
-⁠pin VDDThe pin name to match. A pattern may use *. Here the names are exact.
-⁠allApply to every instance in the design.
Why blanket -all is acceptable here

The worked example has one supply and one return, owned by one ledger. Every library pin named VDD really does belong on VDD. In a design with several supply domains, one pin name can mean different nets in different places. A design-wide rule would then tie some pins to the wrong supply. Use -⁠all only where the ledger proves the pin name has one owner throughout the scope. Otherwise the pin names, hierarchy, domain and region decide the target, and a narrower selector replaces -⁠all.

3.4  Narrower selectors, for later

Table 7 Narrower selectors of globalNetConnect
SelectorPicksUse when
-⁠sinstOne instance, by its full hierarchical nameA macro or pad needs its own tie
-⁠instBasenameInstances by leaf name, with *A family of instances shares a tie
-⁠hierInstOne hierarchical instance and what lies under itA whole module has its own supply
-⁠regionInstances inside a box llx lly urx urySupply follows area
-⁠powerDomainInstances in a named domainThe domain is defined in the power intent
-override is not a first fix

-⁠override replaces connections that earlier rules made. -⁠netlistOverride goes further and also replaces ties that came from the netlist itself. Both can silently move pins that were right. Use neither to make an error message go away.

Scope matters as much as the pin name. The blanket mapping above is shown for a single-supply ledger only. A multi-supply design needs every relevant macro PG name mapped, each with a scope that matches its owner. If a mapping looks wrong, first read the actual terminal-to-net relationship. Then narrow the selector. Only then consider an override on one named instance.

3.5  Tie cells are not PG pins

Tie-high and tie-low pins are logic constants. They are not supply pins, and mapping them is a separate step. Table 8 separates the three pin kinds.

Table 8 Three kinds of pin and how each is mapped
Pin kindWhat it isMapped byIn the example
PG pinA supply or return pin (VDD, VSS, VDDM, VSSM)globalNetConnect ... -⁠type pgpinYes, four statements
Tie-high or tie-low inputA pin held at constant 1 or 0-⁠type tiehi, -⁠type tielo, or tie cellsNone in the example
Signal pinCarries dataThe netlistNot part of this chapter

3.6  Read back, then check

READBACK - TIE NETS OF ONE INSTANCE OF EACH KIND
# One instance of each kind: tie nets after mapping.
innovus> foreach name {u_ibuf0 u_nand0 u_inv0 u_ff0 u_buf_a u_buf_b u_coef} { ;# samples
    set i [dbGet -p top.insts.name $name]
    if {$i eq "0x0" || [llength $i] != 1} {
        puts "ERROR: $name matched: $i"
        continue
    }
    puts [format "%s pins %s nets %s" $name \
        [dbGet $i.pgCellTerms.name] [dbGet $i.pgTermNets.name]]
}
CHECK - LOGICAL PG TERMINALS (TEXT REPORT, NO HTML)
innovus> checkDesign -powerGround -noHtml \
    -outfile reports/checkdesign_pg.txt ;# write the PG pin report
Common beginner mistake

Reading only one standard cell and one macro. Sample every instance kind, and for macros read every instance. In the worked example that means the two buffer RAMs and the coefficient ROM, separately.

3.7  Undo and restart

3.8  Domain ownership in one sentence per layer

Five layers of decision sit on top of each other, as Figure 5 shows.

Thus, a wrong answer at one layer is not repaired at the next. A pin tied to the wrong net is a layer 2 fault, and no amount of metal at layer 3 fixes it.

Five questions, five kinds of evidence
From power intent to analysis, and how far the worked example goes
Five questions, five kinds of evidence
Figure 5 Five layers of evidence for a power grid, with what the worked example does at each layer.

What to notice: The example covers layers 1 to 3. Layer 4 is conditional (section 13) and layer 5 is NOT RUN. A multi-domain design repeats layers 1 to 4 per domain.

4  Supply entry

Why this matters. Current has to enter the grid somewhere. In a real chip that place is a pad, a bump or a connection to a higher level. If no such place exists in the database, the grid is a closed network of metal. Every check that only looks at geometry can still pass.

4.1  Three ways current enters

Table 9 lists the three usual places where current enters.

Table 9 What carries current to the ring
ArrangementWhere the source isWhat carries current to the ringIn the example
Pad ringPower pads on the die edgePad cell routing to the ring, often by special route with pad targetsNo pad ring
Bump arrayBumps over the coreBump routing and vias to the stripesNone
Block PG terminalsPin shapes on the block boundary or on the ringThe ring itselfYes: two terminals on the left M8 ring

The example stands for a block that is one part of a larger chip. The terminals represent the connection to the supply network outside the block. A terminal is a geometric supply port. It is not by itself a complete analysis source with a voltage and a resistance. Rail analysis needs its own source data. Package behavior lies outside the example.

Figure 6 compares the example's source with a pad or bump chip and with a ring that has no source.

Where the current enters
Explicit block terminals, pads or bumps, and a ring with no source
Where the current enters
Figure 6 Three supply arrangements: the example's block terminals, a pad or bump chip (described only), and a closed ring with no source.

What to notice: Panel A is the worked example. Panel C looks complete and is unpowered; the only difference from A is the two navy terminals, each inside its own ring wire.

4.2  Create a physical source terminal

Purpose. Give each net one physical entry point on the ring. Prerequisite. The ring exists (section 6), and its stored wire boxes have been read back.

STEP - CREATE ONE SOURCE TERMINAL PER NET (MODIFIES THE DESIGN)
# One source terminal per net, 20 um tall, centered near y = 540 um.
# The x ranges are the left M8 ring wires read back in section 6
# (example values under the edge convention). Replace them with
# the stored boxes of your own run.
innovus> createPGPin VDD -net VDD -geom M8 32 530 36 550 ;# VDD pin on inner wire
innovus> createPGPin VSS -net VSS -geom M8 26 530 30 550 ;# VSS pin on outer wire
Table 10 Parts of the createPGPin command
PartMeaning
VDD / VSS (first word)The name of the pin to create
-⁠netThe net it belongs to
-⁠geom M8 x1 y1 x2 y2A pin shape on layer M8, a rectangle in µm. The x range is copied from the stored ring wire. The y range is 530 to 550. Confirm the unit and argument order with createPGPin -⁠help in your release.

4.3  createPhysicalPin: only where it fits

createPhysicalPin adds a pin shape to a top-level terminal, mainly to give a PG terminal more shapes. It creates the terminal if it does not exist, but only for a PG net.

4.4  Read back and check the source

READBACK - SOURCE TERMINALS
innovus> dbGet top.terms.name ;# terminal names, signal and PG together
# Select ONE terminal, then list the attributes it really has.
innovus> set t [dbGet -p top.terms.name VDD] ;# pointer to the VDD terminal
innovus> if {$t eq "0x0" || [llength $t] != 1} { ;# guard the selection
    puts "ERROR: VDD terminal matched: $t"
} else {
    dbGet $t.?
}
WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Contact test for a source terminal, per net (inputs invented):
  terminal box inside its own ring wire's box on x and on y  -> 1
  same terminal inside the other net's wire                  -> 0
Two boxes overlap when max(left) < min(right) and max(bottom) < min(top).

Acceptance criterion. Each terminal lies inside the wire of its own net, and not inside the other net's wire. The connectivity check (section 10) shows no open on the supply grid. The middle condition matters: a terminal on the wrong ring wire feeds the wrong supply with a perfectly clean shape.

Common beginner mistake

A source terminal drawn beside the ring instead of on it. It looks right in a picture, creates a pin, passes a name check and touches nothing. Always test containment against the stored wire box.

4.5  A floating ring

A ring with no source is a closed loop of metal. It can have cuts at every corner and every stripe attached, and still carry no current from outside.

Acceptance gate

Continue when (1) each net has at least one physical terminal. Next, (2) each terminal sits inside a wire of its own net. Also (3) the terminal and its net must be the ones in the ledger. Record the terminal boxes in the handoff (section 15).

5  Layer planning, keep-outs and macro pin access

Why this matters. Every power wire takes room from signal routing on its own layer. Through its cuts, it also takes room on the layers below. Layers, directions and keep-outs decide how much room is left, and where macro pins can still be reached. Choose them before the first wire exists, because a grid is expensive to move.

5.1  Purpose and what must exist

5.2  The example layer allocation

Table 11 is a training allocation, not a process recommendation. Every figure in the chapter uses it. It is not a table of any real technology.

Table 11 Example metal allocation (fictional; pitch, width and spacing in µm)
LayerDirectionPitchWidthSpacingSheet R (Ω/sq)Role in the example
M1horizontal0.200.060.060.30Row rails (followpins), cell PG pins
M2vertical0.200.060.060.25Local vertical links
M3horizontal0.400.080.080.20Local horizontal links
M4vertical0.400.080.080.20Lower links, macro signal pins
M5horizontal0.800.200.200.10Macro PG access bars
M6vertical0.800.200.200.08Main vertical stripes
M7horizontal1.600.400.400.04Ring top and bottom, cross-grid
M8vertical1.600.400.400.04Ring left and right, source access

The cut layers between the metals are in Table 12.

Table 12 Example cut layers (fictional; sizes, spacing and enclosure in µm)
Cut layerJoinsCut sizeCut spacingEnclosureResistance of one cut (Ω)
V12M1 to M20.060.060.0210
V23M2 to M30.060.060.0210
V34M3 to M40.080.080.028
V45M4 to M50.120.120.036
V56M5 to M60.200.200.053
V67M6 to M70.300.300.101.5
V78M7 to M80.400.400.100.8

5.3  Read the real layer data

INSPECTION - LAYER DATA IN YOUR TECHNOLOGY LEF
$ grep -n "^LAYER\|DIRECTION\|PITCH\|WIDTH\|RPERSQ" your_tech.lef  # layer rules
$ grep -n "DATABASE MICRONS" your_tech.lef  # database unit scale

5.4  Preferred direction

A layer has a preferred direction: the way its signal wires normally run. The example alternates, horizontal on odd layers and vertical on even layers. Power wires follow the same rule.

A wire against the preferred direction is legal in some flows. It costs more routing room and is worth a note in the handoff.

Figure 7 shows the stack, and the one rule that matters at every crossing.

Layer stack and crossings
Eight metals with the cut layer between each pair, and three crossings seen from above
Layer stack and crossings
Figure 7 The example layer stack with its cut layers, and three ways two wires can cross.

What to notice: Two wires on the same layer that cross are one conductor. Wires on different layers are not joined until a cut sits in the overlap, and a cut joins only the two metals it is named for. The upper metal is drawn on top, as seen from above.

5.5  Signal resource and power metal

A stripe on M6 is metal that signal routing cannot use on M6. Two different ratios describe the cost, and neither predicts routing capacity.

These ratios are dimensionless. They say how much of a corridor the power occupies. They do not say how many signal wires still fit. Spacing to signal wires, cuts through lower layers and pin positions all matter.

5.6  Keep-outs

Four different objects get called keep-outs. Mixing them up gives a wrong claim about what the grid may do.

Exceptions exist. A blockage or halo may or may not affect a power command. That depends on its options and on the modes in force (setAddStripeMode, setSrouteMode). Read the stored result. Do not assume every blockage acts the same on every power-planning command. Figure 8 sets the four side by side.

Four things that look like keep-outs
What each one stops, and what it lets through
Four things that look like keep-outs
Figure 8 A placement halo, a routing halo, a placement blockage and an M6 routing blockage, each drawn with the same stripe pair.

What to notice: Only the layer-specific routing blockage acts on metal of its layer; the upper panels add the macro. The example macros carry a 10 µm placement halo, and it does not clip stripes.

Note

After any addStripe or addRing near a macro, read back where the new wires ended. Do not assume that a halo clipped them, or that it did not.

5.7  Macro pin access

A macro has signal pins and PG pins. They are different objects on different layers, and neither position predicts the other. Figure 9 shows both example masters.

Macro pins and PG shapes
The two example masters: signal banks on M4 and PG bars on M5
Macro pins and PG shapes
Figure 9 The buffer RAM in R0 and the coefficient ROM in MY, with their signal banks and PG bars (half scale, bars drawn thicker).

What to notice: The signal bank and the PG bars share a y band but sit on different layers. Orientation moves the signal bank to the other edge; the PG bars keep their heights, layer and pin names.

INSPECTION - PINS AND LAYERS IN YOUR MACRO LEF
$ grep -n "MACRO\|PIN\|USE\|LAYER\|RECT" your_macros.lef  # signal and PG pins
INSPECTION - MACRO PLACEMENT, ORIENTATION AND STATUS
# Placement, orientation and status of each macro, one validated
# instance at a time.
innovus> foreach name {u_buf_a u_buf_b u_coef} { ;# the three macros
    set i [dbGet -p top.insts.name $name]
    if {$i eq "0x0" || [llength $i] != 1} {
        puts "ERROR: $name matched: $i"
        continue
    }
    puts [format "%s box %s orient %s status %s" $name [dbGet $i.box] \
        [dbGet $i.orient] [dbGet $i.pStatus]]
}
Acceptance gate

Continue when (1) the layer plan matches the technology data. Next, (2) every planned power wire runs in its preferred direction, or its exception is written down. Also (3) keep-outs must be named by kind. Finally, (4) every macro PG pin must be listed by layer, position and net.

6  Ring creation

Why this matters. The ring is the part of the grid you can check fastest: a few long wires with clear coordinates. It also hides the most easily missed assumption: what an offset measures. Settle that with a readback of stored coordinates before any calculation depends on it.

6.1  Purpose, prerequisites, inspect

INSPECTION - RING MODE SETTINGS
innovus> getAddRingMode -nonDefault ;# ring settings that differ from their defaults

6.2  The ring command, with the mode saved and restored

STEP - ONE CORE RING (MODIFIES THE DESIGN)
# Save the setting that is in force, so it can be put back.
innovus> set oldWco [getAddRingMode -wire_center_offset -quiet] ;# remember it
# State the offset convention explicitly for this call.
innovus> setAddRingMode -wire_center_offset false ;# offset to the wire edge
# One core ring, two nets, the training values of this chapter.
innovus> set rc [catch { ;# run addRing and keep any error message
    addRing -nets {VDD VSS} -type core_rings -follow core \
        -layer {top M7 bottom M7 left M8 right M8} \
        -width 4 -spacing 2 -offset 4 -offset_adjustment fixed
} msg]
# Put the saved value back, whether addRing worked or not.
innovus> setAddRingMode -wire_center_offset $oldWco ;# restore the saved value
innovus> if {$rc} { error "addRing failed: $msg" } ;# stop if addRing failed
Table 13 Options of the ring command
OptionWhat it doesUnits and notes
-⁠nets {VDD VSS}The nets that get a wire each. Required.The order may set which wire is inner. Read it back.
-⁠type core_ringsRings around the core, not around blockscore_rings needs -⁠follow
-⁠follow coreFollow the core boundary, not the I/O boundaryThere is no pad ring in the example
-⁠layer {top M7 bottom M7 left M8 right M8}The layer of each sideNames as in the technology LEF. M7 is horizontal and M8 vertical, so each side runs in its preferred direction.
-⁠width 4Wire widthµm, every wire of the ring
-⁠spacing 2Space between the two ring wiresµm. Read back whether it is edge to edge.
-⁠offset 4Distance from the core boundary to the ringµm. With -⁠wire_center_offset false it is measured to the wire boundary; with true, to the wire center.
-⁠offset_adjustment fixedKeep the offset as typedThe default, automatic, may shift the offset when width or spacing change

The notes below explain what the call does and what it leaves open.

6.3  What the numbers should be under the assumed convention

Let us assume the offset runs from the core edge to the near edge of the inner wire. The spacing is edge to edge. Distances run outward from the core edge. Figure 10, after the arithmetic and its notes, draws the left side.

WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Distances run outward from the core edge. offset 4, wire 4, gap 2,
core edge x = 40, die edge x = 0.
Edge convention (-wire_center_offset false), inner wire starts at the offset:
  inner 4..8    outer 8+2 = 10..14    reach 14
  left x: inner 32..36, outer 26..30   room 40-14 = 26
Center convention (true), the offset reaches the wire center, so inner
starts at 4-2 = 2:
  inner 2..6    outer 6+2 = 8..12     reach 12
  left x: inner 34..38, outer 28..32   room 40-12 = 28
Check: 26 + 14 = 40 and 28 + 12 = 40.
Ring geometry and the offset setting
The top-left corner in plan view, and a dimensioned slice across the left side
Ring geometry and the offset setting
Figure 10 The ring at the top-left corner, and the left-side slice under the edge convention (ring order illustrative).

What to notice: With -wire_center_offset false the ring reaches 14 µm from the core edge, leaving 26 µm of the 40 µm margin. The two wires and their gap occupy 10 µm; the center convention (reach 12 µm) is in the arithmetic above.

6.4  Read back the stored wires

READBACK - STORED SPECIAL WIRES PER NET
# One line per wire object, so the layer and box of a wire stay together.
innovus> foreach netname {VDD VSS} { ;# both supply nets
    set n [dbGet -p top.nets.name $netname]
    if {$n eq "0x0" || [llength $n] != 1} {
        puts "ERROR: net $netname matched: $n"
        continue
    }
    set ws [dbGet $n.sWires]
    if {$ws eq "0x0"} {
        puts "NO special wires on $netname"
        continue
    }
    foreach w $ws {
        puts "$netname [dbGet $w.layer.name] [dbGet $w.box]"
    }
}

6.5  Check the ring

CHECK - RING CONNECTIVITY AND SPECIAL-ROUTE DRC (WRITES REPORTS)
innovus> verifyConnectivity -type special -error 1000 -warning 50 \
    -report reports/ring_connectivity.rpt ;# special-net connectivity, caps stated
innovus> verify_drc -check_only special -limit 1000 \
    -report reports/ring_drc.rpt ;# design rules on special routes only

6.6  Common misuse and consequence

Table 14 Ring misuse and its consequence
MisuseConsequence
Treating -⁠offset 4 as the distance to the ring centerThe reach from the core edge and the room to the die edge are both wrong by 2 µm.
Leaving -⁠offset_adjustment at automatic while changing widthThe wire moves, and the stored boxes no longer match the plan.
Running addRing again to "fix" a ringA second ring is created on top of or beside the first.
Choosing layers against their directionThe ring may be refused, snapped or made as a wrong-way wire. Read what happened.

6.7  Undo and restart

Acceptance gate

Continue when the stored ring boxes match the expected boxes and the ring closes on both nets. Both source terminals must exist and touch their own wires (section 4). The only open findings may be the pins that still wait for stripes and connections.

7  Stripe creation

Why this matters. Stripes carry current from the ring across the core to the row rails. Their pitch decides how far current travels on thin rail metal. Their width and spacing decide what the signal router loses. Two numbers get confused here: the gap inside a pair and the repeat pitch. Mixing them gives a grid that is plausible and wrong.

7.1  Purpose, prerequisites, inspect

INSPECTION - STRIPE MODE AND EXISTING SPECIAL WIRES
innovus> getAddStripeMode -nonDefault ;# stripe settings that differ from defaults
# Select the net with -p (the net object), then walk its wires.
innovus> set n [dbGet -p top.nets.name VDD] ;# the VDD net object
innovus> if {$n eq "0x0" || [llength $n] != 1} { ;# guard the selection
    puts "ERROR: VDD matched: $n"
} else {
    puts "VDD special wire layers: [dbGet $n.sWires.layer.name]"
}

7.2  Pitch, gap and width are three numbers

A stripe set is one VDD stripe and one VSS stripe side by side. Three distances describe it, and Figure 11 below draws them at two scales.

Spacing is not pitch
One 120 µm repeat at scale, and one pair magnified
Spacing is not pitch
Figure 11 One stripe set inside its 120 µm repeat, and the pair magnified to show width, gap and envelope.

What to notice: The gap is the 2 µm between the two wires. The pitch is 120 µm from the start of one pair to the start of the next. The 3.33 % and 5 % are ratios of metal to corridor, not routing capacity.

7.3  The command

STEP - M6 STRIPES, ONE PAIR PER 120 UM (MODIFIES THE DESIGN)
# Save the via-range settings in force, then set the range the
# stripes may use to reach the layer above.
innovus> set oldBot [getAddStripeMode -stacked_via_bottom_layer -quiet] ;# save
innovus> set oldTop [getAddStripeMode -stacked_via_top_layer -quiet] ;# save
innovus> setAddStripeMode -stacked_via_bottom_layer M6 \
    -stacked_via_top_layer M7 ;# cuts from M6 up to M7 only
# One pair per 120 um repeat. VDD is the left wire of each pair.
innovus> set rc [catch { ;# run addStripe and keep any error message
    addStripe -nets {VDD VSS} -layer M6 -direction vertical \
        -width 2 -spacing 2 -set_to_set_distance 120 \
        -start_from left -start_offset 30
} msg]
# Restore the saved range whether addStripe worked or not.
innovus> setAddStripeMode -stacked_via_bottom_layer $oldBot \
    -stacked_via_top_layer $oldTop ;# put the saved range back
innovus> if {$rc} { error "addStripe failed: $msg" } ;# stop if it failed
Table 15 Options of the stripe command
OptionValue and unitWhat it does
-⁠nets {VDD VSS}net namesThe first net is the left (or bottom) wire of each set.
-⁠layer M6one layerThe metal the stripes are drawn on.
-⁠direction verticalvertical or horizontalThe run direction. M6 is vertical in the example.
-⁠width 2µmWidth of each stripe.
-⁠spacing 2µmGap between the stripes of one set.
-⁠set_to_set_distance 120µmRepeat distance between sets.
-⁠start_from leftleft, right, bottom or topThe core edge the first set is measured from.
-⁠start_offset 30µmDistance from that edge to the first stripe.

7.4  Clipping and the count

The core is 1000 µm wide, from x = 40 to x = 1040. The first VDD stripe starts 30 µm inside the left edge, at x = 70 to 72. The set pitch is 120 µm, so set k starts at x = 70 + 120k.

Figure 12 places all nine sets over the macros.

Stripe sets across the core
Nine M6 sets at x = 70 + 120k over the three example macros
Stripe sets across the core
Figure 12 The intended stripe sets across the 1000 µm core (stripe widths exaggerated so they stay visible).

What to notice: Sets k = 1 to 3 cross both buffers and sets 5 and 6 cross the ROM. The stripes pass over the M5 macro PG bars but do not touch them until cuts are added in section 8.

WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Pair envelope = 2 + 2 + 2 = 6 um. Start 30, repeat 120, span 1000.
Whole sets = floor((1000 - 30 - 6) / 120) + 1 = floor(8.03) + 1 = 9
Last VDD x = 30 + 8*120 + 40 = 1030..1032 (core x), last VSS 1034..1036,
right margin 4 um.
Sets that fit, by start offset in um: 0 -> 9, 30 -> 9, 60 -> 8, 100 -> 8
Count = floor((1000 - offset - 6) / 120) + 1 when every set must fit whole.

7.5  Read back

READBACK - M6 STRIPE RECTANGLES PER NET
# Count and list the M6 stripe rectangles of each net. A net that
# cannot be selected, or has no special wires, is reported as such.
innovus> foreach netname {VDD VSS} { ;# both supply nets
    set n [dbGet -p top.nets.name $netname]
    if {$n eq "0x0" || [llength $n] != 1} {
        puts "ERROR: net $netname matched: $n"
        continue
    }
    set ws [dbGet $n.sWires]
    if {$ws eq "0x0"} { puts "NO special wires on $netname"; continue }
    set cnt 0
    foreach w $ws {
        if {[dbGet $w.layer.name] eq "M6"} {
            incr cnt
            puts "$netname M6 [dbGet $w.box]"
        }
    }
    puts "$netname M6 stripe objects: $cnt"
}

7.6  Check, misuse, undo

CHECK - STRIPE CONNECTIVITY AND SPECIAL-ROUTE DRC
innovus> verifyConnectivity -type special -error 1000 -warning 50 \
    -report reports/stripe_connectivity.rpt ;# special-net connectivity
innovus> verify_drc -check_only special -limit 1000 \
    -report reports/stripe_drc.rpt ;# design rules on special routes
Table 16 Stripe misuse and its consequence
MisuseConsequence
Treating -⁠spacing as the pitchA grid with a 4 µm repeat and thousands of wires, or a rejected command.
Swapping the -⁠nets orderThe supplies swap sides in every pair. Expected positions no longer hold, so redo the readbacks of sections 7 and 8.
Running addStripe twiceTwo overlapping grids. Counts double or shorts appear.
Using -⁠area with a core ring and expecting the ring connectionThe automatic ring connection applies to the case without -⁠area; confirm with -⁠help in your installation.

Undo. There is no undo for a creation. Delete the stripes with editDelete -⁠type Special -⁠shape {STRIPE} -⁠nets {VDD VSS} and read the count back. Or restore the checkpoint saved after the ring step. Restoring is the clean way, because a delete that leaves a via behind looks like a new problem.

Acceptance gate

Continue when (1) nine VDD and nine VSS stripes exist on M6, judged by merged positions. Next, (2) the first VDD box starts at x = 70, and every box is 2 µm wide. Also (3) the gap inside a set must be 2 µm and the repeat 120 µm. Finally, (4) the connectivity and spacing reports must be saved. If a count differs, find the cause before you build on it.

8  Macro connections and standard-cell row rails

Why this matters. Stripes and rings do not feed a cell until something joins them to the cell's own pins. For standard cells that is the row rail on M1. For macros it is a cut between a macro PG bar and a stripe. Both are easy to get wrong in a way that still prints a clean report.

8.1  Purpose, prerequisites, inspect

INSPECTION - VIA AND SROUTE MODES, ROWS
innovus> getViaGenMode -nonDefault ;# via-generation settings changed from default
innovus> getSrouteMode -nonDefault ;# special-route settings changed from default
innovus> dbGet top.fPlan.rows.orient ;# orientation of every row object
# Distinct y levels among the row boxes, and the number of row objects.
innovus> set rb [dbGet top.fPlan.rows.box] ;# box of every row object
innovus> if {$rb eq "0x0"} { ;# stop if no rows came back
    puts "ERROR: no row boxes returned"
} else {
    set ys {}
    foreach b $rb {
        lappend ys [format %.4f [lindex $b 1]] [format %.4f [lindex $b 3]]
    }
    puts "row objects: [llength $rb]"
    puts "distinct y levels: [llength [lsort -unique -real $ys]]"
}
WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Core height 1000 um, row height 1.4 um.
Whole rows = floor(1000 / 1.4) = 714, used 999.6 um, remainder 0.4 um.
Rail levels = 714 + 1 = 715. With R0 first, levels alternate: 358 VSS, 357 VDD.
These are nominal levels, not stored segments. Cuts in rows change the
segment count, not the levels.

8.2  Row rails with sroute

STEP - M1 ROW RAILS (MODIFIES THE DESIGN, NO UNDO)
# Row rails on M1, joined to the stripes and the ring.
innovus> sroute -connect corePin -nets {VDD VSS} \
    -corePinWidth 0.32 -corePinLayer {M1} \
    -allowLayerChange 1 -layerChangeRange {M1 M8} \
    -crossoverViaLayerRange {M1 M6} \
    -targetViaLayerRange {M1 M8} ;# rails for every standard-cell row
Table 17 Options of the row-rail command
OptionValue and unitWhat it does
-⁠connect corePinkeywordMake rails for the standard-cell rows. blockPin, padPin, padRing, floatingStripe and secondaryPowerPin are the other targets.
-⁠nets {VDD VSS}net namesThe nets to route.
-⁠corePinWidth 0.32µmWidth of each row rail.
-⁠corePinLayer {M1}one layerThe layer of the cell pins to follow.
-⁠allowLayerChange 10 or 1Let the router change layers to reach a target.
-⁠layerChangeRange {M1 M8}layer pairThe layers it may use when changing.
-⁠crossoverViaLayerRange {M1 M6}layer pairThe range for cuts at crossings with other power wires.
-⁠targetViaLayerRange {M1 M8}layer pairThe layers a cut may use to reach a target.

8.3  What the rails prove, and what they do not

The rails are generated from the row geometry before placement. They exist whether or not a cell sits on the row. An unplaced instance has no valid position for its pin shapes. Do not read that as "the cell has no pins". Its connection to a rail has simply not been established. Its logical VDD and VSS assignment stays only an assignment.

Figure 13 shows shared rails, a cut row, and the difference between a placed and an unplaced cell.

Rows, rails and placed versus unplaced cells
Alternating rows share their rails; a macro cuts a row into segments
Rows, rails and placed versus unplaced cells
Figure 13 Four rows with shared M1 rails, a placed and an unplaced cell, and a row cut into two segments by a macro.

What to notice: A rail is shared by the rows above and below it. A placed cell's PG pins overlap a rail; an unplaced instance has no placed pin geometry, so the rail cannot be shown to connect it.

Do not turn the first into the second. To see the difference, place a few cells on a disposable copy of the database and rerun the connectivity check there.

8.4  Macro connections

sroute -⁠connect blockPin joins macro PG pins to power wires by its own target choice. It can extend a block pin to the nearest legal target, or to the kind you name with -⁠blockPinTarget. The worked example teaches the direct-cut strategy instead: scoped cuts, one macro at a time. The target is a known stripe, and the result can be counted.

These are two different tools. Overlap is a condition for the direct cut. It is not a condition for the special router. Figure 14 compares the special-route targets with the direct cut.

Direct cuts and special-route targets
Three sroute targets, and the one case a direct cut cannot handle
Direct cuts and special-route targets
Figure 14 Three special-route connection targets, and a macro bar that no stripe overlaps.

What to notice: A direct cut needs an overlap. A special-router connection needs a legal, permitted target within its ranges; obstructions, ranges, pin access and modes decide whether it can be made.

STEP - SCOPED CUTS FROM MACRO PG BARS TO STRIPES (MODIFIES THE DESIGN)
# Save the area_only setting in force, then restrict generation to
# the area given in each call.
innovus> set oldArea [getViaGenMode -area_only -quiet] ;# remember the setting
innovus> setViaGenMode -area_only true ;# adds stay inside the given area
# One call per macro, area = the macro box. Buffer A, buffer B, ROM.
innovus> set rc [catch { ;# one scoped call per macro box
    foreach a {{100 90.4 520 390.4} {100 689.6 520 989.6}
               {590 800.2 830 960.2}} {
        editPowerVia -add_vias 1 -nets {VDD VSS} \
            -bottom_layer M5 -top_layer M6 -area [list $a]
    }
} msg]
# Put back the saved value, not a literal, even if a call failed.
innovus> setViaGenMode -area_only $oldArea ;# restore the saved value
innovus> if {$rc} { error "editPowerVia failed: $msg" } ;# stop if a call failed
Table 18 Options of the scoped via command
OptionValue and unitWhat it does
-⁠add_vias 1switchThe action. Each call chooses exactly one of add, modify or delete.
-⁠nets {VDD VSS}net namesOnly these nets get cuts.
-⁠bottom_layer M5, -⁠top_layer M6metal layersThe pair of metals to join.
-⁠area {{590 800.2 830 960.2}}µmThe rectangle inside which cuts are made; here the ROM box, an example to adapt.
WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Stripe sets over each 420 um buffer: 3 (sets 1-3). Over the ROM: 2 (sets 5-6).
Bars per net per set: buffer 5, ROM 3.
Intended crossings per net = 2 buffers x 3 sets x 5 bars + 3 bars x 2 sets
                           = 30 + 6 = 36.
Crossings are not via instances and not cut shapes: count each separately.

8.5  Read back

READBACK - SPECIAL VIA INSTANCES PER NET
# Special via instances of each net: how many, and what one looks like.
innovus> foreach netname {VDD VSS} { ;# both supply nets
    set n [dbGet -p top.nets.name $netname]
    if {$n eq "0x0" || [llength $n] != 1} {
        puts "ERROR: net $netname matched: $n"
        continue
    }
    set vs [dbGet $n.sVias]
    if {$vs eq "0x0"} { puts "NO special vias on $netname"; continue }
    puts "$netname special via instances: [llength $vs]"
}
# List the attributes of ONE via object before you query any field.
# $v is the first via of the last net read above.
innovus> set v [lindex $vs 0] ;# first via of the last net read
innovus> dbGet $v.? ;# list the attributes of one via object
Common beginner mistake

Declaring the macros connected because a command finished without an error. Command acceptance does not tell you that a bar has a cut. Count crossings, and list the bars that have no cut.

8.6  Undo and restart

Acceptance gate

Continue when (1) rails exist for both nets. Next, (2) the distinct y levels match the nominal arithmetic, with segments and rail rectangles counted apart. Also (3) every macro PG bar needs at least one cut of the right net. Then (4) the macro crossing count must be 36 per net. Finally, (5) you have written down that unplaced cells are not proven connected.

9  Vias and cut arrays

Why this matters. Metal on two layers is not one conductor until a cut joins them. Most grid failures that survive a clean-looking review are missing, wrong-net or too-few cuts. This section is about creating cuts on purpose, counting them, and knowing what a cut array can and cannot be.

9.1  Purpose and prerequisites

Figure 15 shows the three outcomes at one stripe-over-bar crossing.

Three crossings of a stripe and a macro bar
A correct cut, a missing cut, and a cut between two different nets
Three crossings of a stripe and a macro bar
Figure 15 The same M6 stripe over an M5 macro bar: with a cut on one net, with no cut, and with a cut joining VDD to VSS.

What to notice: The overlap looks identical in A and B, but only A conducts. C has a cut and is worse than B: a cut between VDD and VSS is a short, even if each wire passes spacing checks.

9.2  What a cut array is, and the arithmetic bound

An array is a rectangular group of cuts placed inside one overlap. How many fit depends on the overlap size, the cut size, the spacing between cuts and the enclosure of metal around them. Per axis, the number of cuts is at most:

floor((span - 2 x enclosure + spacing) / (cut + spacing)), with all values in µm.

Figure 16 applies the bound to the V56 crossing.

Cut arrays and the arithmetic bound
The upper bound, a smaller array, and an empty overlap
Cut arrays and the arithmetic bound
Figure 16 Cut arrays in a 2 × 2 µm V56 overlap, with the bound for three cut layers (fictional training rules).

What to notice: 25 is a ceiling from arithmetic; a tool places what its own rules and obstructions allow. Zero cuts is an open connection, not a smaller array.

WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Per axis, cuts = floor((span - 2*enclosure + spacing) / (cut + spacing)).
V56 (2 x 2 um, cut .2, space .2, encl .05): floor(2.1/.4) = 5 x 5 = 25
V67 (2 x 4 um, cut .3, space .3, encl .1): x: floor(2.1/.6) = 3,
    y: floor(4.1/.6) = 6, so 3 x 6 = 18
V78 (4 x 4 um, cut .4, space .4, encl .1): floor(4.2/.8) = 5 x 5 = 25
Ideal parallel resistance (single cut 3, 1.5, 0.8 ohm): 3/25 = 0.12,
    1.5/18 = 0.0833, 0.8/25 = 0.032 ohm.
Six V56 cuts would need 6 x 0.2 + 5 x 0.2 = 2.2 um plus 0.1 um of
enclosure: more than the 2 um overlap.
A span too small for one cut gives 0 cuts. This is an upper bound, not a
tool result.

9.3  Creating, modifying, deleting

editPowerVia takes exactly one action per call. Table 19 lists its parts.

Table 19 Actions and scope options of editPowerVia
OptionValue and unitWhat it does
-⁠add_vias 1switchAdd cuts in overlaps.
-⁠modify_vias 1switchChange existing cuts, for example their layer pair.
-⁠delete_vias 1switchRemove cuts.
-⁠nets {VDD VSS}net namesRestrict to these nets.
-⁠bottom_layer, -⁠top_layermetal layersThe metal pair the action covers.
-⁠area {{590 800.2 830 960.2}}µmRestrict to a rectangle; the ROM box is an example to adapt.
READBACK - VIA MODE AND VIA INSTANCES OF ONE NET
innovus> getViaGenMode -nonDefault ;# the via mode in force
innovus> set n [dbGet -p top.nets.name VDD] ;# the VDD net object
innovus> if {$n eq "0x0" || [llength $n] != 1} { ;# guard, then count vias
    puts "ERROR: VDD matched: $n"
} else {
    set vs [dbGet $n.sVias]
    if {$vs eq "0x0"} { puts "NO special vias on VDD" } \
    else { puts "VDD via instances: [llength $vs]" }
}

9.4  Missing and rejected cuts

A cut can be absent for five different reasons, and each has a different cure. Table 20 lists them.

Table 20 Five reasons a cut is missing
ReasonSignCure
The layer range did not cover the pairNo cuts at that pair, others presentWiden the range of the creation command, or add with editPowerVia.
The overlap is smaller than one cut plus enclosureA bound of zero in the formulaWiden the wire or the macro bar.
An obstruction or another net is in the wayCuts at some crossings and not at othersRead the obstruction, then decide.
The two wires are on different netsA cut would short themDo not add. Fix the net first.
The command ran with the wrong areaCuts exist elsewhereRepeat inside the right area.
Common beginner mistake

Treating a cut-less overlap as "connected because they overlap". In plan view two layers always look joined. In the database they are separate conductors until a cut exists.

9.5  Undo and restart

Acceptance gate

Continue when (1) every intended power crossing has a via instance of its own net, and (2) no cut joins different nets. Also (3) the per-net via-instance counts must be written down and labeled as instances. Finally, (4) you have named the crossings you expected to be empty.

10  Checks: what each one proves

Why this matters. A check can only report what it looks at. Choosing the right check for a failure, and writing down its scope, is half of the job. The other half is reading a quiet report as "nothing found inside this scope", never as "nothing wrong".

10.1  Purpose and prerequisites

10.2  Four checker families, five reports

CHECK - THE MANDATORY GRID CHECKS (WRITES REPORTS)
innovus> get_verify_drc_mode ;# record the DRC settings in force
# 1. Connectivity of special nets: opens, loops, unconnected pins.
innovus> verifyConnectivity -type special -error 1000 -warning 50 \
    -report reports/final_connectivity.rpt ;# special-net connectivity
# 2. Design rules on special routes only.
innovus> verify_drc -check_only special -limit 1000 \
    -report reports/final_drc.rpt ;# spacing and width of special routes
# 3. Missing cuts at orthogonal crossings on adjacent layers.
innovus> verifyPowerVia -report reports/final_vias.rpt ;# missing power vias
# 3b. The same, now including wires over macro pin shapes.
innovus> verifyPowerVia -checkWirePinOverlap -layerRange {M5 M6} \
    -report reports/final_vias_macro.rpt ;# also wire-over-pin crossings
# 4. Logical PG terminals: wrong type, floating or on signal nets.
innovus> checkDesign -powerGround -noHtml \
    -outfile reports/final_checkdesign_pg.txt ;# PG pin ties
Table 21 What each grid check looks at
CheckLooks atOption notes
verifyConnectivity -⁠type specialIslands, opens and unconnected pins of special wires-⁠error and -⁠warning cap the markers; reaching a cap means incomplete coverage. Add -⁠allPGPinPort to verify all PG port connections, and justify the choice either way.
verify_drc -⁠check_only specialSpacing and width of special wiresPlaced instances only. -⁠limit caps the count; a run that reached it is incomplete. Settings come from set_verify_drc_mode and live in the design.
verifyPowerViaCuts missing at orthogonal crossings on adjacent layersDie area by default. Wire over pin shapes only with -⁠checkWirePinOverlap. -⁠layerRange {bottom top} adds stacked-via checks.
checkDesign -⁠powerGroundPower-to-ground, ground-to-power, floating and non-PG connections of PG terminalsIt does not know your intended voltages or domains. With -⁠noHtml, use -⁠outfile; -⁠outdir is not valid with it.

Figure 17 maps each failure to the checks that can see it.

Which check can see which failure
Eight failure classes against five checks
Which check can see which failure
Figure 17 Eight failure classes against the scope of five checks, marked "sees", "may" or "no"; rail analysis is NOT RUN in the example.

What to notice: No single check covers every row. The IR-drop row has only rail analysis, which did not run, so that claim stays open.

10.3  Reading the six outcomes

The six outcomes of section 1 (The complete power path) map to checks, as Table 22 shows.

Table 22 Evidence for each of the six outcomes
OutcomeEvidence
Command acceptanceThe log shows no error.
Object creationA readback shows the objects.
Logical correctnesscheckDesign -⁠powerGround and the pin-net readback.
Physical connectivityverifyConnectivity and verifyPowerVia, plus placed-cell PG pins on rails.
DRC correctnessverify_drc -⁠check_only special.
Power-integrity adequacyRail analysis. It is not run in the example, so this outcome is open.

10.4  Misuse and clean-looking reports

Table 23 Check misuse and its consequence
MisuseConsequence
Reading "no errors" as "connected"Unplaced cells have no pin geometry for the check to test.
Running verify_drc before the cells are placed and calling the design DRC cleanIt reports on placed instances, so unplaced cells are outside it.
Setting -⁠error so low that the run stops earlyThe report is a truncated sample.
Comparing reports from before and after a change without the same optionsDifferent scope, different counts.
Skipping -⁠checkWirePinOverlap for macrosMacro PG bars are wire-over-pin shapes and are excluded by default.
Acceptance gate

Continue when (1) every mandatory check ran to completion in its declared scope, with no run stopped at its cap. Also (2) each failure class needs a named check that could have seen it. Next, (3) every real violation was repaired and rechecked, or carries an approved waiver or a permitted temporary condition. A waiver states scope, owner, reason and approval; a temporary condition names its closing step. Finally, (4) you can say what each report did not cover. A finding that is explained is not a finding that is accepted. A check that did not run is NOT RUN, and it blocks the claim it would have supported.

11  IR and EM: hand calculations

Why this matters. IR drop and electromigration cannot be proven by looking at geometry. A short hand calculation tells you whether an analysis number is plausible. It also shows what an analysis needs as input. It does not replace one.

11.1  Purpose and prerequisites

11.2  Units first

Table 24 Units of the hand calculation
QuantityUnitCheck
PowermW120 mW
VoltageV0.8 V
CurrentmAmW / V = mA, so 120 / 0.8 = 150 mA
ResistanceΩSheet resistance in Ω per square, times squares
DropmVmA × Ω = mV
Current densitymA per µm of widthCurrent / width

11.3  The toy model

Let us consider one strip, one load and an ideal return. The notes come first; Figure 18 then draws the circuit and the arithmetic.

A fictional IR-drop hand calculation
One source, one strip, one load and an ideal return
A fictional IR-drop hand calculation
Figure 18 The toy circuit: a 0.8 V source, a 1 Ω strip and a 10 mA load, with the arithmetic (illustrative, not tool output).

What to notice: The 120 mW budget gives an average of 150 mA. The toy carries only 10 mA of it, so 10 mV is a toy result, not a statement about any chip.

11.4  A current-density check

WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Current per width = 10 mA / 4 um = 2.5 mA/um.
Against the FICTIONAL limit 3.0 mA/um: 2.5 / 3.0 = 83.3 %.

11.5  What an analysis would need

None of them exists in the worked example. When they are absent, the honest status is NOT RUN. That is neither zero drop nor a pass.

Stop here if

Stop if someone writes a drop number from the toy into a handoff as a result for the chip. A hand calculation sizes the problem. It is not a signoff claim.

Acceptance gate

Continue when (1) every number has a unit that cancels correctly, and (2) average and peak are not mixed. Also (3) the toy results must be labeled as toy results. Finally, (4) the missing analysis inputs must be listed in the handoff.

12  Refinement without stale or duplicate geometry

Why this matters. Sooner or later the grid has to change. A pitch is too coarse, a stripe lands on the wrong side, or a macro needs another cut. The risk is not the change. It is the leftover. Think of a stripe still under the new one, a cut still joining old geometry, or a count that quietly doubled.

12.1  Purpose and rule

12.2  Which stage owns which number

Table 25 The stage that owns each grid parameter
ParameterUsed first byRestore to the checkpoint saved before
Ring width, spacing, offset, layersaddRingthe ring step
Stripe layer, width, spacing, pitch, startaddStripethe stripe step
Row rail width and layerssroutethe rail step
Macro crossing area and layer paireditPowerViathe macro-cut step
Logical PG mappingglobalNetConnectthe mapping step

Everything downstream of the changed step is stale. Checkpoints saved after it are discarded, and every later step is run again in order. Name each checkpoint after the step it precedes, so Table 25 can be followed without guessing.

12.3  A pitch sweep before you touch the tool

Hand arithmetic tells you what a change costs before you pay for a run.

WORKED ARITHMETIC - ILLUSTRATIVE INPUTS, NOT TOOL OUTPUT
Sets = floor((1000 - 30 - 6) / pitch) + 1. Metal = 4/pitch. Envelope = 6/pitch.
pitch 120:  9 sets, metal 3.33 %, envelope  5.00 %
pitch  90: 11 sets, metal 4.44 %, envelope  6.67 %
pitch  60: 17 sets, metal 6.67 %, envelope 10.00 %

12.4  Refinement methods

Table 26 How to refine each kind of change
SituationMethodWhy
A parameter was wrong everywhereRestore, rerunNo stale geometry.
One small area needs more metalA scoped addStripe with -⁠area, then a readbackSmaller blast radius. Read the result, because the options interact with the ring connection.
One cut set is wrong in one macroScoped editPowerVia, delete then add, same areaThe area bounds the change.
A stripe must moveRestore, rerunA move by delete and add leaves cuts at the old place.

Treat the scoped methods as exceptions. Write down the area, the command and the readback you will compare.

12.5  Readback after a refinement

READBACK - AFTER A REFINEMENT
# Repeat the readbacks of sections 7 and 8 unchanged: the M6 stripe
# boxes per net and the via instances per net. Then print the modes
# that were in force for the rerun.
innovus> getAddStripeMode -nonDefault ;# stripe modes used by the rerun
innovus> getViaGenMode -nonDefault ;# via modes used by the rerun
Acceptance gate

Continue when (1) the changed value is written in your plan, and (2) every later stage was rerun from a clean restore. Also (3) counts must match the new arithmetic, and (4) the check reports must be regenerated, not carried over.

13  Conditional: secondary supplies, well bias and always-on domains

Why this matters. The method of this chapter works on one supply at a time. Extra supplies reuse it, but each adds an owner, a source, a set of pins and a set of crossings. The failure is not a missing command. It is two supplies sharing a name, or a pin tied to the wrong one of them.

Note

This section is conditional. The worked example has one supply and one return, with the macro pins VDDM and VSSM tied to them. The commands below are not part of its sequence. The section tells you what changes if your design is not like that.

13.1  When this section applies

Table 27 Design features that add supplies
Design featureWhat it adds
A macro with its own supply, kept apart from the core supplyA separate net, its own source, its own stripes or a local ring
Substrate or well bias suppliesPG pins on tap or bias cells that must reach their own net
An always-on region next to a switched regionTwo supply nets for the same library pin name, split by domain
Power switchesA switched net between a source net and the cells it feeds

13.2  What stays the same

13.3  What changes

ILLUSTRATIVE - SHAPE OF A SCOPED MAPPING (NOT RUN, NOT IN THE EXAMPLE)
# Shape of a scoped mapping for a separate macro supply.
# Net names and the instance are invented. Confirm every option first.
innovus> globalNetConnect VDDM -type pgpin -pin VDDM -sinst u_coef \
    -override ;# tie this ROM's VDDM to its own net
innovus> globalNetConnect VSS -type pgpin -pin VSSM -sinst u_coef \
    -override ;# tie this ROM's VSSM to VSS
# Shape of a secondary power pin connection. VDD_AON is invented.
# The domain must exist. Both options are required together.
innovus> sroute -connect {secondaryPowerPin} \
    -secondaryPinNet {VDD_AON} ;# route secondary power pins
Common beginner mistake

Giving two domains the same net name because the library pin has the same name. The database accepts it, and every check reads one net. Two supplies are now shorted by name.

13.4  Handoff items for a conditional supply

14  Conditional: Flash PG with a PSDL file

Why this matters. A traditional grid is built by commands, one after another, each with its own offsets. A Flash PG grid is described once in a text file and built by one command. The description is portable. However, a description that parses is not a grid that exists. A grid that exists is not a grid that is connected.

Note

This section is conditional. Whether route_pg is available depends on the release and the license. Confirm it in the installed tool before you plan around it. It is an alternative lane, never an addition to the traditional lane.

14.1  Purpose, prerequisites, inspect

PSDL is the PG Structure Description Language. It is a text format, not Tcl, and its statements are in braces. A pattern is a reusable template, for example a stripe pair. A region is the area where patterns are placed.

Figure 19 sets the two lanes side by side.

Two ways to build the grid
The traditional lane and the conditional Flash PG lane, from the same post-mapping save
Two ways to build the grid
Figure 19 The traditional lane and the Flash PG lane, each ending in the same checks.

What to notice: The two grids are never mixed in one database. The syntax-only check draws no metal. Both lanes end in the same set of checks, with the same options and caps.

14.2  The PSDL file

The example file below describes the same M6 stripe pairs as section 7.

FILE - psdl/grid.psdl (EXAMPLE; PSDL IS NOT TCL)
{PATTERN p_m6_pg
  {TYPE STRIPE}
  {DIRECTION VERTICAL}
  {WIDTH 2 2}
  {SPACING 2}
}
{REGION
  {COREAREA}
  {LAYER M6
    {METAL m6_pg p_m6_pg
      {NET VDD VSS}
      {OFFSET 30 * FROM REGION TO LOWEDGE}
      {STEPDISTANCE 120 * {LOWEDGETOLOWEDGE}}
    }
  }
}
Table 28 Parts of the PSDL file
PartMeaningUnit
TYPE STRIPE, DIRECTION VERTICALA stripe pattern running verticallynone
WIDTH 2 2One width per net of the pairµm
SPACING 2The gap between the two wires of the pair, edge to edgeµm
{REGION {COREAREA}}The region selector is braced. The region is the core.none
{LAYER M6 {METAL ...}}The metal the stripes sit on, and the METAL statement inside itnone
{NET VDD VSS}Net order inside the pair, its own braced substatementnone
{OFFSET 30 * FROM REGION TO LOWEDGE}Braced substatement. The first wire's low edge is 30 µm from the region edge. * is the coordinate that does not apply.µm
{STEPDISTANCE 120 * {LOWEDGETOLOWEDGE}}Braced substatement. Repeat distance, low edge to low edge. The LOWEDGETOLOWEDGE selector is itself in braces.µm

14.3  Step 1: syntax only

CHECK - PSDL SYNTAX ONLY (NO METAL IS DRAWN)
innovus> route_pg -psdl_file psdl/grid.psdl -check_psdl_only ;# parse and sanity-check

14.4  Step 2: build

STEP - BUILD THE STRIPES FROM PSDL (MODIFIES THE DESIGN)
innovus> route_pg -fast -psdl_file psdl/grid.psdl \
    -write_psdl work/grid_resolved.psdl ;# build, then write resolved values
Table 29 Options of route_pg used here
OptionWhat it does
-⁠psdl_fileThe description to build from.
-⁠fastFast PG mode: an internal DRC check but no full fix pass. Without it, the complete mode runs.
-⁠write_psdlWrites the resolved description, so you can see which values were used.

14.5  What a comparison with the traditional lane can show

The traditional stripes of section 7 are made after the ring and the source terminals exist. The Flash PG lane starts from the post-mapping checkpoint, which has neither. The stripe ends, their cuts to the ring and their power path therefore differ. The stored boxes need not match. Choose one of two honest comparisons.

14.6  Misuse and undo

Table 30 Flash PG misuse and its consequence
MisuseConsequence
Treating the syntax pass as a built gridNo wires, an empty report, a wrong sense of progress.
Running route_pg on top of a traditional gridTwo grids in one database.
Trusting a quiet fast-mode result as DRC cleanThe fast mode skips the full fix pass.

Undo. There is no undo. Restore the post-mapping checkpoint. Or delete the special wires by net and shape, then restore for certainty.

Acceptance gate

Continue when (1) route_pg is available in the installed tool, and (2) the syntax check passed. Also (3) the comparison you chose, pattern only or full grid with equal context, must be made and recorded. Finally, (4) the same checks must run with the same options and caps.

15  Acceptance, restore proof and handoff

Why this matters. A power grid that only its builder understands is not finished. The handoff says what exists, what supports each claim, and what is still open. The next person should be able to restore it, compare it and continue without asking you. Acceptance is the decision that lets a claim stand, and it needs more than a report that exists.

15.1  Purpose and prerequisites

15.2  Acceptance rules

Explaining a finding does not accept it. Each mandatory check ends in exactly one of the states in Table 31.

Table 31 States of the evidence and what each allows
State of the evidenceWhat it allows
Ran to completion in its declared scope, below its cap, nothing reportedThe claim it covers, within that scope
A real violation was foundRepair and recheck, or an approved waiver, or a permitted temporary condition. Nothing else.
WaiverWritten scope, owner, reason and approval. Without all four it is not a waiver.
Temporary conditionAllowed only with the named step that closes it, such as "open pins until the macro cuts of section 8"
Truncated, failed or interruptedBlocks the claim. A reached cap is incomplete coverage, not a threshold you passed.
NOT RUN, or unknownBlocks the claim it would have supported. It is neither zero nor a pass.

Only a completed clean check supports an unqualified clean result. An approved waiver or permitted temporary condition may allow the stated, scoped handoff. It does not turn the check into a clean result. A check that ran in a limited scope differs from one that was NOT RUN.

15.3  Saves and what each contains

STEP - SAVE THE GRID IN FOUR FORMS (WRITES FILES)
# One new run directory per save. Refuse to reuse one, so no output
# of any save format can overwrite an earlier one.
innovus> set run checkpoints/grid_run1 ;# new run directory name
innovus> if {[file exists $run]} { error "already exists: $run" } ;# refuse reuse
innovus> file mkdir $run ;# create the directory
innovus> if {![file writable $run]} { error "not writable: $run" } ;# check access
innovus> saveDesign $run/grid.enc ;# full database: .enc and its data directory
innovus> saveFPlan $run/grid ;# floorplan and power route: .fp and .fp.spr
innovus> saveSpecialRoute $run/grid.spr ;# special routing on its own
# DEF with rows, pins, special-net connections and special routing.
innovus> defOutBySection -rows -pins -specialNets -specialNetRouting \
    $run/grid_special.def ;# special-net DEF with routing
Table 32 What each saved file carries
FileCarriesDoes not carry
.enc and .enc.datThe whole databaseAnything outside it
.fp and .fp.sprThe floorplan, and the power route in the .spr partReports
.spr from saveSpecialRouteSpecial routingLogical mapping rules
.def with -⁠specialNetsThe connections of the special netsTheir routing, unless -⁠specialNetRouting is also given
.def with -⁠specialNetRoutingThe routing of the special netsSignal routing, if not asked

15.4  Fresh restore proof

The proof has three parts. They are a dump of the grid before, the same dump after a fresh restore, and a comparison that can fail.

Run it in the saved session first. Then run it in a FRESH session after restoreDesign, with the file name changed to reports/grid_after.dump. Fill the two field lists before the first run. Keep the three parts below in one file. You can paste it at the prompt, or save it and source it.

FILE - grid_dump.tcl, PART 1 OF 3 (EXAMPLE TEMPLATE, NOT RUN)
## Template. Run in the saved session, then in a FRESH session after
## restoreDesign, with a different file name. Fill the field lists first.
set dumpfile reports/grid_before.dump
## List the attributes with: dbGet $v.? and dbGet $t.?
## Include identity and geometry fields, not just any field.
set viaFields {}
set termFields {}
if {![llength $viaFields] || ![llength $termFields]} {
    error "fill viaFields and termFields first"
}
proc need {label val} {
    if {$val eq "" || $val eq "0x0"} { error "empty or no match: $label" }
    return $val
}
proc num {label v} {
    if {![string is double -strict $v]} { error "not a number: $label $v" }
    return [format %.4f $v]
}
## Write to a temporary file. Rename only after every check passed.
file delete -force $dumpfile.tmp $dumpfile $dumpfile.ok
set out [open $dumpfile.tmp w]
set rows {}

The second part walks the special wires and vias of both nets, then the three macros. Each wire box is checked for four numbers in order.

FILE - grid_dump.tcl, PART 2 OF 3 (EXAMPLE TEMPLATE, NOT RUN)
foreach netname {VDD VSS} {
    set n [need "net $netname" [dbGet -p top.nets.name $netname]]
    if {[llength $n] != 1} { error "net $netname ambiguous: $n" }
    foreach w [need "wires $netname" [dbGet $n.sWires]] {
        set bx [need "box $w" [dbGet $w.box]]
        if {[llength $bx] == 1} { set bx [lindex $bx 0] }
        if {[llength $bx] != 4} { error "box of $w: $bx" }
        set b {}
        foreach c $bx { lappend b [num "box $w" $c] }
        if {[lindex $b 0] > [lindex $b 2] || [lindex $b 1] > [lindex $b 3]} {
            error "corners out of order: $w $b"
        }
        lappend rows "W $netname [need "layer $w" [dbGet $w.layer.name]] $b"
    }
    foreach v [need "vias $netname" [dbGet $n.sVias]] {
        set f {}
        foreach a $viaFields { lappend f [need "$a of $v" [dbGet $v.$a]] }
        lappend rows "V $netname $f"
    }
}
foreach name {u_buf_a u_buf_b u_coef} {
    set i [need "inst $name" [dbGet -p top.insts.name $name]]
    if {[llength $i] != 1} { error "inst $name ambiguous: $i" }
    lappend rows "I $name [need orient [dbGet $i.orient]]\
        [need pStatus [dbGet $i.pStatus]]\
        [need pgCellTerms [dbGet $i.pgCellTerms.name]]\
        [need pgTermNets [dbGet $i.pgTermNets.name]]"
}

The third part adds the terminals and the modes. Then it writes the sorted rows and the completion marker.

FILE - grid_dump.tcl, PART 3 OF 3 (EXAMPLE TEMPLATE, NOT RUN)
foreach tn {VDD VSS} {
    set t [need "term $tn" [dbGet -p top.terms.name $tn]]
    if {[llength $t] != 1} { error "term $tn ambiguous: $t" }
    set f {}
    foreach a $termFields { lappend f [need "$a of $t" [dbGet $t.$a]] }
    lappend rows "T $tn $f"
}
lappend rows "M ring [getAddRingMode -nonDefault -quiet]"
lappend rows "M stripe [getAddStripeMode -nonDefault -quiet]"
lappend rows "M via [getViaGenMode -nonDefault -quiet]"
lappend rows "M sroute [getSrouteMode -nonDefault -quiet]"
foreach r [lsort $rows] { puts $out $r }
puts $out "END [llength $rows]"
close $out
## Completion marker: only a finished, checked dump gets one.
file rename -force $dumpfile.tmp $dumpfile
close [open $dumpfile.ok w]

The compare step is a small shell file. Run it as a script, never pasted at the prompt: its exit would close an interactive shell.

FILE - compare_dumps.sh (EXAMPLE)
# Both dumps must be fresh, finished and marked.
for f in reports/grid_before.dump reports/grid_after.dump; do
    test -s "$f" && test -e "$f.ok" || { echo "NOT FINISHED: $f"; exit 2; }
    tail -n 1 "$f" | grep -q '^END ' || { echo "NO END LINE: $f"; exit 2; }
done
# diff exits 0 when equal, 1 when different, above 1 on failure.
diff reports/grid_before.dump reports/grid_after.dump
rc=$?
if [ $rc -eq 0 ]; then echo "EQUAL (recorded subset only)"
elif [ $rc -eq 1 ]; then echo "DIFFERENT"
else echo "COMPARISON FAILED ($rc)"; fi
COMPARE THE TWO DUMPS
$ sh compare_dumps.sh  # compare the dumps and report the result

Figure 20 lists what the proof must compare, and how each kind can differ.

What a restore proof must compare
Five steps, and six kinds of state that each fail in their own way
What a restore proof must compare
Figure 20 The restore proof as five steps, and the six kinds of state it must compare.

What to notice: Each kind of state has its own readback and its own way to fail. Equal counts, or two matching error messages, prove nothing.

15.5  Special-route transfer

When the grid goes to another database, the transfer is its own source of mismatches. Table 33 lists the usual ones.

Table 33 What can go wrong in a special-route transfer
StepWhat can go wrong
saveSpecialRoute, then loadSpecialRoute into a database with other instancesWires attach to nothing, or to the wrong thing
defOutBySection, then defInRows or pins missing from the file. Special-net connections without routing, when -⁠specialNetRouting was left out
Logical mapping not saved with the geometryWires exist and pins are not tied

After a transfer, repeat every readback: the sorted dump, the pin-net mapping and the checks of section 10. Treat a mismatch as a transfer defect until it is proven otherwise.

15.6  Settings and unresolved items

Write down, with the files:

HANDOFF NOTE - EXAMPLE TEMPLATE (FILL IN FROM YOUR OWN EVIDENCE)
Supply ownership:   VDD 0.8 V, VSS 0 V (example), owner: ____
Source terminals:   VDD M8 x __ __ y __ __ ; VSS M8 x __ __ y __ __
Macro PG mapping:   buf_ram VDD VSS ; coef_rom VDDM->VDD VSSM->VSS
Generated:          9+9 M6 stripes, ring M7/M8, followpins M1,
                    via instances __ (instances, not cut shapes)
Check scope:        special connectivity, special DRC, power via,
                    logical PG; caps reached: yes / no
Waivers:            ____ (scope, owner, reason, approval)
Temporary items:    ____ (closing step: ____)
Settings:           see the mode printouts saved with the dumps
IR / EM:            NOT RUN. Missing: power-grid library, current data, sources
Unresolved:         1. ____ (decides: ____, blocks: ____)
Fresh restore:      diff exit status __ ; halos compared by: ____

15.7  The handoff table

Figure 21 pairs each handoff claim with its evidence and its limit.

What the handoff claims and what supports it
Seven claims, the file behind each, and what each does not prove
What the handoff claims and what supports it
Figure 21 Each handoff claim with its evidence and the limit of that evidence.

What to notice: Each claim is paired with its evidence and its limit. IR and EM are NOT RUN in the example; a geometry-stage handoff may say so and still be useful, but it cannot claim signoff.

Stop here if

Stop if the handoff says "power grid clean" or "IR OK". Say what was checked, in what scope, with what caps, and what was not.

Acceptance gate

Accept when (1) every mandatory check completed in its declared scope, below its cap. Also (2) every real violation was repaired and rechecked. If not, it carries an approved waiver or a temporary condition with its closing step. Next, (3) the fresh restore matches by a comparison whose exit status you read. Halos are compared too. Then (4) the unresolved list is written. Finally, (5) IR and EM are stated as NOT RUN in a geometry-stage handoff, or their results are attached with their inputs.

16  Common mistakes and how to catch them

Table 34 collects the beginner mistakes this chapter warned about. It names the likely cause and the fix for each. The troubleshooting matrix that follows starts from a symptom instead.

Table 34 Common mistakes and how to catch them
SymptomLikely causeFix
A log says "connected", and the pin still has no metalA logical connection was read as "powered"Read the pin-net readback for the net, and verifyConnectivity for the metal.
Pins of one domain end up on another domain's supplyA blanket -⁠all mapping in a design with several suppliesScope each statement by instance, hierarchy, region or domain, and read each scope back.
Clean geometry checks, but rail analysis reports no sourceA source terminal sits beside the ring instead of on itTest containment of the terminal box against the stored ring wire box of the same net.
Thousands of stripes, or a rejected stripe command-⁠spacing was read as the pitchPut the repeat in -⁠set_to_set_distance and read back the merged x positions.
Macros "connected", but some bars have no cutThe macros were declared connected because editPowerVia or sroute finished without an errorCount crossings per net and list the bars with no cut.
A quiet report hides a real failureThe report was read without its scope, options and capsRead the header and completion line, and add the check that covers the gap.
A handoff carries a drop number or a zero countA toy drop was written as a chip result, or 0x0 was read as zeroLabel toy results, write NOT RUN for missing analysis, and treat 0x0 as no match.

17  Troubleshooting matrix

Start from what you see. Each row names the first query to run, the next check, and the repair or restore with what to rerun. A cause you cannot tie to evidence is not accepted. The recipes are those of sections 2 to 15.

The rows come in three groups. First come database reads and mapping, then geometry (grid, rows, cuts), then reports, analysis and transfer.

Table 35 Troubleshooting matrix
SymptomFirst queryNext checkRepair or restore, then rerun
A dbGet prints 0x0 or nothing.? on a validated object (for example dbGet $n.?), then the exact name with dbGet top.nets.nameIs the name, depth (-⁠p) or attribute wrong for this release?Fix the name or attribute. Treat 0x0 as no match, never as zero. Rerun: the same query.
A nested dbGet returns odd objectsPrint the pointer list of the inner dbGet -⁠p, with its lengthDid the inner query select net or instance objects, and exactly one?Use -⁠p, not -⁠p2, for top.nets.name. Validate before walking deeper. Rerun: the inner query, then the outer.
A macro PG pin is tied to the wrong netpgCellTerms.name and pgTermNets.name for that instanceCompare with the supply ledger. checkDesign -⁠powerGround may be quiet.Narrow globalNetConnect on that one instance, or restore. Rerun: readback, checkDesign -⁠powerGround, verifyConnectivity.
A macro PG port reports unconnectedThe pin-net readback firstDoes a bar of that net have a via instance? Is there an overlap, or only a special-route target?Fix the mapping, then add scoped cuts in the macro box, or let sroute extend to a legal target. Rerun: verifyConnectivity -⁠type special, verifyPowerVia -⁠checkWirePinOverlap.
A floating grid, or no sourcetop.terms.name, then the terminal shape and net after .?Is the terminal inside a wire of its own net on the ring?Create or move the terminal on the ring wire. Rerun: containment test, verifyConnectivity -⁠type special.
Wrong supply on a pin (ring, stripe or pin on the other net)Net-labeled box dump of both netsCompare each box with the ledger and the planRestore, correct the net order or mapping, rerun the step. Rerun: the dump, then all checks.
Unexpected stripe count or duplicate stripesThe M6 stripe boxes per net (section 7)Merged x positions against the arithmetic. Two grids on top of each other double the objects.Restore the checkpoint before the stripe step, fix the value, rerun the step once. Rerun: stripe readback, then checks.
Missing row railsRow boxes, distinct y levelsWere rows cut? Are levels present and segments accounted for? Was the layer or range wrong?Restore the checkpoint before the rail step, rerun with the right options. Rerun: rail readback, then checks.
Missing or rejected viaverifyPowerVia report and the via-instance readbackLayer range, overlap size against the bound, obstruction, different netsScoped editPowerVia, never between different nets. Rerun: verifyPowerVia, verifyConnectivity.
Ring segment missingRing wire boxesIs the loop closed? A local geometry defect; a global open only if the topology says soRestore and rerun the ring step. Rerun: ring readback, verifyConnectivity.
Short or spacing findingMarker location in violationBrowser, nets on both shapesDuplicate grid? A cut between different nets?Delete the offending geometry by net and area, or restore. fixVia only for the marker types it supports. Rerun: verify_drc -⁠check_only special.
Cells look connected but are notIs the instance placed? Its pStatusPlaced pin shapes against a railPlace the cells; do not edit the grid. Rerun: verifyConnectivity.
A clean-looking reportIts header, options, caps and completion lineDoes the scope include the failure? Was a cap reached?State the scope. Add the check that covers the gap. Raise the cap. Rerun: another report with a different scope.
A report scope gapget_verify_drc_mode, the options of the last runSame options before and after the change?Rerun with the same options and area. Rerun: the same command.
Rail analysis fails or looks oddThe prerequisites: library, current data, sourcesIs net voltage set? Are the sources on the grid?Supply the inputs, or write NOT RUN. Do not infer a result. Rerun: the analysis, with its own log.
A drop of zero is reportedDid the analysis produce a result file at all?The log, the inputs, the sourcesRead zero as no result until the log says it ran. Rerun: the analysis.
A restore or transfer does not matchThe sorted dumps and the diff exit statusFirst differing line: wire, via, instance or mode?Restore in a fresh session. Compare halos apart. Redo the readbacks after a transfer. Rerun: dumps again, then the checks.

A finding you cannot classify is not accepted. Stop and ask the owner of the input.

18  Interview preparation

Answer each question in one sentence first, then add detail.

Beginner
Q1. What is the difference between a logical PG connection and a physical one?

A logical connection says which net a pin belongs to; a physical connection is metal and cuts that carry current to it.

What is being tested: whether you separate a name map from a current path.
Beginner
Q2. Why is a closed ring with a cut at every corner not proof that the grid is powered?

Because nothing injects current into it unless a source terminal or pad on the same net touches the ring.

What is being tested: whether you know the source is part of the circuit.
Intermediate
Q3. Why is a blanket globalNetConnect ... -⁠all safe in the worked example but risky in a multi-domain design?

It is safe only when the ledger proves one pin name has one owner throughout the scope.

What is being tested: whether you tie mapping scope to supply ownership.
Intermediate
Q4. With addRing -⁠width 4 -⁠spacing 2 -⁠offset 4, how far does the ring reach from the core edge?

14 µm under the edge convention (-⁠wire_center_offset false), and 12 µm under the center convention.

What is being tested: whether you know what an offset measures and verify it by readback.
Intermediate
Q5. What is the difference between -⁠spacing and -⁠set_to_set_distance in addStripe?

-⁠spacing is the gap inside one VDD-VSS pair; -⁠set_to_set_distance is the repeat pitch from one pair to the next.

What is being tested: whether you can keep three stripe dimensions apart.
Intermediate
Q6. Do M1 row rails prove that the standard cells are connected?

No; rails prove the row grid exists, and only a placed cell's PG pins overlapping a rail prove a connection.

What is being tested: whether you separate "rails exist" from "cells are connected".
Intermediate
Q7. How many V56 cuts fit in a 2 × 2 µm overlap? Cuts and spacing are 0.2 µm, enclosure 0.05 µm.

At most 5 × 5 = 25, from floor((2 - 0.1 + 0.2) / 0.4) = 5 per axis.

What is being tested: whether you can apply the cut-array bound and treat it as a limit, not a count.
Advanced
Q8. Why must verifyPowerVia run with -⁠checkWirePinOverlap for the macro connections?

Macro PG bars are pin shapes, and wire-over-pin crossings are excluded from the check by default.

What is being tested: whether you know a check's default scope before trusting it.
Advanced
Q9. A special-route DRC report shows zero violations. What do you check before you accept it?

Its scope, options, cap and completion line, because a quiet report only means nothing was found inside its scope.

What is being tested: whether you read a report as scoped evidence, not as a verdict.
Intermediate
Q10. What does the toy IR calculation give, and what does it leave out?

10 mA through a 1 Ω strip gives 10 mV, or 1.25 % of 0.8 V, and it is only a sizing aid.

What is being tested: whether you keep a hand calculation apart from a signoff claim.
Advanced
Q11. You must change the stripe pitch. Why restore a checkpoint instead of running addStripe again?

Creation commands are not idempotent, so a rerun adds a second grid on top of the first.

What is being tested: whether you know how stale geometry gets into a grid.
Advanced
Q12. How do you prove that a saved grid restores correctly?

Dump a sorted, net-labeled subset before, dump it again in a fresh session after restoreDesign, and read the diff exit status.

What is being tested: whether you build a comparison that can fail, instead of trusting files on disk.

Compact glossary

Table 36 Compact glossary
TermMeaning
PG pinA cell or macro pin that must be tied to a supply or return net, such as VDD or VSSM.
Supply ledgerThe table of supply nets, values, owners and library pins that every mapping is checked against.
Logical mappingThe name rule (globalNetConnect) that ties PG pins to nets. It is not metal.
Source terminalA PG pin shape on the block boundary or on the ring that stands for the external supply; current enters there.
RingA closed loop of power wires around the core; here M7 top and bottom, M8 left and right.
StripeA long straight power wire repeated across the core; here 2 µm wide on M6.
Set-to-set distanceThe repeat pitch from one stripe pair to the next; 120 µm in the example.
SpacingThe gap inside one stripe pair or between two ring wires, edge to edge.
Followpin (row rail)The M1 power wire along each standard-cell row, shared by the rows above and below.
CrossingA place where two wires of adjacent layers overlap.
Via instanceOne via object in the database; it may hold an array of cuts.
Cut shapeOne square of a cut layer, such as one V56 square.
EnclosureMetal that must extend past a cut on each side.
Placement haloA margin that keeps cells away from a macro; it does not stop metal.
Routing blockageAn area that blocks metal on one named layer only.
IR dropVoltage lost along the grid: current times resistance.
EMElectromigration: metal wear under current, limited per wire or cut by the project.
NOT RUNThe status of a check or analysis that did not run; never zero and never a pass.
CapThe -⁠error or -⁠limit value that stops a check; reaching it means incomplete coverage.
WaiverAn accepted violation with written scope, owner, reason and approval.
CheckpointA saved database named after the step it precedes; restoring it is the clean undo.
PSDLPG Structure Description Language: a braced text file that route_pg builds a grid from.
Restore proofA sorted dump before and after a fresh restore, compared by diff exit status.

One-page summary

Purpose. Build the power grid on the accepted floorplan and read back what was made. Check each claim with the tool that fits it. Then hand it on with evidence and open items.

Workflow map.

Key concepts.

Common mistakes. See Table 34.

Acceptance questions.

Debug and sanity desk sheet

The two tables below are command patterns, all in the Legacy UI command set. Run one command per line. $n is a net object, $i an instance and $t a terminal; replace the example names and ROM box with your own. 0x0 is no match and an llength above 1 is ambiguous: stop on both. Confirm attribute names with .?.

Table 37 Desk sheet, part 1: what to query (read only)
AskCommand patternRead it asCaution, next check
Which design and core?dbGet top.name, dbGet top.fPlan.coreBoxName, then llx lly urx ury in µmNot database units unless you passed -⁠d
Technology and layers?dbGet head.?, dbGet head.layers.nameAttribute list; layer names in stack orderDirections and rules come from the LEF, not memory
Which nets are PG?dbGet [dbGet -⁠p top.nets.isPwrOrGnd 1].nameNames flagged as power or groundA missing ledger net means stop
Select exactly one netset n [dbGet -⁠p top.nets.name VDD]One pointer0x0 none, more than one ambiguous. -⁠p gives net objects, -⁠p2 does not
Special wires of itforeach w [dbGet $n.sWires] {puts "[dbGet $w.layer.name] [dbGet $w.box]"}One line per wire, layer and box togetherTest for 0x0 first. Empty is not zero
Special viasset vs [dbGet $n.sVias], and only if $vs is not 0x0, dbGet [lindex $vs 0].?Via instances, with a field listInstances are not cut shapes. Use .? first
Macro placementset i [dbGet -⁠p top.insts.name u_coef], then dbGet $i.box, dbGet $i.orient, dbGet $i.pStatusBox, orientation, statusValidate $i first. An unplaced instance has no valid pin positions
Macro PG names and netsdbGet $i.pgCellTerms.name, dbGet $i.pgTermNets.nameLibrary pin names, tied netsSame length? Compare with the independent supply ledger
RowsdbGet top.fPlan.rows.box, dbGet top.fPlan.rows.orientOne box per row objectDistinct y levels are not segments. cutRow splits rows
SourcesdbGet top.terms.name, set t [dbGet -⁠p top.terms.name VDD], dbGet $t.?Terminal names; schema of one terminalKeep signal ports and PG terminals as separate counts
Modes in forcegetAddRingMode, getAddStripeMode, getViaGenMode, getSrouteMode, each -⁠nonDefault; get_verify_drc_modeChanged settingsRecord with the result. Save before setting, restore after, also on error

Checks replace markers and write reports. A report that exists or is quiet is not a PASS: read its header, scope, caps and completion line. A reached cap is incomplete coverage, and a check that did not run is NOT RUN.

Table 38 Desk sheet, part 2: what to check
CheckCommand patternReads asCaution, next check
PG typecheckDesign -⁠powerGround -⁠noHtml -⁠outfile r.txtPower-to-ground, floating and non-PG tiesDoes not know intended voltages or domains. Compare pin-to-net with the ledger
ConnectivityverifyConnectivity -⁠type special -⁠error 1000 -⁠warning 50 -⁠report r.rptOpens, islands, unconnected pins-⁠allPGPinPort for all PG ports, if justified. Not every damaged redundant path
Special DRCset_verify_drc_mode -⁠limit 1000, then verify_drc -⁠check_only special -⁠report r.rptSpacing, width, shorts on special wiresPlaced instances only. Record the mode. Raise the limit if reached
Missing viasverifyPowerVia -⁠checkWirePinOverlap -⁠layerRange {M5 M6} -⁠report r.rptMissing cuts at crossings, wire over macro pinsA per-crossing finding, not a global open. The stacked check needs a range
MarkersviolationBrowser -⁠connectivity or -⁠filter {Short}Locations and typesConnectivity markers are overwritten on rerun
Fix a via markerfixVia -⁠area {590 800.2 830 960.2} -⁠minCut, then verify_drc againReplaces supported markersOnly DRC markers it supports. Not a general missing-via creator
Add or delete cutseditPowerVia -⁠add_vias 1 -⁠nets VDD -⁠bottom_layer M5 -⁠top_layer M6 -⁠area {{590 800.2 830 960.2}}New via instancesRead the instance count before and after. Restore area_only
Fresh restoreDump, restoreDesign in a new session, dump, diffExit 0 equal, 1 different, above 1 failedSilence is not proof. Dumps are sorted and net-labeled
IR and EMset_rail_analysis_mode, analyze_railNeeds library, current data, sourcesMissing input: NOT RUN. Never zero. Never a pass

Where the next chapter goes, and why

You now hold a grid whose geometry is checked and whose open items are written down. One gap remains on purpose: the standard cells are not placed. Rails exist, but no cell pin has been shown to touch one.

Placement, Pre-CTS Optimization, Checks and Handoff closes that gap. Placement puts the cells on the rows, and their PG pins land on the rails you built. It is also where the grid starts to cost something, because stripes and cuts take routing room. Keep the handoff note open. Its unresolved list, its NOT RUN items and its restore proof are the first things the next stage will read.