Skip to content

Commit aef717c

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

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
@@ -202,6 +202,9 @@ static void ShowRouterOpts(const t_router_opts& RouterOpts) {
202202
case DELAY_NORMALIZED_LENGTH:
203203
VTR_LOG("DELAY_NORMALIZED_LENGTH\n");
204204
break;
205+
case DELAY_NORMALIZED_LENGTH_BOUNDED:
206+
VTR_LOG("DELAY_NORMALIZED_LENGTH_BOUNDED\n");
207+
break;
205208
case DELAY_NORMALIZED_FREQUENCY:
206209
VTR_LOG("DELAY_NORMALIZED_FREQUENCY\n");
207210
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

@@ -1451,9 +1455,13 @@ argparse::ArgumentParser create_arg_parser(std::string prog_name, t_options& arg
14511455
" to magnitude of typical routing resource delay\n"
14521456
" * delay_normalized_length: like delay_normalized but\n"
14531457
" scaled by routing resource length\n"
1454-
" * delay_normalized_freqeuncy: like delay_normalized\n"
1458+
" * delay_normalized_length_bounded: like delay_normalized but\n"
1459+
" scaled by routing resource length. Scaling is normalized\n"
1460+
" between 1 to 4, with min lengths getting scaled at 1,\n"
1461+
" and max lengths getting scaled at 4.\n"
1462+
" * delay_normalized_frequency: like delay_normalized\n"
14551463
" but scaled inversely by segment type frequency\n"
1456-
" * delay_normalized_length_freqeuncy: like delay_normalized\n"
1464+
" * delay_normalized_length_frequency: like delay_normalized\n"
14571465
" but scaled by routing resource length, and inversely\n"
14581466
" by segment type frequency\n"
14591467
"(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
@@ -876,6 +876,7 @@ enum e_base_cost_type {
876876
DELAY_NORMALIZED_LENGTH,
877877
DELAY_NORMALIZED_FREQUENCY,
878878
DELAY_NORMALIZED_LENGTH_FREQUENCY,
879+
DELAY_NORMALIZED_LENGTH_BOUNDED,
879880
DEMAND_ONLY,
880881
DEMAND_ONLY_NORMALIZED_LENGTH
881882
};

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)