Dynamic power is P = alpha x C x V squared x f. Every symbol below is a stated EXAMPLE parameter, never a real-process figure.
Alpha is the fraction of capacitance toggling per cycle. C is the switched capacitance, V the supply, and f the clock rate.
Symbol | Meaning | EXAMPLE value |
|---|---|---|
| Activity: toggles per cycle as a fraction. | 0.2 |
| Switched capacitance. | 50 pF |
| Supply voltage. | 0.9 V |
| Clock frequency. | 1 GHz |
P |
| 8.1 mW |
Substitute step by step and keep the units. The calc block below is the reference the program rechecks.
EXAMPLE parameters (not real figures): alpha = 0.2, C = 50 pF, V = 0.9 V, f = 1 GHz
V^2 = 0.9 x 0.9 = 0.81
C x f = 50e-12 x 1e9 = 0.05
P = 0.2 x 0.05 x 0.81 = 0.2 x 0.0405 = 0.0081 W = 8.1 mW
half voltage (V = 0.45 V): V^2 = 0.2025
P = 0.2 x 0.05 x 0.2025 = 0.002025 W = 2.025 mW = 0.25 x 8.1 mW
gated activity (alpha = 0.05): P = 0.05 x 0.05 x 0.81 = 0.002025 W = 2.025 mW
double frequency (f = 2 GHz): C x f = 0.1, P = 0.2 x 0.1 x 0.81 = 0.0162 W = 16.2 mWVoltage is quadratic: halving it quarters power, before timing is considered. Activity and frequency are linear: halving either halves power.
Capacitance follows the netlist: smaller cells and fewer toggled nets lower C. That is where synthesis earns its savings, and results vary by design.
Lever | Scaling | EXAMPLE effect on 8.1 mW |
|---|---|---|
Halve voltage | Quadratic. | 2.025 mW, one quarter. |
Quarter activity | Linear. | 2.025 mW, one quarter. |
Double frequency | Linear. | 16.2 mW, double. |
The program below recomputes every hand-worked number from the same EXAMPLE parameters. Its five self-checks pin the base case, the voltage, activity, and frequency variants, and the quarter-power ratio.
import sys
def dyn_power(alpha, c_f, v, f_hz):
return alpha * c_f * v * v * f_hz
C = 50e-12
checks = [
(dyn_power(0.2, C, 0.9, 1e9), 0.0081),
(dyn_power(0.2, C, 0.45, 1e9), 0.002025),
(dyn_power(0.05, C, 0.9, 1e9), 0.002025),
(dyn_power(0.2, C, 0.9, 2e9), 0.0162),
(dyn_power(0.2, C, 0.45, 1e9) / dyn_power(0.2, C, 0.9, 1e9), 0.25),
]
for i in range(len(checks)):
got, want = checks[i]
if abs(got - want) > 1e-9:
print("FAIL: check " + str(i + 1) + " got " + str(got) + " want " + str(want))
sys.exit(1)
print("PASS: dynamic power agrees with hand arithmetic on 5 checks")It quarters. The V squared term goes from 0.81 to 0.2025, so 8.1 mW becomes 2.025 mW.
The code agrees with the hand arithmetic. It leaves open whether the EXAMPLE parameters match any real design.