Skip to content

Commit ca1cf1c

Browse files
committed
vpr: Improve constant generator detection
Move constant generator inference into sweep_iteratitve() which allows more robust constant generator detection in the presence of unconnected dummy nets (which must be swept before the constant generators are revealed).
1 parent b3d1aa9 commit ca1cf1c

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

vpr/src/base/atom_netlist_utils.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -412,10 +412,10 @@ std::string atom_pin_arch_name(const AtomNetlist& netlist, const AtomPinId pin)
412412

413413
int mark_constant_generators(AtomNetlist& netlist, e_const_gen_inference const_gen_inference_method, int verbosity) {
414414
int num_undriven_pins_marked_const = mark_undriven_primitive_outputs_as_constant(netlist, verbosity);
415-
VTR_LOGV(verbosity > 0, "Inferred %4d primitive pins as constant generators since they have no combinationally connected inputs\n", num_undriven_pins_marked_const);
415+
VTR_LOGV(verbosity > 0, "Inferred %4d additional primitive pins as constant generators since they have no combinationally connected inputs\n", num_undriven_pins_marked_const);
416416

417417
int num_inferred_pins_marked_const = infer_and_mark_constant_pins(netlist, const_gen_inference_method, verbosity);
418-
VTR_LOGV(verbosity > 0, "Inferred %4d primitive pins as constant generators due to constant inputs\n", num_inferred_pins_marked_const);
418+
VTR_LOGV(verbosity > 0, "Inferred %4d additional primitive pins as constant generators due to constant inputs\n", num_inferred_pins_marked_const);
419419

420420
return num_undriven_pins_marked_const + num_inferred_pins_marked_const;
421421
}
@@ -429,6 +429,8 @@ int mark_undriven_primitive_outputs_as_constant(AtomNetlist& netlist, int verbos
429429
size_t num_pins_marked_constant = 0;
430430

431431
for (AtomBlockId blk : netlist.blocks()) {
432+
if (!blk) continue;
433+
432434
//Don't mark primary I/Os as constants
433435
if (netlist.block_type(blk) != AtomBlockType::BLOCK) continue;
434436

@@ -489,6 +491,8 @@ int infer_and_mark_constant_pins(AtomNetlist& netlist, e_const_gen_inference con
489491
//Look through all the blocks marking those pins which are
490492
//constant generataors
491493
for (auto blk : netlist.blocks()) {
494+
if (!blk) continue;
495+
492496
num_pins_marked += infer_and_mark_block_pins_constant(netlist, blk, const_gen_inference_method, verbosity);
493497
}
494498

@@ -946,12 +950,14 @@ size_t sweep_iterative(AtomNetlist& netlist,
946950
bool should_sweep_nets,
947951
bool should_sweep_blocks,
948952
bool should_sweep_constant_primary_outputs,
953+
e_const_gen_inference const_gen_inference_method,
949954
int verbosity) {
950955
size_t dangling_nets_swept = 0;
951956
size_t dangling_blocks_swept = 0;
952957
size_t dangling_inputs_swept = 0;
953958
size_t dangling_outputs_swept = 0;
954959
size_t constant_outputs_swept = 0;
960+
size_t constant_generators_marked = 0;
955961

956962
//We perform multiple passes of sweeping, since sweeping something may
957963
//enable more things to be swept afterward.
@@ -962,12 +968,14 @@ size_t sweep_iterative(AtomNetlist& netlist,
962968
size_t pass_dangling_inputs_swept;
963969
size_t pass_dangling_outputs_swept;
964970
size_t pass_constant_outputs_swept;
971+
size_t pass_constant_generators_marked;
965972
do {
966973
pass_dangling_nets_swept = 0;
967974
pass_dangling_blocks_swept = 0;
968975
pass_dangling_inputs_swept = 0;
969976
pass_dangling_outputs_swept = 0;
970977
pass_constant_outputs_swept = 0;
978+
pass_constant_generators_marked = 0;
971979

972980
if (should_sweep_ios) {
973981
pass_dangling_inputs_swept += sweep_inputs(netlist, verbosity);
@@ -986,23 +994,29 @@ size_t sweep_iterative(AtomNetlist& netlist,
986994
pass_constant_outputs_swept += sweep_constant_primary_outputs(netlist, verbosity);
987995
}
988996

997+
pass_constant_generators_marked += mark_constant_generators(netlist, const_gen_inference_method, verbosity);
998+
989999
dangling_nets_swept += pass_dangling_nets_swept;
9901000
dangling_blocks_swept += pass_dangling_blocks_swept;
9911001
dangling_inputs_swept += pass_dangling_inputs_swept;
9921002
dangling_outputs_swept += pass_dangling_outputs_swept;
9931003
constant_outputs_swept += pass_constant_outputs_swept;
1004+
constant_generators_marked += pass_constant_generators_marked;
9941005
} while (pass_dangling_nets_swept != 0
9951006
|| pass_dangling_blocks_swept != 0
9961007
|| pass_dangling_inputs_swept != 0
9971008
|| pass_dangling_outputs_swept != 0
998-
|| pass_constant_outputs_swept != 0);
1009+
|| pass_constant_outputs_swept != 0
1010+
|| pass_constant_generators_marked != 0);
9991011

1000-
VTR_LOGV(verbosity > 0, "Swept input(s) : %zu\n", dangling_inputs_swept);
1001-
VTR_LOGV(verbosity > 0, "Swept output(s): %zu (%zu dangling, %zu constant)\n", dangling_outputs_swept + constant_outputs_swept,
1012+
VTR_LOGV(verbosity > 0, "Swept input(s) : %zu\n", dangling_inputs_swept);
1013+
VTR_LOGV(verbosity > 0, "Swept output(s) : %zu (%zu dangling, %zu constant)\n",
1014+
dangling_outputs_swept + constant_outputs_swept,
10021015
dangling_outputs_swept,
10031016
constant_outputs_swept);
1004-
VTR_LOGV(verbosity > 0, "Swept net(s) : %zu\n", dangling_nets_swept);
1005-
VTR_LOGV(verbosity > 0, "Swept block(s) : %zu\n", dangling_blocks_swept);
1017+
VTR_LOGV(verbosity > 0, "Swept net(s) : %zu\n", dangling_nets_swept);
1018+
VTR_LOGV(verbosity > 0, "Swept block(s) : %zu\n", dangling_blocks_swept);
1019+
VTR_LOGV(verbosity > 0, "Constant Pins Marked: %zu\n", constant_generators_marked);
10061020

10071021
return dangling_nets_swept
10081022
+ dangling_blocks_swept

vpr/src/base/atom_netlist_utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ size_t sweep_iterative(AtomNetlist& netlist,
3232
bool should_sweep_dangling_blocks,
3333
bool should_sweep_dangling_nets,
3434
bool should_sweep_constant_primary_outputs,
35+
e_const_gen_inference const_gen_inference_method,
3536
int verbosity);
3637

3738
//Sweeps blocks that have no fanout

vpr/src/base/read_circuit.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,6 @@ static void process_circuit(AtomNetlist& netlist,
8585
bool should_sweep_dangling_blocks,
8686
bool should_sweep_constant_primary_outputs,
8787
int verbosity) {
88-
{
89-
vtr::ScopedStartFinishTimer t("Mark constant generators");
90-
mark_constant_generators(netlist, const_gen_inference_method, verbosity);
91-
}
92-
9388
{
9489
vtr::ScopedStartFinishTimer t("Clean circuit");
9590

@@ -118,6 +113,7 @@ static void process_circuit(AtomNetlist& netlist,
118113
should_sweep_dangling_nets,
119114
should_sweep_dangling_blocks,
120115
should_sweep_constant_primary_outputs,
116+
const_gen_inference_method,
121117
verbosity);
122118
}
123119

0 commit comments

Comments
 (0)