in design_utils/components/hardware.py [0:0]
def cluster_pipes(self):
self.pipe_clusters = []
for block in self.blocks:
block.reset_clusters()
def traffic_overlaps(blck_pipe, neigh_pipe):
blck_pipe_traffic = blck_pipe.get_traffic_names()
neigh_pipe_traffic = neigh_pipe.get_traffic_names()
traffic_non_overlap = list(set(blck_pipe_traffic) - set(neigh_pipe_traffic))
return len(traffic_non_overlap) < len(blck_pipe_traffic)
if (len(self.pipes) == 0):
print("something is wrong")
assert(len(self.pipes) > 0), "you need to assign pipes first"
pipe_cluster_dict = {}
# iterate through blocks and neighbours to generate clusters
for block in self.blocks:
pipe_cluster_dict[block] = {}
for neigh in block.get_neighs():
if neigh.type == "pe": continue
for dir in self.get_pipe_dir(block):
if dir not in pipe_cluster_dict[block]: pipe_cluster_dict[block][dir] = {}
# get the pipes
block_pipes = block.get_pipes(dir)
neigh_pipes = neigh.get_pipes(dir)
if block_pipes == [] and block.type == "pe":
pipe_cluster_dict[block][dir] = {}
for neigh_pipe in neigh_pipes:
if neigh_pipe.master == block and neigh_pipe.dir == dir:
pipe_cluster_dict[block][dir][neigh_pipe] = []
elif block.type == "mem":
pipe_cluster_dict[block][dir] = {}
pipe_cluster_dict[block][dir][None] = block_pipes
elif block.type == "ic":
if dir not in pipe_cluster_dict[block]:
pipe_cluster_dict[block][dir] = {}
for blck_pipe in block_pipes:
for neigh_pipe in neigh_pipes:
if not blck_pipe.slave == neigh_pipe.master:
continue
if not(blck_pipe.dir == neigh_pipe.dir):
continue
if traffic_overlaps(blck_pipe, neigh_pipe):
if neigh_pipe not in pipe_cluster_dict[block][dir].keys():
pipe_cluster_dict[block][dir][neigh_pipe] = []
if blck_pipe not in pipe_cluster_dict[block][dir][neigh_pipe]:
pipe_cluster_dict[block][dir][neigh_pipe].append(blck_pipe)
# now generates the clusters
for block, dir_outgoing_incoming_pipes in pipe_cluster_dict.items():
for dir, outgoing_pipe_incoming_pipes in dir_outgoing_incoming_pipes.items():
for outgoing_pipe, incoming_pipes in outgoing_pipe_incoming_pipes.items():
pipe_cluster_ = PipeCluster(block, dir, outgoing_pipe, incoming_pipes, self.last_cluster_assigned_number)
if outgoing_pipe: # for pe and ic
if outgoing_pipe.master.type == "pe": # only push once
pipe_cluster_.change_to_dummy(outgoing_pipe.master.get_tasks_of_block())
if len(outgoing_pipe.master.get_pipe_clusters()) == 0:
outgoing_pipe.master.set_pipe_cluster(pipe_cluster_)
else:
outgoing_pipe.master.set_pipe_cluster(pipe_cluster_)
elif incoming_pipes: # for mem
incoming_pipes[0].slave.set_pipe_cluster(pipe_cluster_)
self.last_cluster_assigned_number += 1
self.pipe_clusters.append(pipe_cluster_)
pass