How do you create a power domain in UPF, and what does the create_power_domain command actually do?
From PDVerse Low-Power Physical Design Mentor Guide, part of the pdVerse Mentor Guide
Short Answer
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).
Technical Explanation
- Top domain:
-elements {.}puts the current scope, and everything no other domain claims, into PD_MYCHIP. ICC2 also accepts the non-1801-include_scope(ICC2). - Child domains:
-elements {U_CPU}claims an instance and its descendants for PD_CPU. Names resolve relative to the current scope. - Primary supply: the IEEE 1801-2015 form is
-supply {primary SS_CPU}, which binds the domain to a supply set created earlier in the file. - Legacy form (still accepted by ICC2/PT):
set_domain_supply_net(UPF) with-primary_power_netand-primary_ground_net. - -atomic must be given when the domain is first defined; ICC2 will not turn an existing domain atomic later.
- Before
commit_upf(ICC2), every instance in the design must belong to some domain, or the intent is incomplete.
# [UPF] mychip.upf
create_power_domain PD_MYCHIP -elements {.} -supply {primary SS_AON}
create_power_domain PD_CPU -elements {U_CPU} -supply {primary SS_CPU}
create_power_domain PD_DSP -elements {U_DSP} -supply {primary SS_DSP}
create_power_domain PD_COP -elements {U_COP} -supply {primary SS_COP}
# [ICC2] icc2_shell
load_upf mychip.upf
commit_upf
report_power_domainsWhat To Check
- U_CPU, U_DSP and U_COP each sit in exactly one child domain.
- Top-level glue such as the power controller U_PC lands in PD_MYCHIP, so it stays on.
- Each domain shows a primary supply set bound to real nets.
- Element names were resolved in the scope you intended.
Command Checks & Actions
create_power_domain PD_CPU -elements {U_CPU} -supply {primary SS_CPU}Create a child domain and bind its primary supply set
load_upf mychip.upfRead the power intent into the block
commit_upfResolve the intent; every instance must already belong to a domain
report_power_domainsList each domain with its elements and supplies
report_power_domainCross-check the same domains in PrimeTime after load_upf
Healthy, Suspicious & Hard-stop Results
- Healthy (illustrative):
report_power_domainslists four domains: PD_MYCHIP with the top scope, and PD_CPU, PD_DSP and PD_COP with one instance each and a bound primary. - Suspicious (illustrative): A child domain holds the right instance, but its primary is still an unbound handle.
- Hard stop: load_upf errors on an element that does not exist in the current scope, or an instance belongs to no domain.
Common Mistake
The Trap: Creating PD_CPU as a normal domain, then trying to make it atomic later with create_power_domain PD_CPU -atomic -update (UPF) when a hierarchical flow needs it.
- ICC2 rejects it, because -atomic is only accepted on the first definition, so the block UPF has to be fixed at the source.
What The Interviewer Is Testing
- Do you know a domain is a logical grouping, not a cell or a floorplan region?
- Can you write the 1801-2015 supply binding and still read the legacy form?
- Do you verify with a report instead of trusting the UPF file?
Follow-up Question & Model Response
"What does report_power_domains tell you that reading the UPF does not?"
Candidate Model Response: It shows what the tool actually resolved, not what you meant to write. You see the real element list after scope resolution and the primary supply each domain ended up with. A typo in an instance path or a wrong scope shows up as an empty or unexpected element list. Reading the UPF only shows intent, and intent is where the bug lives.
Practical Example
Design Scenario: (illustrative) MYCHIP has four domains. PD_MYCHIP takes the top scope on VDD1p0 at 1.0 V, so U_PC stays on. PD_CPU holds U_CPU on VDD0p9 at 0.9 V and never switches. PD_DSP holds U_DSP on VDDdsp, and PD_COP holds U_COP on the switched rail VDD1p0_SW. After commit_upf, report_power_domains should list exactly those four, each child with one instance.
Low-Power & UPF Handbook
Master Low-Power VLSI & Multivoltage Design
Read the complete low-power guide library covering power domains, level shifters, isolation clamps, state retention, and UPF signoff verification.
Offline PDF Bundle
Want all 1109 questions offline?
Get the complete 4-book PDF bundle (PnR, STA, MMMC, Low Power) with a clickable table of contents - no ads, no internet needed.

Continue practising