def replicate_scope(sdfg: SDFG, state: SDFGState, scope: ScopeSubgraphView) -> ScopeSubgraphView: """ Replicates a scope subgraph view within a state, reconnecting all external edges to the same nodes. :param sdfg: The SDFG in which the subgraph scope resides. :param state: The SDFG state in which the subgraph scope resides. :param scope: The scope subgraph to replicate. :return: A reconnected replica of the scope. """ exit_node = state.exit_node(scope.entry) # Replicate internal graph new_nodes = [] new_entry = None new_exit = None to_find_new_names: Set[nodes.AccessNode] = set() for node in scope.nodes(): node_copy = copy.deepcopy(node) if node == scope.entry: new_entry = node_copy elif node == exit_node: new_exit = node_copy if (isinstance(node, nodes.AccessNode) and node.desc(sdfg).lifetime == dtypes.AllocationLifetime.Scope and node.desc(sdfg).transient): to_find_new_names.add(node_copy) state.add_node(node_copy) new_nodes.append(node_copy) for edge in scope.edges(): src = scope.nodes().index(edge.src) dst = scope.nodes().index(edge.dst) state.add_edge(new_nodes[src], edge.src_conn, new_nodes[dst], edge.dst_conn, copy.deepcopy(edge.data)) # Reconnect external scope nodes for edge in state.in_edges(scope.entry): state.add_edge(edge.src, edge.src_conn, new_entry, edge.dst_conn, copy.deepcopy(edge.data)) for edge in state.out_edges(exit_node): state.add_edge(new_exit, edge.src_conn, edge.dst, edge.dst_conn, copy.deepcopy(edge.data)) # Set the exit node's map to match the entry node new_exit.map = new_entry.map # Replicate all temporary transients within scope for node in to_find_new_names: desc = node.desc(sdfg) new_name = sdfg.add_datadesc(node.data, copy.deepcopy(desc), find_new_name=True) node.data = new_name for edge in state.all_edges(node): for e in state.memlet_tree(edge): e.data.data = new_name return ScopeSubgraphView(state, new_nodes, new_entry)
def replicate_scope(sdfg: SDFG, state: SDFGState, scope: ScopeSubgraphView) -> ScopeSubgraphView: """ Replicates a scope subgraph view within a state, reconnecting all external edges to the same nodes. :param sdfg: The SDFG in which the subgraph scope resides. :param state: The SDFG state in which the subgraph scope resides. :param scope: The scope subgraph to replicate. :return: A reconnected replica of the scope. """ exit_node = state.exit_node(scope.entry) # Replicate internal graph new_nodes = [] new_entry = None new_exit = None for node in scope.nodes(): node_copy = copy.deepcopy(node) if node == scope.entry: new_entry = node_copy elif node == exit_node: new_exit = node_copy state.add_node(node_copy) new_nodes.append(node_copy) for edge in scope.edges(): src = scope.nodes().index(edge.src) dst = scope.nodes().index(edge.dst) state.add_edge(new_nodes[src], edge.src_conn, new_nodes[dst], edge.dst_conn, copy.deepcopy(edge.data)) # Reconnect external scope nodes for edge in state.in_edges(scope.entry): state.add_edge(edge.src, edge.src_conn, new_entry, edge.dst_conn, copy.deepcopy(edge.data)) for edge in state.out_edges(exit_node): state.add_edge(new_exit, edge.src_conn, edge.dst, edge.dst_conn, copy.deepcopy(edge.data)) # Set the exit node's map to match the entry node new_exit.map = new_entry.map return ScopeSubgraphView(state, new_nodes, new_entry)
def nsdfg_prepare_unroll(self, scope: ScopeSubgraphView, paramname: str, paramval: str): backup = [] for node in scope.nodes(): if (isinstance(node, nd.NestedSDFG)): backup.append((node, node.unique_name, node.sdfg.name, node.symbol_mapping, node.sdfg.constants_prop)) node.unique_name = copy.deepcopy(node.unique_name) node.sdfg.name = copy.deepcopy(node.sdfg.name) node.symbol_mapping = copy.deepcopy(node.symbol_mapping) node.sdfg.constants_prop = copy.deepcopy( node.sdfg.constants_prop) node.unique_name = f"{node.unique_name}_{paramname}{paramval}" node.sdfg.name = f"{node.sdfg.name}_{paramname}{paramval}" for nstate in node.sdfg.nodes(): backup.extend( self.nsdfg_prepare_unroll(nstate, paramname, paramval)) if paramname in node.symbol_mapping: node.symbol_mapping.pop(paramname) node.sdfg.add_constant(paramname, int(paramval)) return backup