File tree Expand file tree Collapse file tree 1 file changed +8
-0
lines changed Expand file tree Collapse file tree 1 file changed +8
-0
lines changed Original file line number Diff line number Diff line change @@ -1091,6 +1091,9 @@ static AtomBlockId get_sink_block(const AtomBlockId block_id,
1091
1091
if (net_id.is_valid ()) {
1092
1092
const auto & net_sinks = atom_nlist.net_sinks (net_id);
1093
1093
if (is_chain_pattern) {
1094
+ // If the pattern is a chain, allow nets with multiple sinks.
1095
+ // This enables forming chains where the COUT is connected both to
1096
+ // the next element in the chain and to the block's output pin.
1094
1097
for (const auto & sink_pin_id : net_sinks) {
1095
1098
auto sink_block_id = atom_nlist.pin_block (sink_pin_id);
1096
1099
if (primitive_type_feasible (sink_block_id, to_pb_type)) {
@@ -1102,6 +1105,11 @@ static AtomBlockId get_sink_block(const AtomBlockId block_id,
1102
1105
}
1103
1106
}
1104
1107
} else {
1108
+ // For non-chain patterns, we conservatively only consider the sink block
1109
+ // if the net fanout is 1. To clarify, consider a case where the output of a LUT
1110
+ // is connected to both a register and an unregistered output that feeds another block.
1111
+ // If the intra-cluster architecture doesn't support having both registered and
1112
+ // unregistered outputs simultaneously, this could lead to a packing failure.
1105
1113
if (net_sinks.size () == 1 ) {
1106
1114
auto sink_pin_id = *(net_sinks.begin ());
1107
1115
return atom_nlist.pin_block (sink_pin_id);
You can’t perform that action at this time.
0 commit comments