diff --git a/vpr/src/pack/pack_patterns.cpp b/vpr/src/pack/pack_patterns.cpp
index dfd5d9d..af13476 100644
--- a/vpr/src/pack/pack_patterns.cpp
+++ b/vpr/src/pack/pack_patterns.cpp
@@ -56,10 +56,6 @@
                                 const AtomNetlist& netlist);
 
 static AtomPinId find_matching_pin(const AtomNetlist::pin_range pin_range, const t_netlist_pack_pattern_pin& pattern_pin, const AtomNetlist& netlist);
-static AtomPinId find_matching_pin(const AtomNetlist::pin_range pin_range, const t_netlist_pack_pattern_pin& pattern_pin,
-                                   const std::set<AtomBlockId>& excluded_blocks, const AtomNetlist& netlist);
-static AtomBlockId find_parent_pattern_root(const AtomBlockId blk, const t_netlist_pack_pattern& pattern, const AtomNetlist& netlist);
-static bool matches_pattern_root(const AtomBlockId blk, const t_netlist_pack_pattern& pattern, const AtomNetlist& netlist);
 static bool matches_pattern_node(const AtomBlockId blk, const t_netlist_pack_pattern_node& pattern_node, const AtomNetlist& netlist);
 static bool is_wildcard_node(const t_netlist_pack_pattern_node& pattern_node);
 static bool is_wildcard_pin(const t_netlist_pack_pattern_pin& pattern_pin);
@@ -724,93 +720,14 @@
 
 static AtomPinId find_matching_pin(const AtomNetlist::pin_range pin_range, const t_netlist_pack_pattern_pin& pattern_pin,
                                    const AtomNetlist& netlist) {
-    return find_matching_pin(pin_range, pattern_pin, {}, netlist);
-}
-
-static AtomPinId find_matching_pin(const AtomNetlist::pin_range pin_range, const t_netlist_pack_pattern_pin& pattern_pin,
-                                   const std::set<AtomBlockId>& excluded_blocks, const AtomNetlist& netlist) {
-
     for (AtomPinId pin : pin_range) {
         if (matches_pattern_pin(pin, pattern_pin, netlist)) {
-
-            if (excluded_blocks.count(netlist.pin_block(pin))) {
-                continue;
-            } else {
-                return pin;
-            }
+            return pin;
         }
     }
-
     return AtomPinId::INVALID(); //No match
 }
 
-//Returns a parent block of blk, if it is also a valid root for pattern
-static AtomBlockId find_parent_pattern_root(const AtomBlockId blk, const t_netlist_pack_pattern& pattern, const AtomNetlist& netlist) {
-    int pattern_node_id = pattern.root_node;
-
-    VTR_ASSERT_SAFE(matches_pattern_root(blk, pattern, netlist));
-
-    //Find an upstream block which is also a valid root
-    for (auto pins : {netlist.block_input_pins(blk), netlist.block_clock_pins(blk)}) { //Current blocks inputs
-        for (int pattern_edge_id : pattern.nodes[pattern_node_id].out_edge_ids) { //Root out edges
-            for (const auto& pattern_pin : pattern.edges[pattern_edge_id].to_pins) { //Edge pins
-
-                //Do the inputs of the current block match the output edges of the root pattern?
-                AtomPinId to_pin = find_matching_pin(pins, pattern_pin, netlist);
-                if (!to_pin) continue;
-
-                AtomNetId in_net = netlist.pin_net(to_pin);
-                AtomBlockId from_blk = netlist.net_driver_block(in_net);
-
-                if (!matches_pattern_root(from_blk, pattern, netlist)) continue;
-
-                return from_blk;
-            }
-        }
-    }
-
-    return AtomBlockId::INVALID();
-}
-
-//Returns true if matches the pattern root node (and it's out-going edges)
-static bool matches_pattern_root(const AtomBlockId blk, const t_netlist_pack_pattern& pattern, const AtomNetlist& netlist) {
-    int pattern_node_id = pattern.root_node;
-
-    if (!matches_pattern_node(blk, pattern.nodes[pattern_node_id], netlist)) {
-        return false; 
-    }
-
-    for (int pattern_edge_id : pattern.nodes[pattern_node_id].out_edge_ids) {
-        const auto& pattern_edge = pattern.edges[pattern_edge_id];
-
-        AtomPinId from_pin = find_matching_pin(netlist.block_output_pins(blk), pattern_edge.from_pin, netlist);
-        if (!from_pin) {
-            //No matching driver pin
-            return false;
-        }
-
-        AtomNetId net = netlist.pin_net(from_pin);
-        auto net_sinks = netlist.net_sinks(net);
-
-        for (size_t isink = 0; isink < pattern_edge.to_pins.size(); ++isink) {
-            const auto& to_pattern_pin = pattern_edge.to_pins[isink];
-
-            AtomPinId to_pin = find_matching_pin(net_sinks, to_pattern_pin, netlist);
-            if (!to_pin) {
-
-                if (to_pattern_pin.required) {
-                    //Required: give-up
-                    return false;
-                } else {
-                    //Optional: try next pattern pin
-                    continue;
-                }
-            }
-        }
-    }
-    return true;
-}
-
 static bool matches_pattern_node(const AtomBlockId blk, const t_netlist_pack_pattern_node& pattern_node, const AtomNetlist& netlist) {
     if (is_wildcard_node(pattern_node)) {
         return true; //Wildcard
