`create_power_domain` (UPF) names a group of instances that share one primary supply and one set of isolation, level-shifter and retention strategies. It is bookkeeping for the tools, not a netlist cell: nothing gets inserted until strategies act on it. In MYCHIP you create the always-on top domain, then one child domain per block, and confirm the result with `report_power_domains` (ICC2).
You create the entry points with `create_supply_port` (UPF), the wires with `create_supply_net` (UPF), and join them with `connect_supply_net` (UPF). A net created for one domain can be extended into another with `-reuse`, so one physical rail spans the hierarchy. In IEEE 1801-2015 you then bundle nets into supply sets instead of naming them as domain primaries directly.
A supply net is one wire carrying one function, such as VDD1p0 or GND. A supply set is a named bundle of functions (power, ground, and optionally nwell and pwell) that you bind to real nets, so a strategy can say "power this from SS_AON" without listing nets. IEEE 1801-2015 builds domain primaries, isolation supplies and retention supplies on supply sets, created with `create_supply_set` (UPF).
`set_domain_supply_net` (UPF) names the primary power and ground nets of a domain, and every cell in that domain is then implicitly tied to them. IEEE 1801-2015 lists it as legacy: the modern form binds a supply set with `create_power_domain PD_COP -supply {primary SS_COP}` (UPF). Both still load in ICC2 and PrimeTime, so you need to read the old form and write the new one.
`set_isolation` (UPF) tells the tool which boundary ports of a switchable domain need an isolation cell, what powers that cell, and what value it holds while the domain is off. Pair it with a control signal, and the always-on side never sees a floating input.
For `set_isolation` (UPF), IEEE 1801-2015 lists four locations: self (the default), parent, other and fanout; automatic is a `set_level_shifter` (UPF) value in ICC2, not an isolation one. The location decides which domain hosts the cell, and therefore which rail its row gives it. Choose the site where the isolation supply is already on, so you avoid a dual-rail cell and a secondary strap inside a switched area.
The clamp value is what the isolation cell drives while its source domain is off: 0 (an AND-type cell, the ICC2 default), 1 (an OR-type cell) or latch (holds the last value). Choose it signal by signal, from what the always-on receiver treats as inactive, not one value per domain. Active-high enables clamp to 0, active-low resets clamp to 1, and buses that must keep their last value use latch.
`set_level_shifter` (UPF) tells the tool which ports of a domain get level shifters, for which voltage direction, and in which domain the cell sits. Low-to-high crossings always need a shifter; high-to-low ones depend on the library and the voltage gap, which is what `-rule` and `-threshold` let you filter. Without any strategy, ICC2 still inserts shifters from the voltages in the power states.
Pick the side where the shifter can get both supplies cheaply: its row rail gives one supply and a secondary pin must reach the other. Self puts the cell inside the domain whose port is shifted; parent puts it in the surrounding domain. For MYCHIP, up-shifters on PD_CPU outputs usually sit in the parent, and down-shifters on PD_CPU inputs sit in self.
`set_retention` (UPF) names which registers in a shutdown domain must keep their state, which supply keeps that state alive, and which signals save and restore it. The register needs two supplies: the switched primary for normal operation and a retention supply that stays on while the primary is off. In IEEE 1801-2015 you give that supply as a set with `-retention_supply` and put the save and restore signals on the same command.
You name each control net and its active level or edge: `-save_signal {U_PC/SAVE high}` and `-restore_signal {U_PC/NRESTORE low}`. In IEEE 1801-2015 these options sit on `set_retention` (UPF) itself; `set_retention_control` (UPF) is the UPF 1.0 form that ICC2 and PrimeTime still accept. The sense you write must match the retention cell pins, or the flop saves and restores at the wrong moments.
`create_power_switch` (UPF) declares an abstract switch that passes an always-on input supply to a switched output supply under a control signal. You name its ports and the nets they connect to, then write Boolean on and off states in terms of the control port. It is one abstract switch in the UPF, later mapped to library cells and built as an array of many cells.
`map_power_switch` (UPF) tells the tools which library cell implements an abstract switch from `create_power_switch` (UPF). In IEEE 1801-2015 the syntax is the switch name followed by a required `-lib_cells` list and an optional `-port_map`. Mapping picks the cell; ICC2 still has to build and connect the physical array.
No single UPF command creates a virtual rail. You declare a separate supply net, make it the output of a power switch fed by the always-on rail, and bind it as the primary of the shutdown domain. In MYCHIP that net is VDD1p0_SW: the switch PD_COP_SW drives it from VDD1p0, and PD_COP runs on it through the supply set SS_COP.
First give each supply port its named states with `add_port_state` (UPF), then declare the table and its column order with `create_pst` (UPF), then add one row per legal mode with `add_pst_state` (UPF). Any combination you do not list is illegal. All three commands are legacy in IEEE 1801-2015, which recommends `add_power_state` (UPF) instead, but ICC2 and PrimeTime still read them.
Always-on control paths carry the signals that manage a shutdown domain, such as isolation enable, save, restore and switch enable, and they must keep working while that domain is off. When such a path runs through a switched voltage area and needs buffering, it needs always-on buffers: cells with a backup supply pin that stays on. ICC2 inserts and legalizes them itself, but only if the library has always-on buffers and the backup supply can reach them.
A feedthrough path is a net that passes through a domain without being used there, for example a PD_CPU to PD_MYCHIP signal routed across the PD_COP area. If it gets buffered on the switched supply of the area it crosses, the net dies whenever that domain is off, even though both its ends are on. ICC2 handles this with always-on or dual-rail buffers, and the UPF can also mark ports that are shorted inside a block as feedthroughs.
Hierarchy in UPF comes from scope: every command acts in the current scope, and you move it with `set_scope` (UPF) or run a block file in place with `load_upf -scope` (UPF). A domain created in a lower scope whose elements sit inside a parent domain simply nests there. `create_composite_domain` (UPF) groups several domains under one name for shared strategies, but it has no physical region.
The tool only uses a cell for isolation, level shifting, switching, retention or always-on buffering if its Liberty model says so. Each type has a cell flag, such as is_isolation_cell or is_level_shifter, plus pin attributes that mark enable pins, PG pin types and which supply each signal pin belongs to. You check what the tool actually read with `report_mv_lib_cells` (ICC2).
Start with what the tool resolved: `report_power_domains` (ICC2), `report_supply_sets` (ICC2) and `report_pst` (ICC2). Then check what it built with `report_mv_cells` (ICC2) and judge the result with `check_mv_design` (ICC2). Repeat the domain and supply reports in PrimeTime so signoff reads the same intent.
ECRL (Efficient Charge Recovery Logic) and PFAL (Positive Feedback Adiabatic Logic) are dual-rail adiabatic gate families. Instead of a fixed VDD, each gate hangs off a slowly ramping power-clock, so the output charges gently and most of the charge flows back to the supply when the clock ramps down. They differ in where the logic trees sit and how cleanly the outputs swing, and both need a multi-phase power-clock generator that standard ASIC flows do not provide.
AVS trims a domain's supply voltage in a closed loop, using on-die monitors that measure how fast this particular die is right now. DVFS picks a voltage from a fixed table built for the slowest die at the worst temperature, so it wastes margin on typical and fast silicon. AVS runs on top of DVFS: DVFS chooses the frequency, and AVS finds the lowest voltage that still meets it.
VTCMOS changes transistor threshold voltage at runtime by driving the wells from a body-bias generator instead of tying them to VDD and VSS. In standby it applies reverse body bias to raise Vt and cut subthreshold leakage, and in active mode it returns to zero or forward bias for full speed. The block keeps its state because the supply stays on; only the wells move.
DTCMOS ties each transistor's body to its own gate, so the threshold voltage follows the input. When the gate turns the device on, the body forward-biases and Vt drops for more drive; when the gate is off, the body returns to the source level and Vt stays high for low leakage. There is no bias generator, but the supply must stay below the body diode turn-on voltage, which limits DTCMOS to very low-voltage designs.
Light sleep, deep sleep and shutdown are three increasingly deep memory power modes. Each one saves more leakage than the one before and takes longer to wake, and only shutdown loses the stored data. The right choice depends on how long the memory will stay idle compared with the energy and time it costs to wake it up.
Fine-grain clock gating stops the clock to a small group of registers that share an enable, usually inserted by synthesis from RTL enable logic. Coarse-grain gating stops the clock at a branch or block root, so the buffers under it stop toggling too. Both use an ICG cell, which latches the enable while the clock is low so the gated clock never glitches, something a bare AND gate cannot guarantee.
UPF and CPF are both Tcl-based languages that describe power intent outside the RTL: domains, supplies, isolation, level shifting, retention and power states. UPF started at Accellera and became IEEE 1801, while CPF came from the Si2 consortium with Cadence behind it. The industry settled on UPF because an IEEE standard gave every tool vendor a single target, and Cadence tools now read UPF too, so a UPF file travels across vendors.
`create_voltage_area` (ICC2) turns a UPF power domain into a physical region where that domain's cells must be placed; the placer treats it like an exclusive move bound. A guard band is a hard keepout ring that grows outward from the voltage area edge, where no cell can sit. It keeps cells of neighbouring domains apart so their power rails and straps can be built without shorts.
Where voltage-area shapes overlap, ICC2 uses stacking order: by default the shape defined last sits on top and owns the overlap. To nest one voltage area inside another, you define the outer one first and the inner one second, so the inner shape is on top and the outer area's effective shape becomes a ring. Define them the other way round and the outer shape masks the inner one, which ends up with no placement area at all.
Two power domains can share one voltage area when their primary supplies are equivalent: connected in the UPF, physically connected, or functionally equivalent with the same power states. You declare the sharing with the `shared_voltage_area` design attribute through `set_design_attributes` (UPF), and one of the domains acts as the primary domain. The shared voltage area gets one power switch implementation, and `connect_power_switch` (ICC2) wires it for all domains in the set.
An array spreads switch cells in columns or a grid through the voltage area, so every standard cell is close to a switch and IR drop stays low. A ring places the switches along the voltage-area boundary, which keeps the core rows free but makes the centre the farthest point from any switch. Arrays suit large or high-current domains; rings suit small domains and hard macros that cannot take switch cells inside.
In a daisy chain, the switch enable enters the first switch cell, and each cell passes a buffered copy to the next, so the switches turn on one after another instead of all at once. That spreads the in-rush current that charges the virtual rail over time and keeps the peak within what the grid can deliver. The output of the last cell comes back as the acknowledge, telling the power controller that every switch is on.
Dual-rail cells in a shutdown domain, such as always-on buffers, isolation cells and level shifters, need a nearby strap for their secondary (backup) supply. By default ICC2 assumes that strap exists everywhere in the voltage area, which is rarely true. Secondary PG placement constraints tell the placer where the straps really are, so dual-rail cells land close enough for short, low-IR secondary PG routes.
Buffers placed inside a shutdown voltage area on an always-on net must stay powered when the domain is off. You use dual-rail always-on buffers whose backup power pin connects to an always-on secondary supply, never single-rail buffers on the switched rail. ICC2 does this automatically during optimization, and `fix_mv_design -buffer` (ICC2) and `create_mv_cells -always_on` (ICC2) repair buffers that are on the wrong supply.
Both methods buffer a net that physically crosses another domain's voltage area. Physical feedthrough buffering places dual-rail buffers in the crossed voltage area and assigns them to that power domain without punching ports, so the logic hierarchy is unchanged. Logical feedthrough buffering is used when the domain is created at a scope below the net, so the tool punches ports into that hierarchy and places the buffer inside it.
The placer treats each voltage area as an exclusive move bound: a domain's cells must go inside its voltage area, and every other cell must stay out. Isolation and level shifter cells follow their strategy location, so they collect along voltage-area edges, and dual-rail cells also need to sit near their secondary straps. Most boundary problems come from crowding at those edges, guard bands that eat space, and cells that end up in the wrong area after an ECO.
A clock that enters a domain at a different voltage needs a level shifter like any other signal, but ICC2 does not insert level shifters on clock nets by default. You name the clock nets in `mv.upf.auto_ls_clock_nets` (ICC2) and allow shifting on ideal nets with `mv.upf.allow_ls_on_ideal_networks` (ICC2). Then you keep the shifted branch balanced, watch duty cycle, and make sure clock buffers feeding always-on logic stay on when their domain powers down.
A dual-rail cell has its primary PG pins on the supply of the domain it sits in and its backup pin on the supply the UPF strategy names, such as the isolation supply. `connect_pg_net -automatic` (ICC2) derives those connections from the committed UPF and the library PG pin data, so you do not wire them by hand. You then check them with `check_mv_design -pg_netlist` (ICC2), because the default `check_mv_design` (ICC2) run skips PG net and PG connection checks.
`create_mv_cells` (ICC2) inserts power management cells from the UPF strategies: isolation cells, level shifters and repeaters, and with its own options retention cells and always-on legalization of buffers. It runs after `load_upf` (ICC2) and before placement, and it is optional because synthesis normally inserts these cells, but it gives early feedback on whether the power intent is feasible. The flow then continues with `check_mv_design` (ICC2), placement and optimization, and `save_upf` (ICC2).
`check_mv_design` (ICC2) prints one section per rule group, from power domain and supply rules through strategy rules to cell rules, with each message followed by an MV-080 total for that message ID. Triage from the top: supply and domain problems cascade into everything below, so fix those first, then strategy conflicts, then individual cells. For any cell or path it flags, `report_mv_path` (ICC2) tells you why a cell was inserted, associated or rejected.
`report_mv_path` (ICC2) traces one multivoltage path through a pin, net or cell and shows every MV cell on it with its supply, drivers, sinks, strategy and power domain. For a level shifter or isolation cell that failed to insert or associate, it prints the reason. You reach for it when `check_mv_design` (ICC2) flags a cell or net and you need to know why.
Check functional and DFT crossings separately. For functional paths, run `check_mv_design -isolation` (ICC2), which checks isolation strategies, isolation cells and the isolation of the netlist, then trace anything it flags with `report_mv_path` (ICC2) to see which strategy applies and why a cell is missing or unassociated. Scan stitching adds crossings the RTL UPF never listed, so after scan insertion run `check_isolation_coverage -dft_signals` (ICC2), which reports DFT paths with an isolation violation that no strategy covers.
Use the early data check manager: `set_early_data_check_policy` (ICC2) sets how each multivoltage check reacts (error, tolerate or repair), and `report_early_data_checks` (ICC2) lists what was relaxed and how often it fired. The older route is the incomplete UPF flow, enabled with `mv.incomplete_upf.enable` (ICC2). Either way the tool is guessing at missing intent, so every relaxed check must be closed before signoff.
PrimeTime reads the UPF with `load_upf` (PT), builds a virtual model of the power network and pushes each supply net voltage down to the PG pins of every leaf cell. You give the voltages with `set_voltage` (PT), and each cell is then timed at its own supply voltage. PT does not read the power state table directly, so your voltages must match the one PST state you mean to verify.
A level shifter is a real cell on the path, and its delay depends on both its input and output supply voltages. PT times it from two-rail libraries characterized at voltage pairs, and separately checks signal levels with `check_timing -include signal_level` (PT) to catch crossings that need a shifter but lack one. `set_level_shifter_threshold` (PT) sets how large a driver-load voltage difference counts as a mismatch.
The isolation enable decides the moment the always-on side stops trusting a domain, so it is a timed event, not a static setting. It must reach every isolation cell and settle before the switched rail starts to fall, and it may only release once the rail is back, the domain is restored and its outputs are valid. The whole path that carries it must stay powered while the domain is off.
A low-power static checker such as VC LP reads the design and the UPF and proves, without simulation, that the power intent is consistent and that the netlist implements it. You run `check_lp` (VCLP) by stage: `-stage upf` for the power intent, `-stage design` for the netlist, and `-stage pg` once the netlist carries power and ground pins. You then read `report_violations -app LP` (VCLP) and waive only what you can justify.
Power-aware simulation runs your RTL or netlist together with the UPF, so supplies can switch off during a test. When a supply set enters a state whose simstate is CORRUPT, the simulator corrupts what it powers: state elements and the nets they drive go to X, and those processes stop evaluating. That turns a missing clamp, a controller that switches in the wrong order, or a retention register restored too early into visible X on signals your testbench already checks.
Scan stitching adds paths the functional UPF never saw: a chain that runs from PD_COP into PD_MYCHIP crosses a domain boundary and needs isolation and level shifting like any data signal. ICC2 covers these with `set_dft_isolation` (ICC2), which reuses an existing isolation strategy for DFT connections, or with a placeholder strategy that `generate_mv_constraints -dft_isolation` (ICC2) fills after `insert_dft` (ICC2). `check_isolation_coverage -dft_signals` (ICC2) then shows what is still uncovered.
Enable PrimePower with `set_app_var power_enable_analysis true` (PT), load the routed netlist with parasitics, constraints and the UPF, read switching activity with `read_saif` (PT) or `read_vcd` (PT), then run `update_power` (PT) and `report_power` (PT). The number is only as good as the activity behind it, so use a simulation of a real use case, not assumed toggle rates. Report by group to see where the power goes.
Glitch power is the energy burned by spurious transitions: when the inputs of a gate arrive at different times, its output can toggle several times before it settles. Each extra toggle charges and discharges real capacitance, so it costs as much as a useful one, and in deep arithmetic logic those wasted edges add up to a real share of the block power. You reduce it by balancing path delays, cutting logic depth with pipelining, and stopping datapaths from toggling when their result is not needed.
Average power sets battery life and steady temperature, but peak power sets what the package, the power grid and the regulator must survive in a single instant. A chip can meet its average budget and still fail when many blocks switch together or a domain wakes up and draws rush current. You plan and check both, because they break different things: average power drains the battery and heats the package, while a peak collapses the supply for a few nanoseconds and fails timing inside that window.
A supply set handle is a named slot on a UPF object, such as a power domain or a strategy, that stands for the supply set used there. ICC2 gives every domain primary, default_isolation and default_retention handles, and `associate_supply_set` (UPF) binds a real supply set such as SS_AON to a handle so both resolve to the same nets. Writing strategies against handles keeps the intent readable and lets you rebind a supply without rewriting every strategy.
IEEE 1801-2015 Annex D marks the PST commands `create_pst` (UPF), `add_pst_state` (UPF) and `add_port_state` (UPF), plus `set_domain_supply_net` (UPF) and the net-based isolation and retention supply options, as legacy, and names a replacement for each. The PST gives way to `add_power_state` (UPF), which defines states on supply sets and domains instead of in one flat table. Tools still accept both forms, and interviews ask about both.
Use `set_port_attributes` (UPF) with `-driver_supply` on inputs and `-receiver_supply` on outputs to say which supply set drives or reads a top-level port; `set_related_supply_net` (UPF) does the same job with supply nets. The tools compare that supply with the domain on the inside to decide whether isolation or a level shifter is needed. Get it wrong and you get missing cells on real crossings, or extra cells on crossings that do not exist.
Use `use_interface_cell` (UPF) to tie an isolation strategy, a level-shifter strategy, or one of each to the library cells you list. It is the only mapping command that can map a combined cell such as an enable level shifter, and in ICC2 it wins over `map_isolation_cell` (UPF) and `map_level_shifter_cell` (UPF) on the same strategy. Then check with `report_mv_lib_cells` (ICC2) that the forced cell really has the attributes the strategy needs.
A single-rail isolation cell has one power pin and runs from the rail of the domain it sits in, so it must sit where that rail stays on during shutdown. A dual-rail cell adds a backup power pin fed by an always-on supply, which lets it sit inside the domain that switches off and keep clamping. ICC2 picks between them from the cell rail information and the location of the strategy, and warns when the choice looks wrong.
They differ in how many retention control pins they have. A two-pin register has separate SAVE and RESTORE pins, a single-pin register uses one save_restore pin whose level selects the mode, and a zero-pin register has no control pin because its subordinate latch sits on an always-on supply. Zero-pin registers only retain if the clock and asynchronous pins are held inactive, so ICC2 inserts clamp cells that you must check.
Run a voltage-drop analysis with RedHawk Fusion, give each switch cell its on-resistance with `set_power_switch_resistance` (ICC2), then run `size_power_switches -max_irdrop` (ICC2) with your drop target. The tool swaps switches for same-footprint cells of a different Vt to meet the target, and skips any switch it cannot improve. You trade drop against switch leakage and area, so check both after the swap.
You close timing with a low-Vt-heavy mix, then swap cells on paths with spare slack to higher-Vt versions of the same footprint, which leak far less. The implementation tool does this during optimization, and PT does it again at signoff with `fix_eco_power` (PT), which backs out any change that creates a timing or DRC violation. You keep a slack guard band, so later crosstalk and variation do not eat the paths you just slowed.