diff --git a/hog/operator_generation/loop_strategies.py b/hog/operator_generation/loop_strategies.py index c49aad6a55bda5fd3c1772bd41ba38f8ea0e101a..5ecac2e05b90d10e6f5e70bd78cf6527d242a3d1 100644 --- a/hog/operator_generation/loop_strategies.py +++ b/hog/operator_generation/loop_strategies.py @@ -226,47 +226,57 @@ class FUSEDROWS(LoopStrategy): ) super(FUSEDROWS, self).__init__() - def create_loop(self, dim, element_index, micro_edges_per_macro_edge): + def create_loop( + self, + ctx: KernelCreationContext, + dim: int, + micro_edges_per_macro_edge: int, + loop_bodies: Dict[Union[FaceType, CellType], PsBlock], + pre_loop_stmts: Dict[Union[FaceType, CellType], PsBlock] = {}, + ) -> PsBlock: """create a single loop with and x-dim loop for each micro element type in the innermost dimension.""" - element_loops = create_micro_element_loops(dim, micro_edges_per_macro_edge) - (fused_loop, bodies) = fuse_loops_over_simplex( - [elem_loop for elem_loop in element_loops.values()], 1, dim + raise NotImplementedError( + "FUSEDROWS loop strategy has not been adapted to the new backend and is to be reimplemented in a more flexible manner (think arbitrary loop blocking)." ) - assert len(bodies) == 2 * 3 ** (dim - 2) - if dim == 2: - element_type: Union[Type[FaceType], Type[CellType]] = FaceType - else: - element_type = CellType - self.bodies = { - eType: body - for eType, body in zip([eType for eType in element_type], bodies) - } - - return fused_loop - - def add_body_to_loop(self, loop, body, element_type): - body = Block(body) - self.bodies[element_type].parent.body = body - body.parent = self.bodies[element_type].parent - self.bodies[element_type] = body - - def add_preloop_for_loop(self, loops, preloop_stmts, element_type): - if not isinstance(loops, list): - loops = [loops] - preloop_stmts_lhs_subs = { - stmt.lhs: get_element_replacement(stmt.lhs, element_type) - for stmt in preloop_stmts - } - - body = self.bodies[element_type] - assert isinstance(body, Block), f"Encountered body that is not a Block: {body}" - body.fast_subs(preloop_stmts_lhs_subs) - - new_preloop_stmts = [ - stmt.fast_subs(preloop_stmts_lhs_subs) for stmt in preloop_stmts - ] - - return new_preloop_stmts + loops + # element_loops = create_micro_element_loops(dim, micro_edges_per_macro_edge) + # (fused_loop, bodies) = fuse_loops_over_simplex( + # [elem_loop for elem_loop in element_loops.values()], 1, dim + # ) + # assert len(bodies) == 2 * 3 ** (dim - 2) + # if dim == 2: + # element_type: Union[Type[FaceType], Type[CellType]] = FaceType + # else: + # element_type = CellType + # self.bodies = { + # eType: body + # for eType, body in zip([eType for eType in element_type], bodies) + # } + + # return fused_loop + + # def add_body_to_loop(self, loop, body, element_type): + # body = Block(body) + # self.bodies[element_type].parent.body = body + # body.parent = self.bodies[element_type].parent + # self.bodies[element_type] = body + + # def add_preloop_for_loop(self, loops, preloop_stmts, element_type): + # if not isinstance(loops, list): + # loops = [loops] + # preloop_stmts_lhs_subs = { + # stmt.lhs: get_element_replacement(stmt.lhs, element_type) + # for stmt in preloop_stmts + # } + + # body = self.bodies[element_type] + # assert isinstance(body, Block), f"Encountered body that is not a Block: {body}" + # body.fast_subs(preloop_stmts_lhs_subs) + + # new_preloop_stmts = [ + # stmt.fast_subs(preloop_stmts_lhs_subs) for stmt in preloop_stmts + # ] + + # return new_preloop_stmts + loops def __str__(self): return "FUSEDROWS"