def is_definitely_not_taken(self, edge: InterstateEdge) -> bool: """ Returns True iff edge condition definitely evaluates to False. """ if edge.is_unconditional(): return False # Evaluate condition scond = edge.condition_sympy() if scond == False: return True # Indeterminate or True condition return False
def get_vertical_loop_section_sdfg(section: "VerticalLoopSection") -> SDFG: from gtc.dace.nodes import HorizontalExecutionLibraryNode sdfg = SDFG("VerticalLoopSection_" + str(id(section))) old_state = sdfg.add_state("start_state", is_start_state=True) for he in section.horizontal_executions: new_state = sdfg.add_state("HorizontalExecution_" + str(id(he)) + "_state") sdfg.add_edge(old_state, new_state, InterstateEdge()) new_state.add_node(HorizontalExecutionLibraryNode(oir_node=he)) old_state = new_state return sdfg
def apply(self, sdfg): # Obtain loop information guard: sd.SDFGState = sdfg.node(self.subgraph[DetectLoop._loop_guard]) begin: sd.SDFGState = sdfg.node(self.subgraph[DetectLoop._loop_begin]) after_state: sd.SDFGState = sdfg.node( self.subgraph[DetectLoop._exit_state]) # Remove edge from guard to after state for e in sdfg.out_edges(guard): if e.dst == after_state: sdfg.remove_edge(e) # Find the backedge and move it edges = list(sdfg.out_edges(begin)) while len(edges) > 0: e = edges.pop() if e.dst == guard: # Bypass guard and go directly to after-state sdfg.remove_edge(e) sdfg.add_edge(e.src, after_state, InterstateEdge()) else: edges += list(sdfg.out_edges(e.dst))
def insert_sdfg_element(sdfg_str, type, parent_uuid, edge_a_uuid): sdfg_answer = load_sdfg_from_json(sdfg_str) sdfg = sdfg_answer['sdfg'] uuid = 'error' ret = find_graph_element_by_uuid(sdfg, parent_uuid) parent = ret['element'] libname = None if type is not None and isinstance(type, str): split_type = type.split('|') if len(split_type) == 2: type = split_type[0] libname = split_type[1] if type == 'SDFGState': if parent is None: parent = sdfg elif isinstance(parent, nodes.NestedSDFG): parent = parent.sdfg state = parent.add_state() uuid = [get_uuid(state)] elif type == 'AccessNode': arrays = list(parent.parent.arrays.keys()) if len(arrays) == 0: parent.parent.add_array('tmp', [1], dtype=dtypes.float64) arrays = list(parent.parent.arrays.keys()) node = parent.add_access(arrays[0]) uuid = [get_uuid(node, parent)] elif type == 'Map': map_entry, map_exit = parent.add_map('map', dict(i='0:1')) uuid = [get_uuid(map_entry, parent), get_uuid(map_exit, parent)] elif type == 'Consume': consume_entry, consume_exit = parent.add_consume('consume', ('i', '1')) uuid = [get_uuid(consume_entry, parent), get_uuid(consume_exit, parent)] elif type == 'Tasklet': tasklet = parent.add_tasklet( name='placeholder', inputs={'in'}, outputs={'out'}, code='') uuid = [get_uuid(tasklet, parent)] elif type == 'NestedSDFG': sub_sdfg = SDFG('nested_sdfg') sub_sdfg.add_array('in', [1], dtypes.float32) sub_sdfg.add_array('out', [1], dtypes.float32) nsdfg = parent.add_nested_sdfg(sub_sdfg, sdfg, {'in'}, {'out'}) uuid = [get_uuid(nsdfg, parent)] elif type == 'LibraryNode': if libname is None: return { 'error': { 'message': 'Failed to add library node', 'details': 'Must provide a valid library node type', }, } libnode_class = pydoc.locate(libname) libnode = libnode_class() parent.add_node(libnode) uuid = [get_uuid(libnode, parent)] elif type == 'Edge': edge_start_ret = find_graph_element_by_uuid(sdfg, edge_a_uuid) edge_start = edge_start_ret['element'] edge_parent = edge_start_ret['parent'] if edge_start is not None: if edge_parent is None: edge_parent = sdfg if isinstance(edge_parent, SDFGState): if not (isinstance(edge_start, nodes.Node) and isinstance(parent, nodes.Node)): return { 'error': { 'message': 'Failed to add edge', 'details': 'Must connect two nodes or two states', }, } memlet = Memlet() edge_parent.add_edge(edge_start, None, parent, None, memlet) elif isinstance(edge_parent, SDFG): if not (isinstance(edge_start, SDFGState) and isinstance(parent, SDFGState)): return { 'error': { 'message': 'Failed to add edge', 'details': 'Must connect two nodes or two states', }, } isedge = InterstateEdge() edge_parent.add_edge(edge_start, parent, isedge) uuid = ['NONE'] else: raise ValueError('No edge starting point provided') old_meta = disable_save_metadata() new_sdfg_str = sdfg.to_json() restore_save_metadata(old_meta) return { 'sdfg': new_sdfg_str, 'uuid': uuid, }