Skip to content

Commit 6db42e9

Browse files
added const BlkLocRegistry& member variable to VprTimingGraphResolver
1 parent 1ed4704 commit 6db42e9

File tree

8 files changed

+84
-53
lines changed

8 files changed

+84
-53
lines changed

vpr/src/analysis/timing_reports.cpp

+14-4
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@
1212

1313
#include "VprTimingGraphResolver.h"
1414

15-
void generate_setup_timing_stats(const std::string& prefix, const SetupTimingInfo& timing_info, const AnalysisDelayCalculator& delay_calc, const t_analysis_opts& analysis_opts, bool is_flat) {
15+
void generate_setup_timing_stats(const std::string& prefix,
16+
const SetupTimingInfo& timing_info,
17+
const AnalysisDelayCalculator& delay_calc,
18+
const t_analysis_opts& analysis_opts,
19+
bool is_flat,
20+
const BlkLocRegistry& blk_loc_registry) {
1621
auto& timing_ctx = g_vpr_ctx.timing();
1722
auto& atom_ctx = g_vpr_ctx.atom();
1823

1924
print_setup_timing_summary(*timing_ctx.constraints, *timing_info.setup_analyzer(), "Final ", analysis_opts.write_timing_summary);
2025

21-
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, delay_calc, is_flat);
26+
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, delay_calc, is_flat, blk_loc_registry);
2227
resolver.set_detail_level(analysis_opts.timing_report_detail);
2328

2429
tatum::TimingReporter timing_reporter(resolver, *timing_ctx.graph, *timing_ctx.constraints);
@@ -32,13 +37,18 @@ void generate_setup_timing_stats(const std::string& prefix, const SetupTimingInf
3237
timing_reporter.report_unconstrained_setup(prefix + "report_unconstrained_timing.setup.rpt", *timing_info.setup_analyzer());
3338
}
3439

35-
void generate_hold_timing_stats(const std::string& prefix, const HoldTimingInfo& timing_info, const AnalysisDelayCalculator& delay_calc, const t_analysis_opts& analysis_opts, bool is_flat) {
40+
void generate_hold_timing_stats(const std::string& prefix,
41+
const HoldTimingInfo& timing_info,
42+
const AnalysisDelayCalculator& delay_calc,
43+
const t_analysis_opts& analysis_opts,
44+
bool is_flat,
45+
const BlkLocRegistry& blk_loc_registry) {
3646
auto& timing_ctx = g_vpr_ctx.timing();
3747
auto& atom_ctx = g_vpr_ctx.atom();
3848

3949
print_hold_timing_summary(*timing_ctx.constraints, *timing_info.hold_analyzer(), "Final ");
4050

41-
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, delay_calc, is_flat);
51+
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, delay_calc, is_flat, blk_loc_registry);
4252
resolver.set_detail_level(analysis_opts.timing_report_detail);
4353

4454
tatum::TimingReporter timing_reporter(resolver, *timing_ctx.graph, *timing_ctx.constraints);

vpr/src/analysis/timing_reports.h

+15-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,20 @@
55
#include "AnalysisDelayCalculator.h"
66
#include "vpr_types.h"
77

8-
void generate_setup_timing_stats(const std::string& prefix, const SetupTimingInfo& timing_info, const AnalysisDelayCalculator& delay_calc, const t_analysis_opts& report_detail, bool is_flat);
9-
void generate_hold_timing_stats(const std::string& prefix, const HoldTimingInfo& timing_info, const AnalysisDelayCalculator& delay_calc, const t_analysis_opts& report_detail, bool is_flat);
8+
class BlkLocRegistry;
9+
10+
void generate_setup_timing_stats(const std::string& prefix,
11+
const SetupTimingInfo& timing_info,
12+
const AnalysisDelayCalculator& delay_calc,
13+
const t_analysis_opts& report_detail,
14+
bool is_flat,
15+
const BlkLocRegistry& blk_loc_registry);
16+
17+
void generate_hold_timing_stats(const std::string& prefix,
18+
const HoldTimingInfo& timing_info,
19+
const AnalysisDelayCalculator& delay_calc,
20+
const t_analysis_opts& report_detail,
21+
bool is_flat,
22+
const BlkLocRegistry& blk_loc_registry);
1023

1124
#endif

vpr/src/base/vpr_api.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -1477,6 +1477,7 @@ void vpr_analysis(const Netlist<>& net_list,
14771477
bool is_flat) {
14781478
auto& route_ctx = g_vpr_ctx.routing();
14791479
auto& atom_ctx = g_vpr_ctx.atom();
1480+
const auto& blk_loc_registry = g_vpr_ctx.placement().blk_loc_registry();
14801481

14811482
if (route_ctx.route_trees.empty()) {
14821483
VPR_FATAL_ERROR(VPR_ERROR_ANALYSIS, "No routing loaded -- can not perform post-routing analysis");
@@ -1497,8 +1498,7 @@ void vpr_analysis(const Netlist<>& net_list,
14971498
//Load the net delays
14981499

14991500
NetPinsMatrix<float> net_delay = make_net_pins_matrix<float>(net_list);
1500-
load_net_delay_from_routing(net_list,
1501-
net_delay);
1501+
load_net_delay_from_routing(net_list, net_delay);
15021502

15031503
//Do final timing analysis
15041504
auto analysis_delay_calc = std::make_shared<AnalysisDelayCalculator>(atom_ctx.nlist, atom_ctx.lookup, net_delay, vpr_setup.RouterOpts.flat_routing);
@@ -1513,10 +1513,10 @@ void vpr_analysis(const Netlist<>& net_list,
15131513

15141514
//Timing stats
15151515
VTR_LOG("\n");
1516-
generate_hold_timing_stats(/*prefix=*/"", *timing_info,
1517-
*analysis_delay_calc, vpr_setup.AnalysisOpts, vpr_setup.RouterOpts.flat_routing);
1518-
generate_setup_timing_stats(/*prefix=*/"", *timing_info,
1519-
*analysis_delay_calc, vpr_setup.AnalysisOpts, vpr_setup.RouterOpts.flat_routing);
1516+
generate_hold_timing_stats(/*prefix=*/"", *timing_info, *analysis_delay_calc,
1517+
vpr_setup.AnalysisOpts, vpr_setup.RouterOpts.flat_routing, blk_loc_registry);
1518+
generate_setup_timing_stats(/*prefix=*/"", *timing_info, *analysis_delay_calc,
1519+
vpr_setup.AnalysisOpts, vpr_setup.RouterOpts.flat_routing, blk_loc_registry);
15201520

15211521
//Write the post-synthesis netlist
15221522
if (vpr_setup.AnalysisOpts.gen_post_synthesis_netlist) {

vpr/src/place/place.cpp

+34-32
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ static void generate_post_place_timing_reports(const t_placer_opts& placer_opts,
317317
const t_analysis_opts& analysis_opts,
318318
const SetupTimingInfo& timing_info,
319319
const PlacementDelayCalculator& delay_calc,
320-
bool is_flat);
320+
bool is_flat,
321+
const BlkLocRegistry& blk_loc_registry);
321322

322323
//calculate the agent's reward and the total process outcome
323324
static void calculate_reward_and_process_outcome(const t_placer_opts& placer_opts,
@@ -437,7 +438,7 @@ void try_place(const Netlist<>& net_list,
437438

438439
PlacerContext placer_ctx;
439440
auto& place_move_ctx = placer_ctx.mutable_move();
440-
auto& place_loc_vars = placer_ctx.mutable_blk_loc_registry();
441+
auto& blk_loc_registry = placer_ctx.mutable_blk_loc_registry();
441442
const auto& p_timing_ctx = placer_ctx.timing();
442443
const auto& p_runtime_ctx = placer_ctx.runtime();
443444

@@ -453,7 +454,7 @@ void try_place(const Netlist<>& net_list,
453454
normalize_noc_cost_weighting_factor(const_cast<t_noc_opts&>(noc_opts));
454455
}
455456

456-
initial_placement(placer_opts, placer_opts.constraints_file.c_str(), noc_opts, place_loc_vars);
457+
initial_placement(placer_opts, placer_opts.constraints_file.c_str(), noc_opts, blk_loc_registry);
457458

458459
//create the move generator based on the chosen strategy
459460
auto [move_generator, move_generator2] = create_move_generators(placer_ctx, placer_opts, move_lim, noc_opts.noc_centroid_weight);
@@ -470,18 +471,18 @@ void try_place(const Netlist<>& net_list,
470471
* Most of anneal is disabled later by setting initial temperature to 0 and only further optimizes in quench
471472
*/
472473
if (placer_opts.enable_analytic_placer) {
473-
AnalyticPlacer{place_loc_vars}.ap_place();
474+
AnalyticPlacer{blk_loc_registry}.ap_place();
474475
}
475476

476477
#endif /* ENABLE_ANALYTIC_PLACE */
477478

478479
// Update physical pin values
479480
for (const ClusterBlockId block_id : cluster_ctx.clb_nlist.blocks()) {
480-
place_sync_external_block_connections(block_id, place_loc_vars);
481+
place_sync_external_block_connections(block_id, blk_loc_registry);
481482
}
482483

483484
const int width_fac = placer_opts.place_chan_width;
484-
init_draw_coords((float)width_fac, place_loc_vars);
485+
init_draw_coords((float)width_fac, blk_loc_registry);
485486

486487
/* Allocated here because it goes into timing critical code where each memory allocation is expensive */
487488
IntraLbPbPinLookup pb_gpin_lookup(device_ctx.logical_block_types);
@@ -654,7 +655,7 @@ void try_place(const Netlist<>& net_list,
654655
std::string filename = vtr::string_fmt("placement_%03d_%03d.place", 0,
655656
0);
656657
VTR_LOG("Saving initial placement to file: %s\n", filename.c_str());
657-
print_place(nullptr, nullptr, filename.c_str(), place_loc_vars.block_locs());
658+
print_place(nullptr, nullptr, filename.c_str(), blk_loc_registry.block_locs());
658659
}
659660

660661
int first_move_lim = get_initial_move_lim(placer_opts, annealing_sched);
@@ -759,7 +760,7 @@ void try_place(const Netlist<>& net_list,
759760

760761
if (placer_opts.place_checkpointing
761762
&& agent_state == e_agent_state::LATE_IN_THE_ANNEAL) {
762-
save_placement_checkpoint_if_needed(place_loc_vars.block_locs(),
763+
save_placement_checkpoint_if_needed(blk_loc_registry.block_locs(),
763764
placement_checkpoint,
764765
timing_info, costs, critical_path.delay());
765766
}
@@ -891,7 +892,7 @@ void try_place(const Netlist<>& net_list,
891892
std::string filename = vtr::string_fmt("placement_%03d_%03d.place",
892893
state.num_temps + 1, 0);
893894
VTR_LOG("Saving final placement to file: %s\n", filename.c_str());
894-
print_place(nullptr, nullptr, filename.c_str(), place_loc_vars.block_locs());
895+
print_place(nullptr, nullptr, filename.c_str(), blk_loc_registry.block_locs());
895896
}
896897

897898
// TODO:
@@ -905,7 +906,7 @@ void try_place(const Netlist<>& net_list,
905906

906907
// Update physical pin values
907908
for (const ClusterBlockId block_id : cluster_ctx.clb_nlist.blocks()) {
908-
place_sync_external_block_connections(block_id, place_loc_vars);
909+
place_sync_external_block_connections(block_id, blk_loc_registry);
909910
}
910911

911912
check_place(costs,
@@ -940,8 +941,8 @@ void try_place(const Netlist<>& net_list,
940941
*timing_info, debug_tnode);
941942
}
942943

943-
generate_post_place_timing_reports(placer_opts, analysis_opts,
944-
*timing_info, *placement_delay_calc, is_flat);
944+
generate_post_place_timing_reports(placer_opts, analysis_opts, *timing_info,
945+
*placement_delay_calc, is_flat, blk_loc_registry);
945946

946947
/* Print critical path delay metrics */
947948
VTR_LOG("\n");
@@ -968,14 +969,14 @@ void try_place(const Netlist<>& net_list,
968969

969970
update_screen(ScreenUpdatePriority::MAJOR, msg, PLACEMENT, timing_info);
970971
// Print out swap statistics
971-
print_resources_utilization(place_loc_vars);
972+
print_resources_utilization(blk_loc_registry);
972973

973974
print_placement_swaps_stats(state, swap_stats);
974975

975976
print_placement_move_types_stats(move_type_stat);
976977

977978
if (noc_opts.noc) {
978-
write_noc_placement_file(noc_opts.noc_placement_file_name, place_loc_vars.block_locs());
979+
write_noc_placement_file(noc_opts.noc_placement_file_name, blk_loc_registry.block_locs());
979980
}
980981

981982
free_placement_structs(placer_opts, noc_opts, placer_ctx);
@@ -992,7 +993,7 @@ void try_place(const Netlist<>& net_list,
992993
p_runtime_ctx.f_update_td_costs_sum_nets_elapsed_sec,
993994
p_runtime_ctx.f_update_td_costs_total_elapsed_sec);
994995

995-
copy_locs_to_global_state(place_loc_vars);
996+
copy_locs_to_global_state(blk_loc_registry);
996997
}
997998

998999
/* Function to update the setup slacks and criticalities before the inner loop of the annealing/quench */
@@ -2051,15 +2052,15 @@ static int check_placement_costs(const t_placer_costs& costs,
20512052
return error;
20522053
}
20532054

2054-
static int check_placement_consistency(const BlkLocRegistry& place_loc_vars) {
2055-
return check_block_placement_consistency(place_loc_vars) + check_macro_placement_consistency(place_loc_vars);
2055+
static int check_placement_consistency(const BlkLocRegistry& blk_loc_registry) {
2056+
return check_block_placement_consistency(blk_loc_registry) + check_macro_placement_consistency(blk_loc_registry);
20562057
}
20572058

2058-
static int check_block_placement_consistency(const BlkLocRegistry& place_loc_vars) {
2059+
static int check_block_placement_consistency(const BlkLocRegistry& blk_loc_registry) {
20592060
auto& cluster_ctx = g_vpr_ctx.clustering();
20602061
auto& device_ctx = g_vpr_ctx.device();
2061-
const auto& block_locs = place_loc_vars.block_locs();
2062-
const auto& grid_blocks = place_loc_vars.grid_blocks();
2062+
const auto& block_locs = blk_loc_registry.block_locs();
2063+
const auto& grid_blocks = blk_loc_registry.grid_blocks();
20632064

20642065
int error = 0;
20652066

@@ -2139,10 +2140,10 @@ static int check_block_placement_consistency(const BlkLocRegistry& place_loc_var
21392140
return error;
21402141
}
21412142

2142-
int check_macro_placement_consistency(const BlkLocRegistry& place_loc_vars) {
2143+
int check_macro_placement_consistency(const BlkLocRegistry& blk_loc_registry) {
21432144
const auto& pl_macros = g_vpr_ctx.placement().pl_macros;
2144-
const auto& block_locs = place_loc_vars.block_locs();
2145-
const auto& grid_blocks = place_loc_vars.grid_blocks();
2145+
const auto& block_locs = blk_loc_registry.block_locs();
2146+
const auto& grid_blocks = blk_loc_registry.grid_blocks();
21462147

21472148
int error = 0;
21482149

@@ -2204,12 +2205,13 @@ static void generate_post_place_timing_reports(const t_placer_opts& placer_opts,
22042205
const t_analysis_opts& analysis_opts,
22052206
const SetupTimingInfo& timing_info,
22062207
const PlacementDelayCalculator& delay_calc,
2207-
bool is_flat) {
2208+
bool is_flat,
2209+
const BlkLocRegistry& blk_loc_registry) {
22082210
auto& timing_ctx = g_vpr_ctx.timing();
22092211
auto& atom_ctx = g_vpr_ctx.atom();
22102212

2211-
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup,
2212-
*timing_ctx.graph, delay_calc, is_flat);
2213+
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph,
2214+
delay_calc, is_flat, blk_loc_registry);
22132215
resolver.set_detail_level(analysis_opts.timing_report_detail);
22142216

22152217
tatum::TimingReporter timing_reporter(resolver, *timing_ctx.graph,
@@ -2288,10 +2290,10 @@ static void print_place_status(const t_annealing_state& state,
22882290
fflush(stdout);
22892291
}
22902292

2291-
static void print_resources_utilization(const BlkLocRegistry& place_loc_vars) {
2293+
static void print_resources_utilization(const BlkLocRegistry& blk_loc_registry) {
22922294
const auto& cluster_ctx = g_vpr_ctx.clustering();
22932295
const auto& device_ctx = g_vpr_ctx.device();
2294-
const auto& block_locs = place_loc_vars.block_locs();
2296+
const auto& block_locs = blk_loc_registry.block_locs();
22952297

22962298
int max_block_name = 0;
22972299
int max_tile_name = 0;
@@ -2429,18 +2431,18 @@ static void calculate_reward_and_process_outcome(const t_placer_opts& placer_opt
24292431
}
24302432
}
24312433

2432-
static void copy_locs_to_global_state(const BlkLocRegistry& place_loc_vars) {
2434+
static void copy_locs_to_global_state(const BlkLocRegistry& blk_loc_registry) {
24332435
auto& place_ctx = g_vpr_ctx.mutable_placement();
24342436

24352437
// the placement location variables should be unlocked before being accessed
24362438
place_ctx.unlock_loc_vars();
24372439

24382440
// copy the local location variables into the global state
2439-
auto& global_place_loc_vars = place_ctx.mutable_blk_loc_registry();
2440-
global_place_loc_vars = place_loc_vars;
2441+
auto& global_blk_loc_registry = place_ctx.mutable_blk_loc_registry();
2442+
global_blk_loc_registry = blk_loc_registry;
24412443

24422444
#ifndef NO_GRAPHICS
24432445
// update the graphics' reference to placement location variables
2444-
set_graphics_blk_loc_registry_ref(global_place_loc_vars);
2446+
set_graphics_blk_loc_registry_ref(global_blk_loc_registry);
24452447
#endif
24462448
}

vpr/src/route/route_utils.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,12 @@
1818
bool check_net_delays(const Netlist<>& net_list, NetPinsMatrix<float>& net_delay) {
1919
constexpr float ERROR_TOL = 0.0001;
2020

21-
unsigned int ipin;
2221
auto net_delay_check = make_net_pins_matrix<float>(net_list);
2322

2423
load_net_delay_from_routing(net_list, net_delay_check);
2524

2625
for (auto net_id : net_list.nets()) {
27-
for (ipin = 1; ipin < net_list.net_pins(net_id).size(); ipin++) {
26+
for (size_t ipin = 1; ipin < net_list.net_pins(net_id).size(); ipin++) {
2827
if (net_delay_check[net_id][ipin] == 0.) { /* Should be only GLOBAL nets */
2928
if (fabs(net_delay[net_id][ipin]) > ERROR_TOL) {
3029
VPR_ERROR(VPR_ERROR_ROUTE,
@@ -220,8 +219,9 @@ void generate_route_timing_reports(const t_router_opts& router_opts,
220219
bool is_flat) {
221220
auto& timing_ctx = g_vpr_ctx.timing();
222221
auto& atom_ctx = g_vpr_ctx.atom();
222+
const auto& blk_loc_registry = g_vpr_ctx.placement().blk_loc_registry();
223223

224-
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, delay_calc, is_flat);
224+
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, delay_calc, is_flat, blk_loc_registry);
225225
resolver.set_detail_level(analysis_opts.timing_report_detail);
226226

227227
tatum::TimingReporter timing_reporter(resolver, *timing_ctx.graph, *timing_ctx.constraints);

vpr/src/server/pathhelper.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ CritPathsResultPtr calc_critical_path(const std::string& report_type, int crit_p
3939

4040
auto& timing_ctx = g_vpr_ctx.timing();
4141
auto& atom_ctx = g_vpr_ctx.atom();
42-
//
42+
const auto& blk_loc_registry = g_vpr_ctx.placement().blk_loc_registry();
4343

4444
t_analysis_opts analysis_opts;
4545
analysis_opts.timing_report_detail = details_level;
4646
analysis_opts.timing_report_npaths = crit_path_num;
4747

48-
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, *routing_delay_calc, is_flat_routing);
48+
VprTimingGraphResolver resolver(atom_ctx.nlist, atom_ctx.lookup, *timing_ctx.graph, *routing_delay_calc, is_flat_routing, blk_loc_registry);
4949
resolver.set_detail_level(analysis_opts.timing_report_detail);
5050

5151
tatum::TimingReporter timing_reporter(resolver, *timing_ctx.graph, *timing_ctx.constraints);

vpr/src/timing/VprTimingGraphResolver.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ VprTimingGraphResolver::VprTimingGraphResolver(const AtomNetlist& netlist,
66
const AtomLookup& netlist_lookup,
77
const tatum::TimingGraph& timing_graph,
88
const AnalysisDelayCalculator& delay_calc,
9-
bool is_flat)
9+
bool is_flat,
10+
const BlkLocRegistry& blk_loc_registry)
1011
: netlist_(netlist)
1112
, netlist_lookup_(netlist_lookup)
1213
, timing_graph_(timing_graph)
1314
, delay_calc_(delay_calc)
14-
, is_flat_(is_flat) {}
15+
, is_flat_(is_flat)
16+
, blk_loc_registry_(blk_loc_registry) {}
1517

1618
std::string VprTimingGraphResolver::node_name(tatum::NodeId node) const {
1719
AtomPinId pin = netlist_lookup_.tnode_atom_pin(node);
@@ -31,7 +33,7 @@ std::string VprTimingGraphResolver::node_type_name(tatum::NodeId node) const {
3133
//Detailed report consist of the aggregated reported with a breakdown of inter-block routing
3234
//Annotate primitive grid location, if known
3335
auto& atom_ctx = g_vpr_ctx.atom();
34-
auto& block_locs = g_vpr_ctx.placement().block_locs();
36+
auto& block_locs = blk_loc_registry_.block_locs();
3537
ClusterBlockId cb = atom_ctx.lookup.atom_clb(blk);
3638
if (cb && block_locs.count(cb)) {
3739
int x = block_locs[cb].loc.x;

0 commit comments

Comments
 (0)