@@ -85,12 +85,6 @@ enum e_cost_methods {
85
85
CHECK
86
86
};
87
87
88
- struct t_placer_statistics {
89
- double av_cost, av_bb_cost, av_timing_cost,
90
- sum_of_squares;
91
- int success_sum;
92
- };
93
-
94
88
constexpr float INVALID_DELAY = std::numeric_limits<float >::quiet_NaN();
95
89
constexpr float INVALID_COST = std::numeric_limits<double >::quiet_NaN();
96
90
@@ -373,26 +367,18 @@ static void recompute_costs_from_scratch(const t_placer_opts& placer_opts,
373
367
const PlacerCriticalities* criticalities,
374
368
t_placer_costs* costs);
375
369
376
- static void calc_placer_stats (t_placer_statistics& stats, double & std_dev, const t_placer_costs& costs);
377
-
378
370
static void generate_post_place_timing_reports (const t_placer_opts& placer_opts,
379
371
const t_analysis_opts& analysis_opts,
380
372
const SetupTimingInfo& timing_info,
381
373
const PlacementDelayCalculator& delay_calc);
382
374
383
375
static void print_place_status_header ();
384
- static void print_place_status (const size_t num_temps,
385
- const float elapsed_sec,
386
- const float t,
387
- const float alpha,
376
+ static void print_place_status (const t_annealing_state& state,
388
377
const t_placer_statistics& stats,
389
- const float cpd,
390
- const float sTNS ,
391
- const float sWNS ,
392
- const float acc_rate,
393
- const float std_dev,
394
- const float rlim,
395
- const float crit_exponent,
378
+ float elapsed_sec,
379
+ float cpd,
380
+ float sTNS ,
381
+ float sWNS ,
396
382
size_t tot_moves);
397
383
static void print_resources_utilization ();
398
384
@@ -431,7 +417,6 @@ void try_place(const t_placer_opts& placer_opts,
431
417
float sTNS = NAN;
432
418
float sWNS = NAN;
433
419
434
- double std_dev;
435
420
char msg[vtr::bufsize];
436
421
t_placer_statistics stats;
437
422
@@ -697,10 +682,6 @@ void try_place(const t_placer_opts& placer_opts,
697
682
placer_opts.place_algorithm );
698
683
699
684
tot_iter += state.move_lim ;
700
-
701
- state.success_rate = ((float )stats.success_sum ) / state.move_lim ;
702
- calc_placer_stats (stats, std_dev, costs);
703
-
704
685
++state.num_temps ;
705
686
706
687
if (placer_opts.place_algorithm .is_timing_driven ()) {
@@ -709,12 +690,7 @@ void try_place(const t_placer_opts& placer_opts,
709
690
sWNS = timing_info->setup_worst_negative_slack ();
710
691
}
711
692
712
- print_place_status (state.num_temps ,
713
- temperature_timer.elapsed_sec (),
714
- state.t , state.alpha ,
715
- stats,
716
- critical_path.delay (), sTNS , sWNS ,
717
- state.success_rate , std_dev, state.rlim , state.crit_exponent , tot_iter);
693
+ print_place_status (state, stats, temperature_timer.elapsed_sec (), critical_path.delay (), sTNS , sWNS , tot_iter);
718
694
719
695
sprintf (msg, " Cost: %g BB Cost %g TD Cost %g Temperature: %g" ,
720
696
costs.cost , costs.bb_cost , costs.timing_cost , state.t );
@@ -725,7 +701,7 @@ void try_place(const t_placer_opts& placer_opts,
725
701
print_clb_placement (" first_iteration_clb_placement.echo" );
726
702
}
727
703
#endif
728
- } while (state.outer_loop_update (costs, placer_opts, annealing_sched));
704
+ } while (state.outer_loop_update (stats. success_rate , costs, placer_opts, annealing_sched));
729
705
/* Outer loop of the simmulated annealing ends */
730
706
731
707
#ifdef ENABLE_ANALYTIC_PLACE
@@ -770,21 +746,13 @@ void try_place(const t_placer_opts& placer_opts,
770
746
tot_iter += state.move_lim ;
771
747
++state.num_temps ;
772
748
773
- state.success_rate = ((float )stats.success_sum ) / state.move_lim ;
774
- calc_placer_stats (stats, std_dev, costs);
775
-
776
749
if (placer_opts.place_quench_algorithm .is_timing_driven ()) {
777
750
critical_path = timing_info->least_slack_critical_path ();
778
751
sTNS = timing_info->setup_total_negative_slack ();
779
752
sWNS = timing_info->setup_worst_negative_slack ();
780
753
}
781
754
782
- float quench_elapsed_sec = temperature_timer.elapsed_sec ();
783
- print_place_status (state.num_temps ,
784
- quench_elapsed_sec,
785
- state.t , state.alpha , stats,
786
- critical_path.delay (), sTNS , sWNS ,
787
- state.success_rate , std_dev, state.rlim , state.crit_exponent , tot_iter);
755
+ print_place_status (state, stats, temperature_timer.elapsed_sec (), critical_path.delay (), sTNS , sWNS , tot_iter);
788
756
}
789
757
auto post_quench_timing_stats = timing_ctx.stats ;
790
758
@@ -938,11 +906,7 @@ static void placement_inner_loop(const t_annealing_state* state,
938
906
939
907
int inner_placement_save_count = 0 ; // How many times have we dumped placement to a file this temperature?
940
908
941
- stats->av_cost = 0 .;
942
- stats->av_bb_cost = 0 .;
943
- stats->av_timing_cost = 0 .;
944
- stats->sum_of_squares = 0 .;
945
- stats->success_sum = 0 ;
909
+ stats->reset ();
946
910
947
911
inner_crit_iter_count = 1 ;
948
912
@@ -963,11 +927,7 @@ static void placement_inner_loop(const t_annealing_state* state,
963
927
964
928
if (swap_result == ACCEPTED) {
965
929
/* Move was accepted. Update statistics that are useful for the annealing schedule. */
966
- stats->success_sum ++;
967
- stats->av_cost += costs->cost ;
968
- stats->av_bb_cost += costs->bb_cost ;
969
- stats->av_timing_cost += costs->timing_cost ;
970
- stats->sum_of_squares += (costs->cost ) * (costs->cost );
930
+ stats->single_swap_update (*costs);
971
931
num_swap_accepted++;
972
932
} else if (swap_result == ABORTED) {
973
933
num_swap_aborted++;
@@ -1025,6 +985,9 @@ static void placement_inner_loop(const t_annealing_state* state,
1025
985
++inner_placement_save_count;
1026
986
}
1027
987
}
988
+
989
+ /* Calculate the success_rate and std_dev of the costs. */
990
+ stats->calc_iteration_stats (*costs, state->move_lim );
1028
991
}
1029
992
1030
993
static void recompute_costs_from_scratch (const t_placer_opts& placer_opts,
@@ -2653,20 +2616,6 @@ static void free_try_swap_arrays() {
2653
2616
g_vpr_ctx.mutable_placement ().compressed_block_grids .clear ();
2654
2617
}
2655
2618
2656
- static void calc_placer_stats (t_placer_statistics& stats, double & std_dev, const t_placer_costs& costs) {
2657
- if (stats.success_sum == 0 ) {
2658
- stats.av_cost = costs.cost ;
2659
- stats.av_bb_cost = costs.bb_cost ;
2660
- stats.av_timing_cost = costs.timing_cost ;
2661
- } else {
2662
- stats.av_cost /= stats.success_sum ;
2663
- stats.av_bb_cost /= stats.success_sum ;
2664
- stats.av_timing_cost /= stats.success_sum ;
2665
- }
2666
-
2667
- std_dev = get_std_dev (stats.success_sum , stats.sum_of_squares , stats.av_cost );
2668
- }
2669
-
2670
2619
static void generate_post_place_timing_reports (const t_placer_opts& placer_opts,
2671
2620
const t_analysis_opts& analysis_opts,
2672
2621
const SetupTimingInfo& timing_info,
@@ -2700,18 +2649,12 @@ static void print_place_status_header() {
2700
2649
VTR_LOG (" ---- ------ ------- ------- ---------- ---------- ------- ---------- -------- ------- ------- ------ -------- --------- ------\n " );
2701
2650
}
2702
2651
2703
- static void print_place_status (const size_t num_temps,
2704
- const float elapsed_sec,
2705
- const float t,
2706
- const float alpha,
2652
+ static void print_place_status (const t_annealing_state& state,
2707
2653
const t_placer_statistics& stats,
2708
- const float cpd,
2709
- const float sTNS ,
2710
- const float sWNS ,
2711
- const float acc_rate,
2712
- const float std_dev,
2713
- const float rlim,
2714
- const float crit_exponent,
2654
+ float elapsed_sec,
2655
+ float cpd,
2656
+ float sTNS ,
2657
+ float sWNS ,
2715
2658
size_t tot_moves) {
2716
2659
VTR_LOG (
2717
2660
" %4zu "
@@ -2720,16 +2663,16 @@ static void print_place_status(const size_t num_temps,
2720
2663
" %7.3f %10.2f %-10.5g "
2721
2664
" %7.3f % 10.3g % 8.3f "
2722
2665
" %7.3f %7.4f %6.1f %8.2f" ,
2723
- num_temps,
2666
+ state. num_temps ,
2724
2667
elapsed_sec,
2725
- t,
2668
+ state. t ,
2726
2669
stats.av_cost , stats.av_bb_cost , stats.av_timing_cost ,
2727
2670
1e9 * cpd, 1e9 * sTNS , 1e9 * sWNS ,
2728
- acc_rate, std_dev, rlim, crit_exponent);
2671
+ stats. success_rate , stats. std_dev , state. rlim , state. crit_exponent );
2729
2672
2730
2673
pretty_print_uint (" " , tot_moves, 9 , 3 );
2731
2674
2732
- VTR_LOG (" %6.3f\n " , alpha);
2675
+ VTR_LOG (" %6.3f\n " , state. alpha );
2733
2676
fflush (stdout);
2734
2677
}
2735
2678
0 commit comments