Skip to content

Commit 7233203

Browse files
committed
Merge branch 'simple_place_delay_model' of https://github.com/verilog-to-routing/vtr-verilog-to-routing into 3d_track_to_track_conn
2 parents cf09b6a + 24d5ad9 commit 7233203

9 files changed

+94
-40
lines changed

vpr/src/place/place_delay_model.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ float SimpleDelayModel::delay(const t_physical_tile_loc& from_loc, int /*from_pi
157157
int delta_x = std::abs(from_loc.x - to_loc.x);
158158
int delta_y = std::abs(from_loc.y - to_loc.y);
159159

160-
return delays_[from_loc.layer_num][to_loc.layer_num][delta_x][delta_y];
160+
int from_tile_idx = g_vpr_ctx.device().grid.get_physical_type(from_loc)->index;
161+
return delays_[from_tile_idx][from_loc.layer_num][to_loc.layer_num][delta_x][delta_y];
161162
}
162163

163164
/**

vpr/src/place/place_delay_model.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ class SimpleDelayModel : public PlaceDelayModel {
238238
void write(const std::string& /*file*/) const override {}
239239

240240
private:
241-
vtr::NdMatrix<float, 4> delays_; // [0..num_layers-1][0..max_dx][0..max_dy]
241+
vtr::NdMatrix<float, 5> delays_; // [0..num_layers-1][0..max_dx][0..max_dy]
242242
float cross_layer_delay_;
243243
bool is_flat_;
244244
};

vpr/src/place/timing_place_lookup.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ static vtr::NdMatrix<float, 4> compute_delta_delay_model(
147147
int longest_length,
148148
bool is_flat);
149149

150-
static vtr::NdMatrix<float, 4> compute_simple_delay_model(RouterDelayProfiler& route_profiler);
150+
static vtr::NdMatrix<float, 5> compute_simple_delay_model(RouterDelayProfiler& route_profiler);
151151

152152
static bool find_direct_connect_sample_locations(const t_direct_inf* direct,
153153
t_physical_tile_type_ptr from_type,
@@ -1051,18 +1051,27 @@ static vtr::NdMatrix<float, 4> compute_delta_delay_model(
10511051
return delta_delays;
10521052
}
10531053

1054-
static vtr::NdMatrix<float, 4> compute_simple_delay_model(RouterDelayProfiler& route_profiler) {
1054+
static vtr::NdMatrix<float, 5> compute_simple_delay_model(RouterDelayProfiler& route_profiler) {
10551055
const auto& grid = g_vpr_ctx.device().grid;
1056-
vtr::NdMatrix<float, 4> delta_delays({static_cast<unsigned long>(grid.get_num_layers()),
1056+
int num_physical_tile_types = static_cast<int>(g_vpr_ctx.device().physical_tile_types.size());
1057+
vtr::NdMatrix<float, 5> delta_delays({static_cast<unsigned long>(num_physical_tile_types),
1058+
static_cast<unsigned long>(grid.get_num_layers()),
10571059
static_cast<unsigned long>(grid.get_num_layers()),
10581060
grid.width(),
10591061
grid.height()});
1060-
for (int from_layer = 0; from_layer < grid.get_num_layers(); ++from_layer) {
1061-
for (int to_layer = 0; to_layer < grid.get_num_layers(); ++to_layer) {
1062-
for (int dx = 0; dx < static_cast<int>(grid.width()); ++dx) {
1063-
for (int dy = 0; dy < static_cast<int>(grid.height()); ++dy) {
1064-
float min_delay = route_profiler.get_min_delay(from_layer, to_layer, dx, dy);
1065-
delta_delays[from_layer][to_layer][dx][dy] = min_delay;
1062+
1063+
for (int physical_tile_type_idx = 0; physical_tile_type_idx < num_physical_tile_types; ++physical_tile_type_idx) {
1064+
for (int from_layer = 0; from_layer < grid.get_num_layers(); ++from_layer) {
1065+
for (int to_layer = 0; to_layer < grid.get_num_layers(); ++to_layer) {
1066+
for (int dx = 0; dx < static_cast<int>(grid.width()); ++dx) {
1067+
for (int dy = 0; dy < static_cast<int>(grid.height()); ++dy) {
1068+
float min_delay = route_profiler.get_min_delay(physical_tile_type_idx,
1069+
from_layer,
1070+
to_layer,
1071+
dx,
1072+
dy);
1073+
delta_delays[physical_tile_type_idx][from_layer][to_layer][dx][dy] = min_delay;
1074+
}
10661075
}
10671076
}
10681077
}

vpr/src/route/router_delay_profiling.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,19 @@ RouterDelayProfiler::RouterDelayProfiler(const Netlist<>& net_list,
2323
is_flat)
2424
, is_flat_(is_flat) {
2525
const auto& grid = g_vpr_ctx.device().grid;
26-
min_delays_.resize({static_cast<unsigned long>(grid.get_num_layers()),
26+
min_delays_.resize({g_vpr_ctx.device().physical_tile_types.size(),
27+
static_cast<unsigned long>(grid.get_num_layers()),
2728
static_cast<unsigned long>(grid.get_num_layers()),
2829
grid.width(),
2930
grid.height()});
30-
for (int from_layer = 0; from_layer < grid.get_num_layers(); ++from_layer) {
31-
for (int to_layer = 0; to_layer < grid.get_num_layers(); ++to_layer) {
32-
for (int dx = 0; dx < static_cast<int>(grid.width()); ++dx) {
33-
for (int dy = 0; dy < static_cast<int>(grid.height()); ++dy) {
34-
float min_delay = lookahead->get_distance_min_delay(from_layer, to_layer, dx, dy);
35-
min_delays_[from_layer][to_layer][dx][dy] = min_delay;
31+
for (int physical_tile_type_idx = 0; physical_tile_type_idx < static_cast<int>(g_vpr_ctx.device().physical_tile_types.size()); ++physical_tile_type_idx) {
32+
for (int from_layer = 0; from_layer < grid.get_num_layers(); ++from_layer) {
33+
for (int to_layer = 0; to_layer < grid.get_num_layers(); ++to_layer) {
34+
for (int dx = 0; dx < static_cast<int>(grid.width()); ++dx) {
35+
for (int dy = 0; dy < static_cast<int>(grid.height()); ++dy) {
36+
float min_delay = lookahead->get_opin_distance_min_delay(physical_tile_type_idx, from_layer, to_layer, dx, dy);
37+
min_delays_[physical_tile_type_idx][from_layer][to_layer][dx][dy] = min_delay;
38+
}
3639
}
3740
}
3841
}
@@ -127,8 +130,8 @@ bool RouterDelayProfiler::calculate_delay(RRNodeId source_node,
127130
return found_path;
128131
}
129132

130-
float RouterDelayProfiler::get_min_delay(int from_layer, int to_layer, int dx, int dy) const {
131-
return min_delays_[from_layer][to_layer][dx][dy];
133+
float RouterDelayProfiler::get_min_delay(int physical_tile_type_idx, int from_layer, int to_layer, int dx, int dy) const {
134+
return min_delays_[physical_tile_type_idx][from_layer][to_layer][dx][dy];
132135
}
133136

134137
//Returns the shortest path delay from src_node to all RR nodes in the RR graph, or NaN if no path exists

vpr/src/route/router_delay_profiling.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ class RouterDelayProfiler {
3030
const t_router_opts& router_opts,
3131
float* net_delay);
3232

33-
float get_min_delay(int from_layer, int to_layer, int dx, int dy) const;
33+
float get_min_delay(int physical_tile_type_idx, int from_layer, int to_layer, int dx, int dy) const;
3434

3535
private:
3636
const Netlist<>& net_list_;
3737
RouterStats router_stats_;
3838
ConnectionRouter<BinaryHeap> router_;
39-
vtr::NdMatrix<float, 4> min_delays_;
39+
vtr::NdMatrix<float, 5> min_delays_;
4040
bool is_flat_;
4141
};
4242

vpr/src/route/router_lookahead.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class RouterLookahead {
3636
// May be unimplemented, in which case method should throw an exception.
3737
virtual void write_intra_cluster(const std::string& file) const = 0;
3838

39-
virtual float get_distance_min_delay(int from_layer, int to_layer, int dx, int dy) const = 0;
39+
virtual float get_opin_distance_min_delay(int physical_tile_idx, int from_layer, int to_layer, int dx, int dy) const = 0;
4040

4141
virtual ~RouterLookahead() {}
4242
};
@@ -94,7 +94,7 @@ class ClassicLookahead : public RouterLookahead {
9494
VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::write_intra_cluster unimplemented");
9595
}
9696

97-
float get_distance_min_delay(int /*from_layer*/, int /*to_layer*/, int /*dx*/, int /*dy*/) const override {
97+
float get_opin_distance_min_delay(int /*physical_tile_idx*/, int /*from_layer*/, int /*to_layer*/, int /*dx*/, int /*dy*/) const override {
9898
VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::get_distance_min_delay unimplemented");
9999
return -1.;
100100
}
@@ -131,7 +131,7 @@ class NoOpLookahead : public RouterLookahead {
131131
VPR_THROW(VPR_ERROR_ROUTE, "write_intra_cluster not supported for NoOpLookahead");
132132
}
133133

134-
float get_distance_min_delay(int /*from_layer*/, int /*to_layer*/, int /*dx*/, int /*dy*/) const override {
134+
float get_opin_distance_min_delay(int /*physical_tile_idx*/, int /*from_layer*/, int /*to_layer*/, int /*dx*/, int /*dy*/) const override {
135135
VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::get_distance_min_delay unimplemented");
136136
return -1.;
137137
}

vpr/src/route/router_lookahead_extended_map.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ class ExtendedMapLookahead : public RouterLookahead {
104104
VPR_THROW(VPR_ERROR_ROUTE, "ExtendedMapLookahead::write_intra_cluster unimplemented");
105105
}
106106

107-
float get_distance_min_delay(int /*from_layer*/, int /*to_layer*/, int /*dx*/, int /*dy*/) const override {
107+
float get_opin_distance_min_delay(int /*physical_tile_idx*/, int /*from_layer*/, int /*to_layer*/, int /*dx*/, int /*dy*/) const override {
108108
VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::get_distance_min_delay unimplemented");
109109
return -1.;
110110
}

vpr/src/route/router_lookahead_map.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,9 @@ static void store_min_cost_to_sinks(std::unordered_map<int, std::unordered_map<i
255255
* @brief Iterate over the first and second dimension of f_wire_cost_map to get the minimum cost for each dx and dy_
256256
* @param internal_opin_global_cost_map This map is populated in this function. [dx][dy] -> cost
257257
*/
258-
static void min_global_cost_map(vtr::NdMatrix<util::Cost_Entry, 4>& distance_min_cost);
258+
static void min_chann_global_cost_map(vtr::NdMatrix<util::Cost_Entry, 4>& distance_min_cost);
259+
260+
static void min_opin_distance_cost_map(const util::t_src_opin_delays& src_opin_delays, vtr::NdMatrix<util::Cost_Entry, 5>& distance_min_cost);
259261

260262
/**
261263
* @brief Iterate over all of the wire segments accessible from the SOURCE/OPIN (stored in src_opin_delay_map) and return the minimum cost (congestion and delay) across them to the sink
@@ -377,14 +379,14 @@ float MapLookahead::get_expected_cost(RRNodeId current_node, RRNodeId target_nod
377379
}
378380
} else {
379381
// Since we don't know which type of wires are accessible from an OPIN inside the cluster, we use
380-
// distance_based_min_cost to get an estimation of the global cost, and then, add this cost to the tile_min_cost
382+
// chann_distance_based_min_cost to get an estimation of the global cost, and then, add this cost to the tile_min_cost
381383
// to have an estimation of the cost of getting into a cluster - We don't have any estimation of the cost to get out of the cluster
382384
int delta_x, delta_y;
383385
get_xy_deltas(current_node, target_node, &delta_x, &delta_y);
384386
delta_x = abs(delta_x);
385387
delta_y = abs(delta_y);
386-
delay_cost = params.criticality * distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].delay;
387-
cong_cost = (1. - params.criticality) * distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].congestion;
388+
delay_cost = params.criticality * chann_distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].delay;
389+
cong_cost = (1. - params.criticality) * chann_distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].congestion;
388390

389391
delay_offset_cost = params.criticality * tile_min_cost.at(to_physical_type->index).at(to_node_ptc_num).delay;
390392
cong_offset_cost = (1. - params.criticality) * tile_min_cost.at(to_physical_type->index).at(to_node_ptc_num).congestion;
@@ -415,8 +417,8 @@ float MapLookahead::get_expected_cost(RRNodeId current_node, RRNodeId target_nod
415417
get_xy_deltas(current_node, target_node, &delta_x, &delta_y);
416418
delta_x = abs(delta_x);
417419
delta_y = abs(delta_y);
418-
delay_cost = params.criticality * distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].delay;
419-
cong_cost = (1. - params.criticality) * distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].congestion;
420+
delay_cost = params.criticality * chann_distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].delay;
421+
cong_cost = (1. - params.criticality) * chann_distance_based_min_cost[rr_graph.node_layer(current_node)][to_layer_num][delta_x][delta_y].congestion;
420422

421423
delay_offset_cost = params.criticality * tile_min_cost.at(to_physical_type->index).at(to_node_ptc_num).delay;
422424
cong_offset_cost = (1. - params.criticality) * tile_min_cost.at(to_physical_type->index).at(to_node_ptc_num).congestion;
@@ -540,7 +542,8 @@ void MapLookahead::compute(const std::vector<t_segment_inf>& segment_inf) {
540542
//from the different physical tile type's SOURCEs & OPINs
541543
this->src_opin_delays = util::compute_router_src_opin_lookahead(is_flat_);
542544

543-
min_global_cost_map(distance_based_min_cost);
545+
min_chann_global_cost_map(chann_distance_based_min_cost);
546+
min_opin_distance_cost_map(src_opin_delays, opin_distance_based_min_cost);
544547
}
545548

546549
void MapLookahead::compute_intra_tile() {
@@ -581,8 +584,8 @@ void MapLookahead::read_intra_cluster(const std::string& file) {
581584
inter_tile_pin_primitive_pin_delay);
582585
}
583586

584-
// The information about distance_based_min_cost is not stored in the file, thus it needs to be computed
585-
min_global_cost_map(distance_based_min_cost);
587+
// The information about chann_distance_based_min_cost is not stored in the file, thus it needs to be computed
588+
min_chann_global_cost_map(chann_distance_based_min_cost);
586589
}
587590

588591
void MapLookahead::write(const std::string& file) const {
@@ -594,8 +597,8 @@ void MapLookahead::write_intra_cluster(const std::string& file) const {
594597
inter_tile_pin_primitive_pin_delay);
595598
}
596599

597-
float MapLookahead::get_distance_min_delay(int from_layer, int to_layer, int dx, int dy) const {
598-
return distance_based_min_cost[from_layer][to_layer][dx][dy].delay;
600+
float MapLookahead::get_opin_distance_min_delay(int physical_tile_idx, int from_layer, int to_layer, int dx, int dy) const {
601+
return opin_distance_based_min_cost[physical_tile_idx][from_layer][to_layer][dx][dy].delay;
599602
}
600603

601604
/******** Function Definitions ********/
@@ -1463,7 +1466,7 @@ static void store_min_cost_to_sinks(std::unordered_map<int, std::unordered_map<i
14631466
VTR_ASSERT(insert_res.second);
14641467
}
14651468

1466-
static void min_global_cost_map(vtr::NdMatrix<util::Cost_Entry, 4>& distance_min_cost) {
1469+
static void min_chann_global_cost_map(vtr::NdMatrix<util::Cost_Entry, 4>& distance_min_cost) {
14671470
int num_layers = g_vpr_ctx.device().grid.get_num_layers();
14681471
int width = (int)g_vpr_ctx.device().grid.width();
14691472
int height = (int)g_vpr_ctx.device().grid.height();
@@ -1494,6 +1497,43 @@ static void min_global_cost_map(vtr::NdMatrix<util::Cost_Entry, 4>& distance_min
14941497
}
14951498
}
14961499

1500+
static void min_opin_distance_cost_map(const util::t_src_opin_delays& src_opin_delays, vtr::NdMatrix<util::Cost_Entry, 5>& distance_min_cost) {
1501+
int num_tile_types = g_vpr_ctx.device().physical_tile_types.size();
1502+
int num_layers = g_vpr_ctx.device().grid.get_num_layers();
1503+
int width = (int)g_vpr_ctx.device().grid.width();
1504+
int height = (int)g_vpr_ctx.device().grid.height();
1505+
distance_min_cost.resize({static_cast<unsigned long>(num_tile_types),
1506+
static_cast<unsigned long>(num_layers),
1507+
static_cast<unsigned long>(num_layers),
1508+
static_cast<unsigned long>(width),
1509+
static_cast<unsigned long>(height)});
1510+
1511+
for (int tile_type_idx = 0; tile_type_idx < num_tile_types; tile_type_idx++) {
1512+
for (int from_layer_num = 0; from_layer_num < num_layers; from_layer_num++) {
1513+
for (int to_layer_num = 0; to_layer_num < num_layers; to_layer_num++) {
1514+
for (int dx = 0; dx < width; dx++) {
1515+
for (int dy = 0; dy < height; dy++) {
1516+
float expected_delay_cost = std::numeric_limits<float>::infinity();
1517+
float expected_cong_cost = std::numeric_limits<float>::infinity();
1518+
util::Cost_Entry min_cost(std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity());
1519+
for (const auto& tile_opin_map : src_opin_delays[from_layer_num][tile_type_idx]) {
1520+
std::tie(expected_delay_cost, expected_cong_cost) = get_cost_from_src_opin(tile_opin_map,
1521+
dx,
1522+
dy,
1523+
to_layer_num);
1524+
if (expected_delay_cost < min_cost.delay) {
1525+
min_cost.delay = expected_delay_cost;
1526+
min_cost.congestion = expected_cong_cost;
1527+
}
1528+
}
1529+
distance_min_cost[tile_type_idx][from_layer_num][to_layer_num][dx][dy] = min_cost;
1530+
}
1531+
}
1532+
}
1533+
}
1534+
}
1535+
}
1536+
14971537
static std::pair<float, float> get_cost_from_src_opin(const std::vector<std::map<int, util::t_reachable_wire_inf>>& src_opin_delay_map,
14981538
int delta_x,
14991539
int delta_y,

vpr/src/route/router_lookahead_map.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ class MapLookahead : public RouterLookahead {
1818
// Lookup table to store the minimum cost to reach to a primitive pin from the root-level IPINs
1919
std::unordered_map<int, std::unordered_map<int, util::Cost_Entry>> tile_min_cost; // [physical_tile_type][sink_physical_num] -> cost
2020
// Lookup table to store the minimum cost for each dx and dy
21-
vtr::NdMatrix<util::Cost_Entry, 4> distance_based_min_cost; // [from_layer_num][to_layer_num][dx][dy] -> cost
21+
vtr::NdMatrix<util::Cost_Entry, 4> chann_distance_based_min_cost; // [from_layer_num][to_layer_num][dx][dy] -> cost
22+
vtr::NdMatrix<util::Cost_Entry, 5> opin_distance_based_min_cost; // [from_layer_num][to_layer_num][dx][dy] -> cost
2223

2324
const t_det_routing_arch& det_routing_arch_;
2425
bool is_flat_;
@@ -33,7 +34,7 @@ class MapLookahead : public RouterLookahead {
3334
void read_intra_cluster(const std::string& file) override;
3435
void write(const std::string& file) const override;
3536
void write_intra_cluster(const std::string& file) const override;
36-
float get_distance_min_delay(int from_layer, int to_layer, int dx, int dy) const override;
37+
float get_opin_distance_min_delay(int physical_tile_idx, int from_layer, int to_layer, int dx, int dy) const override;
3738
};
3839

3940
/* f_cost_map is an array of these cost entries that specifies delay/congestion estimates

0 commit comments

Comments
 (0)