def apply_move()

in design_utils/des_handler.py [0:0]


    def apply_move(self, des_tup, move_to_apply):
        ex_dp, sim_dp = des_tup
        blck_ref = move_to_apply.get_block_ref()
        #print("applying move  " +  move.name + " -----" )
        #pre_moved_ex = copy.deepcopy(ex_dp)  # this is just for move sanity checking
        gc.disable()
        pre_moved_ex = cPickle.loads(cPickle.dumps(ex_dp, -1))
        gc.enable()

        if move_to_apply.get_transformation_name() == "identity":
            return ex_dp, True
        if move_to_apply.get_transformation_name() == "swap":
            if not blck_ref.type == "ic": self.unload_buses(ex_dp)  # unload buses
            else: self.unload_read_buses(ex_dp)  # unload buses
            succeeded = self.swap_block(blck_ref, move_to_apply.get_des_block())
            #succeeded = self.mig_cur_tasks_of_src_to_dest(move_to_apply.get_block_ref(), move_to_apply.get_des_block())  # migrate tasks over
            succeeded = self.mig_tasks_of_src_to_dest(ex_dp, blck_ref,
                                                      move_to_apply.get_des_block(), move_to_apply.get_tasks())
            self.unload_buses(ex_dp)  # unload buses
            self.unload_read_mem(ex_dp)  # unload memories
            ex_dp.hardware_graph.update_graph(block_to_prime_with=move_to_apply.get_des_block())  # update the hardware graph
            if config.DEBUG_SANITY:ex_dp.sanity_check() # sanity check
        elif move_to_apply.get_transformation_name() == "split":
            self.unload_buses(ex_dp)  # unload buss
            if blck_ref.type == "ic":
                succeeded,_ = self.fork_bus(ex_dp, blck_ref, move_to_apply.get_tasks())
            else:
                succeeded,_ = self.fork_block(ex_dp, blck_ref, move_to_apply.get_tasks())
            if config.DEBUG_SANITY:ex_dp.sanity_check() # sanity check
        elif move_to_apply.get_transformation_name() == "split_swap":
            # first split
            previous_designs_blocks = ex_dp.get_blocks()
            self.unload_buses(ex_dp)  # unload buss
            if blck_ref.type == "ic":
                succeeded, new_block = self.fork_bus(ex_dp, blck_ref, move_to_apply.get_tasks())
            else:
                succeeded, new_block = self.fork_block(ex_dp, blck_ref, move_to_apply.get_tasks())
            ex_dp.hardware_graph.update_graph(block_to_prime_with=blck_ref)  # update the hardware graph
            if succeeded:
                """
                current_blocks = ex_dp.get_blocks()
                new_block = list(set(current_blocks) - set(previous_designs_blocks))[0]

                # we need to do this, because sometimes the migrant tasks are swap and hence the new block gets the
                # other migrant tasks
                if len(new_block.get_tasks_of_block()) == 1:
                    block_to_swap = new_block
                else:
                    block_to_swap =blck_ref
                """
                block_to_swap = new_block
                if config.DEBUG_SANITY:ex_dp.sanity_check() # sanity check
                succeeded = self.swap_block(block_to_swap, move_to_apply.get_des_block())
                succeeded = self.mig_tasks_of_src_to_dest(ex_dp, block_to_swap,
                                                          move_to_apply.get_des_block(), move_to_apply.get_tasks())
                self.unload_buses(ex_dp)  # unload buses
                self.unload_read_mem(ex_dp)  # unload memories
                ex_dp.hardware_graph.update_graph(block_to_prime_with=move_to_apply.get_des_block())  # update the hardware graph
            else:
                print("something went wrong with split swap")

            if config.DEBUG_SANITY:ex_dp.sanity_check() # sanity check
        elif  move_to_apply.get_transformation_name() == "cleanup":
            self.unload_buses(ex_dp)  # unload buses
            self.unload_read_mem(ex_dp)  # unload memories
            if move_to_apply.get_transformation_sub_name() == "absorb":
                ref_block_neighs = blck_ref.get_neighs()
                for block in ref_block_neighs:
                    block.disconnect(blck_ref)
                    block.connect(move_to_apply.get_des_block())
                ex_dp.hardware_graph.update_graph_without_prunning(block_to_prime_with=move_to_apply.get_des_block())  # update the hardware graph
                succeeded = True
            else:
                if not blck_ref.type == "ic":  # ic migration is not supported
                    succeeded = self.mig_tasks_of_src_to_dest(ex_dp, blck_ref, move_to_apply.get_des_block(), move_to_apply.get_tasks())

                    ex_dp.hardware_graph.update_graph(block_to_prime_with=move_to_apply.get_des_block())  # update the hardware graph
                else:
                    succeeded = False
            if config.DEBUG_SANITY:ex_dp.sanity_check() # sanity check
        elif move_to_apply.get_transformation_name() == "migrate" or move_to_apply.get_transformation_name() == "cleanup":
            self.unload_buses(ex_dp)  # unload buses
            self.unload_read_mem(ex_dp)  # unload memories
            if not blck_ref.type == "ic":  # ic migration is not supported
                succeeded = self.mig_tasks_of_src_to_dest(ex_dp, blck_ref, move_to_apply.get_des_block(), move_to_apply.get_tasks())

                ex_dp.hardware_graph.update_graph(block_to_prime_with=move_to_apply.get_des_block())  # update the hardware graph
            else:
                succeeded = False
            if config.DEBUG_SANITY:ex_dp.sanity_check() # sanity check
        elif move_to_apply.get_transformation_name() == "dram_fix":
            self.unload_buses(ex_dp)  # unload buses
            self.unload_read_mem(ex_dp)  # unload memories
            self.fix_dram(ex_dp)
            ex_dp.hardware_graph.update_graph_without_prunning()  # update the hardware graph
            succeeded = True
        elif move_to_apply.get_transformation_name() == "transfer":
            self.unload_buses(ex_dp)  # unload buses
            self.unload_read_mem(ex_dp)  # unload memories
            src_block = blck_ref # memory to move
            src_block_ic = [el for el in src_block.get_neighs() if el.subtype == "ic"][0]
            dest_block = move_to_apply.get_des_block()  # destination Ic
            src_block.disconnect(src_block_ic)
            dest_block_ic = [el for el in dest_block.get_neighs() if el.subtype == "ic"][0]
            dest_block_ic.connect(src_block)
            ex_dp.hardware_graph.update_graph(src_block)  # update the hardware graph
            succeeded = True
        elif move_to_apply.get_transformation_name() == "routing":
            self.unload_buses(ex_dp)  # unload buses
            self.unload_read_mem(ex_dp)  # unload memories
            src_block = blck_ref # memory to move
            dest_block = move_to_apply.get_des_block()  # destination Ic
            src_block.connect(dest_block)
            ex_dp.hardware_graph.update_graph(dest_block)  # update the hardware graph
            succeeded = True
        else:
            raise Exception("transformation :" + move_to_apply.get_transformation_name() + " is not supported")

        ex_dp.hardware_graph.pipe_design()
        return ex_dp, succeeded