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