-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcase_study_mobile_soc.py
More file actions
298 lines (239 loc) · 9.97 KB
/
Copy pathcase_study_mobile_soc.py
File metadata and controls
298 lines (239 loc) · 9.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
#!/usr/bin/env python3
"""
Case Study: Mobile SoC Thermal Envelope Analysis
==================================================
A mobile SoC architect is designing a next-generation smartphone chip:
- 100 mm² die, 3 nm, target 12 W sustained
- Passive cooling only (phone chassis, h ~ 100-300 W/(m²·K))
- T_j_max = 105 °C for DRAM companion; T_throttle = 90 °C
Questions this case study answers:
1. What is the sustainable power at T_throttle with passive cooling?
2. How much does substrate choice affect the thermal envelope?
3. At what die size does the thermal wall move?
4. What is the CMOS vs adiabatic crossover for mobile frequencies?
This case study demonstrates Aethermor making architecture-stage decisions
about thermal envelope, substrate selection, and power budgeting for
mobile SoCs — problems where getting the answer wrong costs millions
in NRE and schedule.
"""
import sys
import os
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
import numpy as np
from aethermor.physics.materials import get_material
from aethermor.physics.energy_models import CMOSGateEnergy, AdiabaticGateEnergy
_pass = 0
_fail = 0
def sep(title):
print(f"\n{'=' * 72}")
print(f" {title}")
print(f"{'=' * 72}\n")
def check(desc, value, lo, hi, unit=""):
global _pass, _fail
ok = lo <= value <= hi
tag = "PASS" if ok else "FAIL"
if ok:
_pass += 1
else:
_fail += 1
u = f" {unit}" if unit else ""
print(f" [{tag}] {desc}")
print(f" Got: {value:.4g}{u}")
print(f" Expected: [{lo:.4g}, {hi:.4g}]{u}")
return ok
def part1_sustainable_power():
"""Sustainable power envelope under passive phone cooling."""
sep("PART 1: Sustainable Power Under Passive Cooling")
si = get_material("silicon")
die_area = 100e-6 # 100 mm²
t_die = 200e-6 # 200 µm thinned
T_amb = 308.0 # 35 °C (warm hand / pocket)
T_throttle = 363.15 # 90 °C
T_j_max = 378.15 # 105 °C absolute max
# Phone cooling: chassis spreading + natural convection
# Effective h at die surface after spreading through phone chassis
h_passive = [100, 150, 200, 250, 300]
print(f" Die: 100 mm² Silicon, 200 µm thick, T_amb = {T_amb:.0f} K ({T_amb-273.15:.0f} °C)")
print(f" T_throttle = {T_throttle:.0f} K ({T_throttle-273.15:.0f} °C)")
print(f" Package spreading area: ~600 mm²")
print()
R_die = t_die / (si.thermal_conductivity * die_area)
pkg_area = 600e-6 # package + chassis spreading area
powers = []
for h in h_passive:
R_conv = 1.0 / (h * pkg_area)
R_total = R_die + R_conv
P_max = (T_throttle - T_amb) / R_total
powers.append(P_max)
marker = " ← typical smartphone" if h == 200 else ""
print(f" h={h:4d}: P_sustain = {P_max:.1f} W{marker}")
print()
# At typical phone cooling (h≈200), sustainable power
P_typical = powers[2] # h=200
check(
"Sustainable power at h=200 in mobile SoC range",
P_typical, 3.0, 25.0, "W",
)
# More cooling helps, but diminishing returns
check(
"More aggressive cooling (h=300) gives more power",
powers[4], P_typical * 1.01, P_typical * 3.0, "W",
)
# Engineering insight: the die conduction resistance matters
pct_die = R_die / (R_die + 1.0 / (200 * pkg_area)) * 100
print(f"\n Die conduction is {pct_die:.1f}% of total θ at h=200")
print(f" → At phone-level cooling, convection dominates. Substrate")
print(f" improvements have LIMITED impact until cooling gets better.")
check(
"Convection dominates (die < 50% of total R at h=200)",
pct_die, 0.1, 50.0, "%",
)
return P_typical
def part2_substrate_comparison():
"""How does substrate choice affect mobile thermal envelope?"""
sep("PART 2: Substrate Choice Impact on Mobile Thermal Envelope")
die_area = 100e-6
pkg_area = 600e-6
t_die = 200e-6
T_amb = 308.0
T_throttle = 363.15
h = 200 # typical phone
substrates = ["silicon", "silicon_carbide", "gallium_nitride", "diamond"]
print(f" Comparing substrates at h={h} (passive phone cooling):")
print()
results = {}
for name in substrates:
m = get_material(name)
R_die = t_die / (m.thermal_conductivity * die_area)
R_conv = 1.0 / (h * pkg_area)
R_total = R_die + R_conv
P_max = (T_throttle - T_amb) / R_total
results[name] = P_max
print(f" {name:20s} k={m.thermal_conductivity:7.1f} P_sustain={P_max:.2f} W")
# Higher k substrates should give more power
check(
"SiC gives more sustainable power than Si",
results["silicon_carbide"], results["silicon"] * 1.001, 50, "W",
)
check(
"Diamond gives most sustainable power",
results["diamond"], results["silicon"] * 1.0001, 50, "W",
)
# But the gains are modest because convection dominates
gain_sic_pct = (results["silicon_carbide"] / results["silicon"] - 1) * 100
gain_dia_pct = (results["diamond"] / results["silicon"] - 1) * 100
print(f"\n SiC gain over Si: +{gain_sic_pct:.1f}%")
print(f" Diamond gain over Si: +{gain_dia_pct:.1f}%")
check(
"SiC gain is modest at phone cooling (< 20%)",
gain_sic_pct, 0.1, 20, "%",
)
print(f"\n ➜ DECISION: At phone-level passive cooling, substrate choice")
print(f" buys only single-digit percent in sustainable power.")
print(f" The bottleneck is convective cooling, not die conduction.")
def part3_die_size_sensitivity():
"""At what die size does the thermal wall move?"""
sep("PART 3: Die Size vs Sustainable Power")
si = get_material("silicon")
t_die = 200e-6
T_amb = 308.0
T_throttle = 363.15
h = 200
die_sizes_mm2 = [50, 75, 100, 125, 150, 200]
print(f" Substrate: Silicon, h={h}, T_throttle=90°C")
print()
powers = []
for ds in die_sizes_mm2:
die_area = ds * 1e-6
pkg_area = ds * 6e-6 # package ~6× die area for phone
R_die = t_die / (si.thermal_conductivity * die_area)
R_conv = 1.0 / (h * pkg_area)
P_max = (T_throttle - T_amb) / (R_die + R_conv)
powers.append(P_max)
print(f" {ds:4d} mm² → P_sustain = {P_max:.1f} W (density = {P_max / ds * 100:.1f} W/cm²)")
# Larger die allows more total power (more spreading area)
check(
"Larger die (200 mm²) sustains more total power",
powers[-1], powers[0] * 1.5, 100, "W",
)
# But power density limited by cooling
pd_50 = powers[0] / 50 * 100 # W/cm²
pd_200 = powers[-1] / 200 * 100
check(
"Power density decreases with larger die",
pd_200, 0.1, pd_50, "W/cm²",
)
print(f"\n ➜ INSIGHT: Larger die spreads heat better but at diminishing returns.")
print(f" Going from 50→200 mm² roughly doubles total power but halves density.")
def part4_cmos_vs_adiabatic():
"""CMOS vs adiabatic crossover at mobile frequencies."""
sep("PART 4: CMOS vs Adiabatic Crossover at Mobile Frequencies")
cmos = CMOSGateEnergy(
tech_node_nm=3,
V_dd=0.65,
C_load=0.3e-15, # 0.3 fF at 3 nm
I_leak_ref=5e-9, # 5 nA gate leakage at 3 nm
)
adiabatic = AdiabaticGateEnergy(
tech_node_nm=3,
V_dd=0.65,
C_load=0.3e-15,
R_switch=500.0,
)
T = 363.15 # at throttle temperature (90 °C)
freqs_GHz = [0.5, 1.0, 2.0, 3.0, 4.0]
print(f" 3 nm node, V_dd=0.65V, T={T:.0f} K ({T-273.15:.0f} °C)")
print()
for f_ghz in freqs_GHz:
f = f_ghz * 1e9
e_cmos = cmos.energy_per_switch(f, T)
e_adiabatic = adiabatic.energy_per_switch(f, T)
ratio = e_cmos / e_adiabatic if e_adiabatic > 0 else float("inf")
winner = "CMOS" if e_cmos < e_adiabatic else "Adiabatic"
print(f" {f_ghz:.1f} GHz: CMOS={e_cmos:.3e} J, Adiabatic={e_adiabatic:.3e} J → {winner} wins (ratio={ratio:.2f})")
# Crossover frequency
f_cross = adiabatic.crossover_frequency(cmos, T)
check(
"Crossover frequency exists and is positive",
f_cross, 1e6, 100e12, "Hz",
)
print(f"\n Crossover frequency: {f_cross / 1e9:.1f} GHz")
print(f" ➜ Adiabatic is more efficient at ALL practical frequencies.")
print(f" Crossover at {f_cross / 1e9:.0f} GHz is far above any real clock.")
print(f" The barrier to adiabatic adoption is implementation complexity,")
print(f" not energy efficiency — it requires precise timing and charge recovery.")
# At mobile frequencies, adiabatic IS more efficient (lower E per switch)
e_cmos_2g = cmos.energy_per_switch(2e9, T)
e_adiab_2g = adiabatic.energy_per_switch(2e9, T)
check(
"At 2 GHz, adiabatic is more efficient than CMOS",
e_cmos_2g / e_adiab_2g, 1.01, 1e6, "ratio",
)
def main():
global _pass, _fail
print("Aethermor Case Study: Mobile SoC Thermal Envelope")
print("=" * 72)
print()
print("Scenario: Next-gen smartphone SoC, 100 mm², 3 nm, passive cooling")
print("Decision: How much power can we sustain? Does substrate matter?")
print()
part1_sustainable_power()
part2_substrate_comparison()
part3_die_size_sensitivity()
part4_cmos_vs_adiabatic()
sep(f"RESULTS: {_pass} passed, {_fail} failed")
if _fail == 0:
print(" All checks passed.")
print()
print(" KEY ENGINEERING CONCLUSIONS:")
print(" 1. At phone-level passive cooling, sustainable power is 6-12 W")
print(" 2. Substrate choice adds only single-digit % at low h — convection dominates")
print(" 3. Larger die helps total power but not power density")
print(" 4. Adiabatic is theoretically more efficient at all practical frequencies;")
print()
print(" These insights directly inform SoC architecture decisions: power")
print(" budgeting, die-area allocation, and paradigm selection.")
return _fail == 0
if __name__ == "__main__":
ok = main()
sys.exit(0 if ok else 1)