Skip to content

Commit 6d3859a

Browse files
committed
Add base cost option that is bounded.
Signed-off-by: Keith Rothman <[email protected]>
1 parent c0331a0 commit 6d3859a

File tree

4 files changed

+32
-3
lines changed

4 files changed

+32
-3
lines changed

vpr/src/base/ShowSetup.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ static void ShowRouterOpts(const t_router_opts& RouterOpts) {
197197
case DELAY_NORMALIZED_LENGTH:
198198
VTR_LOG("DELAY_NORMALIZED_LENGTH\n");
199199
break;
200+
case DELAY_NORMALIZED_LENGTH_BOUNDED:
201+
VTR_LOG("DELAY_NORMALIZED_LENGTH_BOUNDED\n");
202+
break;
200203
case DELAY_NORMALIZED_FREQUENCY:
201204
VTR_LOG("DELAY_NORMALIZED_FREQUENCY\n");
202205
break;

vpr/src/base/read_options.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ struct ParseBaseCost {
245245
conv_value.set_value(DEMAND_ONLY_NORMALIZED_LENGTH);
246246
else if (str == "demand_only")
247247
conv_value.set_value(DEMAND_ONLY);
248+
else if (str == "delay_normalized_length_bounded")
249+
conv_value.set_value(DELAY_NORMALIZED_LENGTH_BOUNDED);
248250
else {
249251
std::stringstream msg;
250252
msg << "Invalid conversion from '" << str << "' to e_router_algorithm (expected one of: " << argparse::join(default_choices(), ", ") << ")";
@@ -265,6 +267,8 @@ struct ParseBaseCost {
265267
conv_value.set_value("delay_normalized_length_frequency");
266268
else if (val == DEMAND_ONLY_NORMALIZED_LENGTH)
267269
conv_value.set_value("demand_only_normalized_length");
270+
else if (val == DELAY_NORMALIZED_LENGTH_BOUNDED)
271+
conv_value.set_value("delay_normalized_length_bounded");
268272
else {
269273
VTR_ASSERT(val == DEMAND_ONLY);
270274
conv_value.set_value("demand_only");
@@ -273,7 +277,7 @@ struct ParseBaseCost {
273277
}
274278

275279
std::vector<std::string> default_choices() {
276-
return {"demand_only", "demand_only_normalized_length", "delay_normalized", "delay_normalized_length", "delay_normalized_frequency", "delay_normalized_length_frequency"};
280+
return {"demand_only", "demand_only_normalized_length", "delay_normalized", "delay_normalized_length", "delay_normalized_length_bounded", "delay_normalized_frequency", "delay_normalized_length_frequency"};
277281
}
278282
};
279283

@@ -1442,9 +1446,13 @@ argparse::ArgumentParser create_arg_parser(std::string prog_name, t_options& arg
14421446
" to magnitude of typical routing resource delay\n"
14431447
" * delay_normalized_length: like delay_normalized but\n"
14441448
" scaled by routing resource length\n"
1445-
" * delay_normalized_freqeuncy: like delay_normalized\n"
1449+
" * delay_normalized_length_bounded: like delay_normalized but\n"
1450+
" scaled by routing resource length. Scaling is normalized\n"
1451+
" between 1 to 4, with min lengths getting scaled at 1,\n"
1452+
" and max lengths getting scaled at 4.\n"
1453+
" * delay_normalized_frequency: like delay_normalized\n"
14461454
" but scaled inversely by segment type frequency\n"
1447-
" * delay_normalized_length_freqeuncy: like delay_normalized\n"
1455+
" * delay_normalized_length_frequency: like delay_normalized\n"
14481456
" but scaled by routing resource length, and inversely\n"
14491457
" by segment type frequency\n"
14501458
"(Default: demand_only for breadth-first router,\n"

vpr/src/base/vpr_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,7 @@ enum e_base_cost_type {
878878
DELAY_NORMALIZED_LENGTH,
879879
DELAY_NORMALIZED_FREQUENCY,
880880
DELAY_NORMALIZED_LENGTH_FREQUENCY,
881+
DELAY_NORMALIZED_LENGTH_BOUNDED,
881882
DEMAND_ONLY,
882883
DEMAND_ONLY_NORMALIZED_LENGTH
883884
};

vpr/src/route/rr_graph_indexed_data.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,14 @@ static void load_rr_indexed_data_base_costs(int nodes_per_chan,
168168
size_t total_segments = std::accumulate(rr_segment_counts.begin(), rr_segment_counts.end(), 0u);
169169

170170
/* Load base costs for CHANX and CHANY segments */
171+
float max_length = 0;
172+
float min_length = 1;
173+
if (base_cost_type == DELAY_NORMALIZED_LENGTH_BOUNDED) {
174+
for (index = CHANX_COST_INDEX_START; index < device_ctx.rr_indexed_data.size(); index++) {
175+
float length = (1 / device_ctx.rr_indexed_data[index].inv_length);
176+
max_length = std::max(max_length, length);
177+
}
178+
}
171179

172180
//Future Work: Since we can now have wire types which don't connect to IPINs,
173181
// perhaps consider lowering cost of wires which connect to IPINs
@@ -180,6 +188,15 @@ static void load_rr_indexed_data_base_costs(int nodes_per_chan,
180188
} else if (base_cost_type == DELAY_NORMALIZED_LENGTH || base_cost_type == DEMAND_ONLY_NORMALIZED_LENGTH) {
181189
device_ctx.rr_indexed_data[index].base_cost = delay_normalization_fac / device_ctx.rr_indexed_data[index].inv_length;
182190

191+
} else if (base_cost_type == DELAY_NORMALIZED_LENGTH_BOUNDED) {
192+
float length = (1 / device_ctx.rr_indexed_data[index].inv_length);
193+
if (max_length != min_length) {
194+
float length_scale = 1.f + 3.f * (length - min_length) / (max_length - min_length);
195+
device_ctx.rr_indexed_data[index].base_cost = delay_normalization_fac * length_scale;
196+
} else {
197+
device_ctx.rr_indexed_data[index].base_cost = delay_normalization_fac;
198+
}
199+
183200
} else if (base_cost_type == DELAY_NORMALIZED_FREQUENCY) {
184201
int seg_index = device_ctx.rr_indexed_data[index].seg_index;
185202

0 commit comments

Comments
 (0)