test_3.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import tempfile
  2. import time
  3. import pandas as pd
  4. import pickle
  5. from imc_utils.pps_e36311a import PPS_E36311A
  6. from imc_utils.smu_b2902a import SMU_B2902A
  7. from imc_utils.build_config.cortex_m33 import BuildConfigM33
  8. from imc_utils.build_config.test_env import TestEnv
  9. from imc_utils.serial_watch import SerialWatcher
  10. WORKSPACE_ROOT = "/home/ybkim/workspace/imc/imc_freertos_app_m33"
  11. NVM_RESET_BIN = f"{WORKSPACE_ROOT}/imc/utils/nvm_reset.elf"
  12. OPENOCD_SCRIPT = f"{WORKSPACE_ROOT}/imc_freertos_app_m33.cfg"
  13. def measure_original(benchmark, pps, smu):
  14. config = get_default_build_config()
  15. config.bench_name = benchmark
  16. print("\n\n===== measure original program =====\n\n")
  17. target_current = 0.1
  18. currs = measure(config, pps, smu, target_current)
  19. # with open("output/test_1_original.pickle", "wb") as f:
  20. # pickle.dump(currs, f)
  21. def measure_ckpt(benchmark, pps, smu: SMU_B2902A):
  22. config = get_default_build_config()
  23. config.bench_name = benchmark
  24. config.insert_compiler_checkpoints = True
  25. config.split_loop = True
  26. config.enable_adaptive_loop_pass_count = True
  27. config.use_checkpoint_voltage_check = True
  28. config.max_loop_ids = 15
  29. target_current = 0.02
  30. records = measure(config, pps, smu, target_current)
  31. measured_init_times = []
  32. for messages in records["debug_outputs"]:
  33. for message in messages:
  34. if message.startswith("cycle"):
  35. cycle = message.split()[1]
  36. cycle = int(cycle)
  37. freq = 50 * 1000 * 1000
  38. time = cycle / freq
  39. measured_init_times.append(time)
  40. print("\nmeasured init times:")
  41. print(measured_init_times)
  42. # with open("output/test_1_ckpt.pickle", "wb") as f:
  43. # pickle.dump(currs, f)
  44. def measure(config, pps: PPS_E36311A, smu: SMU_B2902A, target_current):
  45. env = program_with_config(config, pps, smu)
  46. target_iterations = 5
  47. benchmark = config.bench_name
  48. pps.set_voltage(3.3, 1)
  49. pps.set_current(target_current, 1)
  50. watcher = SerialWatcher(benchmark, target_iterations)
  51. print("\n\n===== start measuring =====\n\n")
  52. # smu.start_measure()
  53. env.resume_board(terminate=True)
  54. records = watcher.run()
  55. # result = smu.stop_measure()
  56. print("\n\n===== measure finished =====\n\n")
  57. records = pd.DataFrame(records)
  58. columns = ["bench_name", "time_taken", "outputs", "debug_outputs", "is_correct"]
  59. print(records[columns])
  60. return records
  61. # currs = pd.DataFrame(result)[0]
  62. # return currs
  63. def main():
  64. pps = PPS_E36311A()
  65. smu = SMU_B2902A(voltage=0, use_external_power=True)
  66. smu.set_current_limit(0.1)
  67. benchmarks = ["vFFT"]
  68. for benchmark in benchmarks:
  69. # measure_original(benchmark, pps, smu)
  70. measure_ckpt(benchmark, pps, smu)
  71. smu.power_off()
  72. def program_with_config(config, pps, smu):
  73. env = TestEnv(WORKSPACE_ROOT, NVM_RESET_BIN, OPENOCD_SCRIPT)
  74. smu.power_on()
  75. pps.set_voltage(3.3, 1)
  76. pps.set_current(0.1, 1)
  77. pps.output_on(1)
  78. time.sleep(1)
  79. print("\n===== build and program binary =====\n")
  80. with tempfile.TemporaryDirectory() as build_dir:
  81. binary = env.build_binary(config, build_dir)
  82. env.clear_nvm_and_load_binary(binary, resume=False)
  83. print("\n===== program finished =====\n")
  84. return env
  85. def get_default_build_config():
  86. config = BuildConfigM33()
  87. config.insert_compiler_checkpoints = False
  88. config.enable_extension = True
  89. config.use_checkpoint_pass_counter = False
  90. config.use_checkpoint_voltage_check = False
  91. config.bench_infinite_loop = True
  92. config.print_recovery_message = True
  93. config.split_loop = False
  94. config.enable_static_loop_pass_count = False
  95. config.enable_adaptive_loop_pass_count = False
  96. config.print_stats = False
  97. config.custom_unroll = False
  98. config.bench_repeat_count = 10
  99. config.print_init_time = True
  100. return config
  101. if __name__ == "__main__":
  102. main()