@@ -99,7 +99,9 @@ static void find_all_equivalent_chains(t_pack_patterns* chain_pattern, const t_p
99
99
static void update_chain_root_pins (t_pack_patterns* chain_pattern,
100
100
const std::vector<t_pb_graph_pin*>& chain_input_pins);
101
101
102
- static void get_all_connected_primitive_pins (const t_pb_graph_pin* cluster_input_pin, std::vector<t_pb_graph_pin*>& connected_primitive_pins);
102
+ static void get_all_connected_primitive_pins (const t_pb_graph_pin* cluster_input_pin,
103
+ const std::unordered_set<t_pb_type*>& pattern_blocks,
104
+ std::vector<t_pb_graph_pin*>& connected_primitive_pins);
103
105
104
106
static void init_molecule_chain_info (const AtomBlockId blk_id,
105
107
t_pack_molecule& molecule,
@@ -1613,9 +1615,10 @@ static void update_chain_root_pins(t_pack_patterns* chain_pattern,
1613
1615
const std::vector<t_pb_graph_pin*>& chain_input_pins) {
1614
1616
std::vector<std::vector<t_pb_graph_pin*>> primitive_input_pins;
1615
1617
1618
+ std::unordered_set<t_pb_type*> pattern_blocks = get_pattern_blocks (chain_pattern);
1616
1619
for (const auto pin_ptr : chain_input_pins) {
1617
1620
std::vector<t_pb_graph_pin*> connected_primitive_pins;
1618
- get_all_connected_primitive_pins (pin_ptr, connected_primitive_pins);
1621
+ get_all_connected_primitive_pins (pin_ptr, pattern_blocks, connected_primitive_pins);
1619
1622
1620
1623
/* *
1621
1624
* It is required that the chain pins are connected inside a complex
@@ -1639,7 +1642,9 @@ static void update_chain_root_pins(t_pack_patterns* chain_pattern,
1639
1642
* the Cin pin of all the adder primitives connected to this pin. Which is for typical architectures
1640
1643
* will be only one pin connected to the very first adder in the cluster.
1641
1644
*/
1642
- static void get_all_connected_primitive_pins (const t_pb_graph_pin* cluster_input_pin, std::vector<t_pb_graph_pin*>& connected_primitive_pins) {
1645
+ static void get_all_connected_primitive_pins (const t_pb_graph_pin* cluster_input_pin,
1646
+ const std::unordered_set<t_pb_type*>& pattern_blocks,
1647
+ std::vector<t_pb_graph_pin*>& connected_primitive_pins) {
1643
1648
/* Skip pins for modes that are disabled for packing*/
1644
1649
if ((nullptr != cluster_input_pin->parent_node ->pb_type ->parent_mode )
1645
1650
&& (true == cluster_input_pin->parent_node ->pb_type ->parent_mode ->disable_packing )) {
@@ -1650,9 +1655,11 @@ static void get_all_connected_primitive_pins(const t_pb_graph_pin* cluster_input
1650
1655
const auto & output_edge = cluster_input_pin->output_edges [iedge];
1651
1656
for (int ipin = 0 ; ipin < output_edge->num_output_pins ; ipin++) {
1652
1657
if (output_edge->output_pins [ipin]->is_primitive_pin ()) {
1653
- connected_primitive_pins.push_back (output_edge->output_pins [ipin]);
1658
+ if (pattern_blocks.find (output_edge->output_pins [ipin]->parent_node ->pb_type ) != pattern_blocks.end ()) {
1659
+ connected_primitive_pins.push_back (output_edge->output_pins [ipin]);
1660
+ }
1654
1661
} else {
1655
- get_all_connected_primitive_pins (output_edge->output_pins [ipin], connected_primitive_pins);
1662
+ get_all_connected_primitive_pins (output_edge->output_pins [ipin], pattern_blocks, connected_primitive_pins);
1656
1663
}
1657
1664
}
1658
1665
}
0 commit comments