UPF vs IPF at a Glance
Both formats are Tcl-based, both are about power, and both feed into the same broader power-integrity signoff process this documentation set already covers — but they operate at opposite ends of the design flow and answer completely different questions.
Click a stage to open its page or section. UPF answers "what power architecture should this chip have?" and is authored by hand early in the flow. IPF answers "how much power is this specific instance actually drawing right now?" and is machine-generated late in the flow, directly feeding the Static Analysis signoff stage.
| UPF | IPF | |
|---|---|---|
| Full name | Unified Power Format | Instance Power File |
| Standard? | Yes — IEEE 1801, vendor-neutral | No — tool-specific (Synopsys PrimePower / Ansys RedHawk-SC ecosystem) |
| What it describes | Power intent: domains, voltages, gating, isolation, retention | Power data: measured/estimated watts or amps per instance per pin |
| Who writes it | Power architect / RTL team, by hand, early | Generated automatically by a power analysis tool, late |
| Consumed by | Simulators, synthesis, place-and-route, formal tools | RedHawk-SC's PowerView, for static IR-drop/EM analysis |
Power Domains & Supply Sets
Everything in UPF builds on two primitives: a power domain groups logic that shares common power control, and a supply set groups the actual power/ground nets that feed a domain. UPF is layered on top of RTL without touching it — the same Verilog gets different power behavior depending only on which UPF file is loaded alongside it.
PD_GPU is a sub-region of the chip that can be gated independently of PD_TOP — its own supply net, its own supply set, its own power states.
Building it up, command by command
# Create the top-level power domain (always-on context)
create_power_domain PD_TOP -include_scope
# Create a power domain scoped to just the GPU instance
create_power_domain PD_GPU -elements {gpu_inst}
# Define supply nets (the actual power/ground rails)
create_supply_net VDD_TOP -domain PD_TOP # 1.2V supply for top
create_supply_net VDD_GPU -domain PD_GPU # switchable supply for GPU
create_supply_net VSS -domain PD_TOP # common ground
# Group related supplies into a named supply set
create_supply_set SS_TOP -function {power VDD_TOP} -function {ground VSS}
create_supply_set SS_GPU -function {power VDD_GPU} -function {ground VSS}
# Attach each supply set to its domain
associate_supply_set SS_TOP -handle PD_TOP
associate_supply_set SS_GPU -handle PD_GPU
| Command | What it does |
|---|---|
create_power_domain | -include_scope covers the entire current hierarchy scope (typical for the top domain); -elements {...} lists specific instances to include (typical for a sub-block domain) |
create_supply_net | Declares one physical power or ground net and which domain it belongs to |
create_supply_set | Groups a power net and a ground net under one named handle via -function {power ...} / -function {ground ...}, so later commands (isolation, retention, level shifters) can reference "the supply for this domain" in one argument instead of two |
associate_supply_set | Connects a supply set to a domain's primary power handle — without this, the domain has no defined power source |
Power States & Power Switches
A power state is a named, legal voltage value a supply net can take (add_power_state); a power switch is the UPF object that models the actual header/footer switch cell controlling whether a domain's supply is connected to an upstream always-on rail (create_power_switch). Together they're what makes a domain "power-gateable" instead of just multi-voltage.
# Power states: legal voltage values for each supply
add_power_state VDD_TOP -state {ON 1.2}
add_power_state VDD_GPU -state {ACTIVE 0.9} -state {OFF off}
# Power switch: models the physical header/footer switch cell
create_power_switch PSW_GPU -domain PD_GPU \
-input_supply_port {vin VDD_TOP} \
-output_supply_port {vout VDD_GPU} \
-control_port {ctrl gpu_power_enable} \
-on_state {on vin {ctrl}}
Reading the switch: vin is the always-on input rail, vout is the switched output that actually feeds PD_GPU, and ctrl is the enable signal. The -on_state {on vin {ctrl}} clause says "the output is in the 'on' state, driven from vin, whenever the control condition is true" — when gpu_power_enable deasserts, vout (and therefore VDD_GPU) has no valid on-state and the domain is off.
Isolation Strategies
When a power domain is gated off, its outputs float to an undefined value. If that undefined signal reaches always-on logic, it can corrupt computation, cause shoot-through current (both PMOS and NMOS conducting at an intermediate voltage), or make a receiving flip-flop metastable. Isolation cells sit at the boundary and clamp the domain's outputs to a known-safe value (0 or 1) whenever the domain is off — and critically, the isolation cells themselves are powered by the always-on supply, not the domain being gated, so they keep functioning after the domain they're isolating has lost power.
Isolation must be asserted before power-down and released only after power and reset are stable on the way back up — getting this sequencing backward is one of the most common real UPF bugs.
set_isolation ISO_GPU -domain PD_GPU \
-isolation_supply_set SS_TOP \
-clamp_value 0 \
-isolation_signal gpu_iso_enable \
-isolation_sense high \
-location parent
| Parameter | Meaning |
|---|---|
-isolation_supply_set | Must be an always-on supply set (e.g. SS_TOP) — using the gated domain's own supply here is the single most common beginner mistake, since the isolation cell would lose power right when it's needed |
-clamp_value | 0 or 1 — the safe value to drive when isolated. Active-high enables typically clamp to 0 (disabled); active-low signals like reset_n typically clamp to 1 (stays out of reset) |
-isolation_signal / -isolation_sense | The control signal and its active polarity (high or low) that triggers clamping |
-location | parent (most common) places the cell in the always-on domain just outside the boundary; self places it inside the gated domain; fanout places one per receiving instance |
-isolation_supply_set SS_GPU instead of SS_TOP — the isolation cell would be powered by the exact domain it's supposed to isolate, so it clamps nothing the moment it's actually needed. Always point isolation supply at the parent/always-on domain.Retention Strategies
Power gating a domain normally loses every flip-flop's state, forcing a slow software re-initialization on wake (milliseconds). Retention adds a second, always-on, low-voltage supply (typically 0.6–0.8V) to specially-built retention flip-flops, so state is preserved through a power-down cycle at near-zero leakage and restored in microseconds instead of milliseconds — the difference between a phone waking instantly on touch versus visibly lagging.
Retention only preserves flip-flop state, not combinational logic — the domain can still be fully powered off for maximum leakage savings everywhere except the deliberately-retained registers.
# Retention supply: a second, always-on, low-voltage net
create_supply_net VDD_RET -domain PD_CPU
create_supply_set SS_CPU_RET -function {power VDD_RET} -function {ground VSS}
add_power_state VDD_RET -state {RETENTION 0.6}
# Basic retention: every flip-flop in the domain
set_retention RET_CPU -domain PD_CPU \
-retention_supply_set SS_CPU_RET \
-retention_condition {cpu_retention_enable}
# Selective retention: only the state actually worth saving
set_retention RET_CRITICAL -domain PD_CPU \
-retention_supply_set SS_CPU_RET \
-retention_condition {retention_enable} \
-elements {
cpu_inst/control_unit/config_regs
cpu_inst/control_unit/status_regs
cpu_inst/mmu/tlb_state
}
Selective retention (via -elements) is the practical default in real designs: retaining every flip-flop costs 30–50% extra area on each one, so teams typically retain only control/status registers and re-initialize bulk datapath state (ALU operands, temporary buffers) on wake, since that state is cheap to recompute anyway.
-retention_supply_set at the domain's own switchable supply instead of a dedicated always-on retention net — if the retention cell's power comes from the same rail that's about to be switched off, there's nothing left to hold the state.Level Shifters
When a signal crosses from one voltage domain into another, the receiving domain's gates may not correctly interpret the sender's voltage swing. A signal driven at 0.9V arriving at a 1.2V domain's input may not register as a clean logic-1 (low-to-high crossing); a 1.2V signal driving directly into 0.6V gates can overstress the thin oxide of the smaller-voltage transistors (high-to-low crossing). Level shifter cells sit at these domain boundaries and translate the voltage swing so the receiving domain sees a clean, full-rail signal.
Level shifting is orthogonal to isolation: isolation deals with a domain being off, level shifting deals with two domains that are both on but at different voltages.
set_level_shifter LS_LOW_TO_HIGH -domain PD_LOW \
-applies_to outputs \
-rule low_to_high \
-location parent
Like isolation, -location parent is the typical choice, placing the level shifter cell just outside the source domain so it's driven by a supply that's guaranteed available. Many real designs need level shifters in both directions simultaneously if a domain both sends signals to a higher-voltage neighbor and receives signals from it — -rule can be set to low_to_high, high_to_low, or both depending on the crossing.
UPF in the Design Flow
UPF is written early and reused, unmodified, by every downstream tool — that consistency is the entire point of standardizing it.
| Flow stage | How UPF is used |
|---|---|
| Architecture | Power domains, voltage levels, and power states are decided before RTL is even complete |
| RTL design | Functional Verilog/SystemVerilog is written with no power-specific code — UPF stays a separate file |
| Simulation | Power-aware simulation verifies power state transitions, X-propagation behavior, and retention save/restore against the UPF model |
| Synthesis | The tool inserts real isolation, level-shifter, and retention library cells wherever UPF strategies say they're needed — see Logic Synthesis |
| Physical design | Power domains are planned into the floorplan, power switches are placed, and the power grid is routed to match — see Floorplanning |
| Power analysis | Per-domain, per-state power is estimated — this is where IPF data starts to appear, feeding IR-drop/EM signoff |
| Signoff | Power management correctness (isolation/retention/level-shifter presence and sequencing) is checked formally against the same UPF used from day one |
IPF: Instance Power File
Where UPF describes intent, IPF carries data: a flat text file listing how much power (or current) every instance in the design actually draws, generated by a power-estimation tool — typically Synopsys PrimePower — and consumed by RedHawk-SC's PowerView object for static IR-drop and electromigration signoff (see Static Analysis). RedHawk-SC supports two IPF layouts, a detailed 9-column form and a simpler 3-column form.
Real example lines, reproduced from Synopsys/Ansys RedHawk-SC application-note documentation. Instances with no entry in the IPF file are silently assigned zero power — coverage gaps are a real, common signoff risk.
| Column (9-column format) | Meaning |
|---|---|
| instance_name | Hierarchical path to the cell instance |
| power_pin_name | Which supply pin this power number applies to (e.g. VDD) |
| voltage | Operating voltage at that pin (V) |
| toggle_rate | Switching activity factor used to derive dynamic power |
| frequency | Clock frequency the toggle rate is referenced to (Hz) |
| total_power | Sum of switching + internal + leakage power (W) |
| switching_power | Power from charging/discharging the net's load capacitance |
| internal_power | Power dissipated inside the cell itself during switching (short-circuit current, internal node charging) |
| leakage_power | Static power drawn even when the cell isn't switching |
IPF in the static power flow
RedHawk-SC's PowerView is, in effect, a lightweight version of a full scenario view that only tracks instance power — it can import a hand-off IPF file directly, calculate power itself from a SwitchingActivityView's toggle rates, or convert currents from an existing analysis. When it imports IPF, coverage matters: the appnote is explicit that instances missing from the file get zero assigned power, so an incomplete IPF silently under-counts real power draw unless a fallback switching-activity-driven flow is layered on top for uncovered instances.
# Load a design's IPF file into a PowerView for static analysis
pwr = db.create_power_view(dv=dv, power_file_names='power.ipf.gz', tag='pwr')
# Use that PowerView in a static scenario for IR-drop / EM signoff
scn = db.create_scenario_view(power_view=pwr, scenario_type='Static',
options=options, voltage_levels=voltage_levels, tag='scn')
# ...later, export an IPF back out of a PowerView (e.g. after adjustment)
# PowerView.write_instance_power_file(file_name, comment=None)
Multiple IPF files can be combined in one power_files list, each scoped to a specific instance_name, cell_name, or with a scaling_factors dict to rescale a particular supply net's contribution — and exactly one file in the list can be marked 'override': True to take precedence if the same instance appears in more than one source file.
SwitchingActivityView, SAIF-based, and VCD/FSDB-based flows. IPF is the path used when a separate power-signoff tool (PrimePower) has already computed authoritative per-instance numbers upstream.UPF vs IPF, Side by Side
| Question | UPF answers it | IPF answers it |
|---|---|---|
| What voltage does this domain run at? | Yes — add_power_state | No |
| Can this domain be turned off? | Yes — create_power_switch | No |
| What happens to this domain's outputs when it's off? | Yes — set_isolation | No |
| Does this domain remember its state across power-down? | Yes — set_retention | No |
| How many watts is this specific instance drawing right now? | No | Yes — per-instance power/current values |
| Where in the design is IR drop or EM risk highest? | No (indirectly, via domain structure) | Yes — feeds directly into static IR-drop/EM signoff |
| Is it a public standard? | Yes — IEEE 1801 | No — Synopsys/Ansys tool ecosystem format |
In short: without UPF, a chip's power architecture has no formal, tool-independent description at all. Without IPF (or one of RedHawk-SC's other power-sourcing methods), the static IR-drop and EM analysis on the EMIR Analysis page has no per-instance power numbers to work from in the first place. They're not competing formats — they're sequential dependencies in the same signoff chain.
Sources
- IEEE 1801 — Unified Power Format Standard — IEEE Xplore
- Introduction to UPF — ChipVerify
- UPF Isolation Strategies — ChipVerify
- UPF Retention Strategies — ChipVerify
- Unified Power Format — Wikipedia
- Common Power Format — Wikipedia
- An Inside Look at UPF 4.0 — Semiconductor Engineering
- IPF (Instance Power File) 9-column and 3-column format specification, example data, and static-flow usage — AppNote_Static_Power_Analysis_In_RedHawk-SC.pdf (internal Synopsys/Ansys RedHawk-SC documentation)
- PrimePower: RTL to Signoff Power Analysis — Synopsys
- RedHawk-SC | SoC Power Integrity & Reliability Software — Synopsys