|
61 | 61 |
|
62 | 62 |
|
63 | 63 | def flash_usage(port, build_dir): |
64 | | - """Return (used, region) bytes of the firmware flash region, or None if unknown.""" |
| 64 | + """Return (used, region) bytes of the firmware flash region, or (None, None) if unknown.""" |
65 | 65 | try: |
66 | 66 | with open(f"../ports/{port}/{build_dir}/firmware.size.json", "r") as f: |
67 | 67 | firmware = json.load(f) |
68 | 68 | return firmware["used_flash"], firmware["firmware_region"] |
69 | 69 | except FileNotFoundError: |
70 | | - return None |
| 70 | + return None, None |
71 | 71 |
|
72 | 72 |
|
73 | 73 | def c_array_bytes(path): |
@@ -157,10 +157,12 @@ def generate_translation(port, board, build_dir, language): |
157 | 157 | languages.remove(LANGUAGE_FIRST) |
158 | 158 | languages.insert(0, LANGUAGE_FIRST) |
159 | 159 |
|
160 | | - # Set after the first language when its flash usage is known and too tight to skip |
161 | | - # the other languages outright. |
162 | | - predict_flash = None |
163 | | - first_language_bytes = 0 |
| 160 | + # Set after the first language's build when its flash usage is known and too tight to |
| 161 | + # skip the other languages outright: the flash that build used, the flash the region |
| 162 | + # holds, and how many of the used bytes are translation data. |
| 163 | + baseline_flash = None |
| 164 | + flash_region = 0 |
| 165 | + baseline_translation_bytes = 0 |
164 | 166 |
|
165 | 167 | for language in languages: |
166 | 168 | bin_directory = "../bin/{board}/{language}".format(board=board, language=language) |
@@ -191,25 +193,25 @@ def generate_translation(port, board, build_dir, language): |
191 | 193 |
|
192 | 194 | artifacts = [os.path.join(build_dir, "firmware." + extension) for extension in extensions] |
193 | 195 |
|
194 | | - prediction = None |
195 | | - if predict_flash is not None and language != LANGUAGE_FIRST and not clean_build: |
| 196 | + predicted_flash = None |
| 197 | + if baseline_flash is not None and language != LANGUAGE_FIRST and not clean_build: |
196 | 198 | if generate_translation(board_info["port"], board, build_dir, language): |
197 | | - delta = ( |
| 199 | + translation_growth = ( |
198 | 200 | translation_bytes(board_info["port"], build_dir, language) |
199 | | - - first_language_bytes |
| 201 | + - baseline_translation_bytes |
200 | 202 | ) |
201 | | - predicted = predict_flash[0] + delta |
202 | | - fits = predicted + LANGUAGE_MARGIN <= predict_flash[1] |
| 203 | + predicted_flash = baseline_flash + translation_growth |
| 204 | + fits = predicted_flash + LANGUAGE_MARGIN <= flash_region |
203 | 205 | skip = fits and LANGUAGE_PREDICT == "skip" |
204 | | - prediction = predicted |
205 | 206 | print( |
206 | | - "Predict {board} for {language}: {predicted} of {region} bytes ({free} free, {delta:+d} vs {first}) -> {action}".format( |
| 207 | + "Predicted flash size for {board} {language}: {predicted} of {region} bytes" |
| 208 | + " ({free} free, {growth:+d} vs {first}) -> {action}".format( |
207 | 209 | board=board, |
208 | 210 | language=language, |
209 | | - predicted=predicted, |
210 | | - region=predict_flash[1], |
211 | | - free=predict_flash[1] - predicted, |
212 | | - delta=delta, |
| 211 | + predicted=predicted_flash, |
| 212 | + region=flash_region, |
| 213 | + free=flash_region - predicted_flash, |
| 214 | + growth=translation_growth, |
213 | 215 | first=LANGUAGE_FIRST, |
214 | 216 | action="skip" if skip else "build", |
215 | 217 | ), |
@@ -273,32 +275,33 @@ def generate_translation(port, board, build_dir, language): |
273 | 275 | print(make_result.stdout.decode("utf-8")) |
274 | 276 | print(other_output) |
275 | 277 |
|
276 | | - if prediction is not None and make_result.returncode == 0: |
277 | | - usage = flash_usage(board_info["port"], build_dir) |
278 | | - if usage is not None: |
| 278 | + if predicted_flash is not None and make_result.returncode == 0: |
| 279 | + actual_flash, _ = flash_usage(board_info["port"], build_dir) |
| 280 | + if actual_flash is not None: |
279 | 281 | print( |
280 | | - "Predict check {board} for {language}: predicted {predicted}, actual {actual}, error {error:+d}".format( |
| 282 | + "Flash size check {board} {language}: predicted {predicted}," |
| 283 | + " actual {actual}, error {error:+d}".format( |
281 | 284 | board=board, |
282 | 285 | language=language, |
283 | | - predicted=prediction, |
284 | | - actual=usage[0], |
285 | | - error=prediction - usage[0], |
| 286 | + predicted=predicted_flash, |
| 287 | + actual=actual_flash, |
| 288 | + error=predicted_flash - actual_flash, |
286 | 289 | ) |
287 | 290 | ) |
288 | 291 |
|
289 | 292 | # Flush so we will see something before 10 minutes has passed. |
290 | 293 | print(flush=True) |
291 | 294 |
|
292 | 295 | if (not build_all) and (language == LANGUAGE_FIRST) and (exit_status == 0): |
293 | | - usage = flash_usage(board_info["port"], build_dir) |
294 | | - if usage is None: |
| 296 | + used_flash, flash_region = flash_usage(board_info["port"], build_dir) |
| 297 | + if used_flash is None: |
295 | 298 | print("Flash usage unknown, building all languages") |
296 | | - elif usage[0] + LANGUAGE_THRESHOLD < usage[1]: |
| 299 | + elif used_flash + LANGUAGE_THRESHOLD < flash_region: |
297 | 300 | print("Skipping languages") |
298 | 301 | break |
299 | 302 | elif LANGUAGE_PREDICT != "off" and board_info["port"] != "zephyr-cp": |
300 | | - predict_flash = usage |
301 | | - first_language_bytes = translation_bytes( |
| 303 | + baseline_flash = used_flash |
| 304 | + baseline_translation_bytes = translation_bytes( |
302 | 305 | board_info["port"], build_dir, LANGUAGE_FIRST |
303 | 306 | ) |
304 | 307 |
|
|
0 commit comments