Ejemplo n.º 1
0
 def test_return_node_number(self):
     self.assertEqual(return_node_number(0, 0, 0), 0)
     for k in range(0, Config.ag.z_size):
         for j in range(0, Config.ag.y_size):
             for i in range(0, Config.ag.x_size):
                 self.assertEqual(return_node_number(i, j, k),
                                  i + j*Config.ag.x_size+k*Config.ag.y_size*Config.ag.x_size)
     self.assertEqual(return_node_number(Config.ag.x_size-1, Config.ag.y_size-1, Config.ag.z_size-1),
                      Config.ag.x_size * Config.ag.y_size * Config.ag.z_size - 1)
Ejemplo n.º 2
0
 def test_return_node_number(self):
     self.assertEqual(return_node_number(0, 0, 0), 0)
     for k in range(0, Config.Network_Z_Size):
         for j in range(0, Config.Network_Y_Size):
             for i in range(0, Config.Network_X_Size):
                 self.assertEqual(
                     return_node_number(i, j,
                                        k), i + j * Config.Network_X_Size +
                     k * Config.Network_Y_Size * Config.Network_X_Size)
     self.assertEqual(
         return_node_number(Config.Network_X_Size - 1,
                            Config.Network_Y_Size - 1,
                            Config.Network_Z_Size - 1),
         Config.Network_X_Size * Config.Network_Y_Size *
         Config.Network_Z_Size - 1)
def merge_node_with_rectangles(rectangle_list, unreachable_node_list):
    """

    :param rectangle_list:
    :param unreachable_node_list: un-reachable nodes that are initially populating the unreachable list
    :return: rectangle list
    """
    # todo: in this function if we can not perform any loss-less merge, we terminate the process...
    # which is bad... we need to make sure that this node is covered
    for unreachable_node in unreachable_node_list:
        covered = False
        for rectangle in rectangle_list:
            if rectangle_list[rectangle][0] is None:
                # there is no entry, this is the first node to get in...
                rectangle_list[rectangle] = (unreachable_node, unreachable_node)
                covered = True
                break
            else:
                if is_node_inside_rectangle(rectangle_list[rectangle], unreachable_node):
                    covered = True
                    break
                else:

                    location_1, location_2 = merge_rectangle_with_node(rectangle_list[rectangle][0],
                                                                       rectangle_list[rectangle][1],
                                                                       unreachable_node)
                    # print ("Merged:" location_1, location_2)
                    loss_less_merge = True
                    for network_node_x in range(location_1[0], location_2[0]+1):        # (merged_x_1, merged_x_2+1)
                        for network_node_y in range(location_1[1], location_2[1]+1):
                            for network_node_z in range(location_1[2], location_2[2]+1):
                                node_number = return_node_number(network_node_x, network_node_y, network_node_z)
                                if node_number not in unreachable_node_list:
                                    loss_less_merge = False
                                    break
                    # if we are not losing any Node, we perform Merge...
                    if loss_less_merge:
                        #                                            merged X      Merged Y       Merged Z
                        merged_1 = return_node_number(location_1[0], location_1[1], location_1[2])
                        merged_2 = return_node_number(location_2[0], location_2[1], location_2[2])
                        rectangle_list[rectangle] = deepcopy((merged_1, merged_2))
                        covered = True
                        break
        if not covered:
            pass
            # print ("COULD NOT PERFORM ANY LOSS-LESS MERGE FOR:"+str(UnreachableNode))
            # print (RectangleList)
    return rectangle_list
Ejemplo n.º 4
0
 def test_manhattan_distance(self):
     self.assertEqual(manhattan_distance(0, 0), 0)
     last_node_number = return_node_number(Config.Network_X_Size - 1,
                                           Config.Network_Y_Size - 1,
                                           Config.Network_Z_Size - 1)
     self.assertEqual(
         manhattan_distance(0, last_node_number), Config.Network_X_Size +
         Config.Network_Y_Size + Config.Network_Z_Size - 3)
Ejemplo n.º 5
0
 def test_return_node_location(self):
     for k in range(0, Config.Network_Z_Size):
         for j in range(0, Config.Network_Y_Size):
             for i in range(0, Config.Network_X_Size):
                 # we have the assumption that return_node_number is fully tested...
                 self.assertEqual(
                     return_node_location(return_node_number(i, j, k)),
                     (i, j, k))
Ejemplo n.º 6
0
 def test_manhattan_distance(self):
     self.assertEqual(manhattan_distance(0, 0), 0)
     last_node_number = return_node_number(Config.ag.x_size - 1,
                                           Config.ag.y_size - 1,
                                           Config.ag.z_size - 1)
     self.assertEqual(
         manhattan_distance(0, last_node_number),
         Config.ag.x_size + Config.ag.y_size + Config.ag.z_size - 3)
Ejemplo n.º 7
0
    def test_generate_generic_topology_ag(self):
        temp_x = Config.ag.x_size
        temp_y = Config.ag.y_size
        temp_z = Config.ag.z_size
        size_z = 1
        for size_y in range(2, 5):
            for size_x in range(2, 5):
                for topology in ['2DMesh', '2DTorus', '2DRing', '2DLine']:
                    Config.ag.x_size = size_x
                    Config.ag.y_size = size_y
                    Config.ag.z_size = size_z
                    ag_4_test = copy.deepcopy(generate_generic_topology_ag(topology, None))
                    self.assertEqual(len(ag_4_test.nodes()), size_x*size_y*size_z, msg=str(ag_4_test.nodes()))
                    # --------------------------------------------
                    if topology is '2DMesh':
                        link_counter = 0
                        for j in range(0, size_y):
                            for i in range(0, size_x-1):
                                source = return_node_number(i, j, 0)
                                destination = return_node_number(i+1, j, 0)
                                self.assertTrue(ag_4_test.has_edge(source, destination))
                                self.assertTrue(ag_4_test.has_edge(destination, source))
                                link_counter += 2

                        for j in range(0, size_y-1):
                            for i in range(0, size_x):
                                source = return_node_number(i, j, 0)
                                destination = return_node_number(i, j+1, 0)
                                self.assertTrue(ag_4_test.has_edge(source, destination))
                                self.assertTrue(ag_4_test.has_edge(destination, source))
                                link_counter += 2

                        self.assertEqual(link_counter, len(ag_4_test.edges()), msg="link_counter: " +
                                         str(link_counter) + " number of edges: " + str(len(ag_4_test.edges())) +
                                         " topology: "+str(topology))
                    # --------------------------------------------
                    if topology is '2DTorus':
                        link_list = []
                        for j in range(0, size_y):
                            for i in range(0, size_x-1):
                                source = return_node_number(i, j, 0)
                                destination = return_node_number(i+1, j, 0)
                                self.assertTrue(ag_4_test.has_edge(source, destination))
                                self.assertTrue(ag_4_test.has_edge(destination, source))
                                if (source, destination) not in link_list:
                                    link_list.append((source, destination))
                                if (destination, source) not in link_list:
                                    link_list.append((destination, source))

                        for j in range(0, size_y-1):
                            for i in range(0, size_x):
                                source = return_node_number(i, j, 0)
                                destination = return_node_number(i, j+1, 0)
                                self.assertTrue(ag_4_test.has_edge(source, destination),
                                                msg="in topology: "+str(topology)+"\ndid not found path from " +
                                                    str(source) +
                                                    " to "+str(destination) +
                                                    " \nAG nodes: "+str(ag_4_test.nodes()) +
                                                    " \nAG edges: "+str(ag_4_test.edges()))
                                self.assertTrue(ag_4_test.has_edge(destination, source))
                                if (source, destination) not in link_list:
                                    link_list.append((source, destination))
                                if (destination, source) not in link_list:
                                    link_list.append((destination, source))

                        for i in range(0, size_x):
                            source = return_node_number(i, size_y-1, 0)
                            destination = return_node_number(i, 0, 0)
                            self.assertTrue(ag_4_test.has_edge(source, destination))
                            self.assertTrue(ag_4_test.has_edge(destination, source))
                            if (source, destination) not in link_list:
                                link_list.append((source, destination))
                            if (destination, source) not in link_list:
                                link_list.append((destination, source))
                        for j in range(0, size_y):
                            source = return_node_number(size_x-1, j, 0)
                            destination = return_node_number(0, j, 0)
                            self.assertTrue(ag_4_test.has_edge(source, destination))
                            self.assertTrue(ag_4_test.has_edge(destination, source))
                            if (source, destination) not in link_list:
                                link_list.append((source, destination))
                            if (destination, source) not in link_list:
                                link_list.append((destination, source))
                        self.assertEqual(len(link_list), len(ag_4_test.edges()), msg="link_list: "+str(link_list) +
                                         " number of edges: " + str(len(ag_4_test.edges())) + " topology: " +
                                         str(topology))
                    # --------------------------------------------
                    if topology is '2DLine':
                        link_counter = 0
                        for j in range(0, size_y):
                            for i in range(0, size_x-1):
                                source = return_node_number(i, j, 0)
                                destination = return_node_number(i+1, j, 0)
                                self.assertTrue(ag_4_test.has_edge(source, destination))
                                self.assertTrue(ag_4_test.has_edge(destination, source))
                                link_counter += 2
                        self.assertEqual(link_counter, len(ag_4_test.edges()), msg="link_counter: " +
                                         str(link_counter) + " number of edges: " +
                                         str(len(ag_4_test.edges())) + " topology: "+str(topology))
                    # --------------------------------------------
                    if topology is '2DRing':
                        link_list = []
                        for j in range(0, size_y):
                            for i in range(0, size_x-1):
                                source = return_node_number(i, j, 0)
                                destination = return_node_number(i+1, j, 0)
                                self.assertTrue(ag_4_test.has_edge(source, destination))
                                self.assertTrue(ag_4_test.has_edge(destination, source))
                                if (source, destination) not in link_list:
                                    link_list.append((source, destination))
                                if (destination, source) not in link_list:
                                    link_list.append((destination, source))
                        for j in range(0, size_y):
                            source = return_node_number(size_x-1, j, 0)
                            destination = return_node_number(0, j, 0)
                            self.assertTrue(ag_4_test.has_edge(source, destination))
                            self.assertTrue(ag_4_test.has_edge(destination, source))
                            if (source, destination) not in link_list:
                                link_list.append((source, destination))
                            if (destination, source) not in link_list:
                                link_list.append((destination, source))
                        self.assertEqual(len(link_list), len(ag_4_test.edges()), msg="link_list: " +
                                         str(link_list) + " number of edges: " + str(len(ag_4_test.edges())) +
                                         " topology: "+str(topology))
                    del ag_4_test

        # --------------------------------------------
        for size_z in range(2, 5):
            for size_y in range(2, 5):
                for size_x in range(2, 5):
                    for topology in ['3DMesh']:
                        size_x = 2
                        size_y = 2
                        size_z = 2
                        Config.ag.x_size = size_x
                        Config.ag.y_size = size_y
                        Config.ag.z_size = size_z
                        ag_4_test = generate_generic_topology_ag(topology, None)
                        link_counter = 0
                        for k in range(0, size_z):
                            for j in range(0, size_y):
                                for i in range(0, size_x-1):
                                    source = return_node_number(i, j, k)
                                    destination = return_node_number(i+1, j, k)
                                    self.assertTrue(ag_4_test.has_edge(source, destination))
                                    self.assertTrue(ag_4_test.has_edge(destination, source))
                                    link_counter += 2

                        for k in range(0, size_z):
                            for j in range(0, size_y-1):
                                for i in range(0, size_x):
                                    source = return_node_number(i, j, k)
                                    destination = return_node_number(i, j+1, k)
                                    self.assertTrue(ag_4_test.has_edge(source, destination))
                                    self.assertTrue(ag_4_test.has_edge(destination, source))
                                    link_counter += 2

                        for k in range(0, size_z-1):
                            for j in range(0, size_y):
                                for i in range(0, size_x):
                                    source = return_node_number(i, j, k)
                                    destination = return_node_number(i, j, k+1)
                                    self.assertTrue(ag_4_test.has_edge(source, destination))
                                    self.assertTrue(ag_4_test.has_edge(destination, source))
                                    link_counter += 2
                        self.assertEqual(link_counter, len(ag_4_test.edges()), msg="link_counter: " +
                                         str(link_counter) + " number of edges: " + str(len(ag_4_test.edges())) +
                                         " list of edges: "+str(ag_4_test.edges()) + " topology: "+str(topology))
                        del ag_4_test

        Config.ag.x_size = temp_x
        Config.ag.y_size = temp_y
        Config.ag.z_size = temp_z
Ejemplo n.º 8
0
def merge_node_with_rectangles(rectangle_list, unreachable_node_list):
    """

    :param rectangle_list:
    :param unreachable_node_list: un-reachable nodes that are initially populating the unreachable list
    :return: rectangle list
    """
    # todo: in this function if we can not perform any loss-less merge, we terminate the process...
    # which is bad... we need to make sure that this node is covered
    for unreachable_node in unreachable_node_list:
        covered = False
        for rectangle in rectangle_list:
            if rectangle_list[rectangle][0] is None:
                # there is no entry, this is the first node to get in...
                rectangle_list[rectangle] = (unreachable_node,
                                             unreachable_node)
                covered = True
                break
            else:
                if is_node_inside_rectangle(rectangle_list[rectangle],
                                            unreachable_node):
                    covered = True
                    break
                else:

                    location_1, location_2 = merge_rectangle_with_node(
                        rectangle_list[rectangle][0],
                        rectangle_list[rectangle][1], unreachable_node)
                    #print("Merged:", location_1, location_2)
                    loss_less_merge = True
                    for network_node_x in range(
                            location_1[0],
                            location_2[0] + 1):  # (merged_x_1, merged_x_2+1)
                        for network_node_y in range(location_1[1],
                                                    location_2[1] + 1):
                            for network_node_z in range(
                                    location_1[2], location_2[2] + 1):
                                node_number = return_node_number(
                                    network_node_x, network_node_y,
                                    network_node_z)
                                if node_number not in unreachable_node_list:
                                    loss_less_merge = False
                                    break
                    # if we are not losing any Node, we perform Merge...
                    if loss_less_merge:
                        #                                            merged X      Merged Y       Merged Z
                        merged_1 = return_node_number(location_1[0],
                                                      location_1[1],
                                                      location_1[2])
                        merged_2 = return_node_number(location_2[0],
                                                      location_2[1],
                                                      location_2[2])
                        rectangle_list[rectangle] = deepcopy(
                            (merged_1, merged_2))
                        covered = True
                        break
        if not covered:
            pass
            # print("COULD NOT PERFORM ANY LOSS-LESS MERGE FOR:"+str(UnreachableNode))
            # print(RectangleList)
    return rectangle_list
Ejemplo n.º 9
0
def gen_latex_ag(ag, shm):
    """
    Generates a latex (.tex) file that will draw the architecture graph along with health of links
    and partitioning information
    :param ag: Architecture graph
    :param shm: System Health Map
    :return: None
    """
    if Config.ag.z_size > 1:
        return None

    latex_ag_file = open('Generated_Files/Latex/ag.tex', 'w')

    latex_ag_file.write("\\documentclass[12pt]{article}\n")
    latex_ag_file.write("\\usepackage{tikz}\n")
    latex_ag_file.write("\definecolor{critical}{RGB}{255,204,204}\n")
    latex_ag_file.write("\definecolor{non_critical}{RGB}{255,255,255}\n")
    latex_ag_file.write("\definecolor{gate_to_critical}{RGB}{204,229,255}\n")
    latex_ag_file.write("\definecolor{gate_to_non_critical}{RGB}{178,102,255}\n")
    latex_ag_file.write("\\begin{document}\n")
    latex_ag_file.write("\\begin{tikzpicture}\n")

    node_size = 1
    bend = 10
    for j in range(0, Config.ag.y_size):
        for i in range(0, Config.ag.x_size):
            start_x = i*2*node_size
            start_y = j*2*node_size

            node_number = return_node_number(i, j, 0)
            if ag.node[node_number]['Region'] == 'L':
                color = 'non_critical'
            elif ag.node[node_number]['Region'] == 'H':
                color = 'critical'
            elif ag.node[node_number]['Region'] == 'GH':
                color = 'gate_to_critical'
            elif ag.node[node_number]['Region'] == 'GNH':
                color = 'gate_to_non_critical'
            else:
                color = 'white'

            latex_ag_file.write("\\draw [fill="+color+"] ("+str(start_x)+","+str(start_y)+") rectangle (" +
                                str(start_x+node_size)+","+str(start_y+node_size)+");\n")

            latex_ag_file.write("\\node[text width=0.5cm] at ("+str(start_x+node_size*0.5)+"," +
                                str(start_y+node_size*0.5)+") {"+str(node_number)+"};\n")

            if i < Config.ag.x_size-1:
                if ag.has_edge(return_node_number(i, j, 0), return_node_number(i+1, j, 0)):
                    if shm.edges[(return_node_number(i, j, 0), return_node_number(i+1, j, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=0.5mm, "+color+"][ -latex ] (" +
                                        str(start_x+node_size)+","+str(start_y+node_size*0.25) +
                                        ") -- ("+str(start_x+2*node_size)+","+str(start_y+node_size*0.25)+");\n")

                if ag.has_edge(return_node_number(i+1, j, 0), return_node_number(i, j, 0)):
                    if shm.edges[(return_node_number(i+1, j, 0), return_node_number(i, j, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=0.5mm, "+color+"][ -latex ] (" +
                                        str(start_x+2*node_size)+","+str(start_y+node_size*0.75) +
                                        ") -- ("+str(start_x+node_size)+","+str(start_y+node_size*0.75)+");\n")

            if j < Config.ag.y_size-1:

                if ag.has_edge(return_node_number(i, j, 0), return_node_number(i, j+1, 0)):
                    if shm.edges[(return_node_number(i, j, 0), return_node_number(i, j+1, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=.5mm, "+color+"][ -latex ] (" +
                                        str(start_x+node_size*0.25)+"," + str(start_y+node_size) +
                                        ") -- ("+str(start_x+node_size*0.25)+","+str(start_y+node_size*2)+");\n")

                if ag.has_edge(return_node_number(i, j+1, 0), return_node_number(i, j, 0)):
                    if shm.edges[(return_node_number(i, j+1, 0), return_node_number(i, j, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=0.5mm, "+color+"][ -latex ] (" +
                                        str(start_x+node_size*0.75)+","+str(start_y+node_size*2) +
                                        ") -- ("+str(start_x+node_size*0.75)+","+str(start_y+node_size)+");\n")

            if j == Config.ag.y_size-1:
                if ag.has_edge(return_node_number(i, j, 0), return_node_number(i, 0, 0)):
                    if shm.edges[(return_node_number(i, j, 0), return_node_number(i, 0, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=.5mm, "+color+"][ -latex ] (" +
                                        str(start_x+node_size)+"," + str(start_y) +
                                        ") to  [bend left="+str(bend)+"] ("+str(start_x+node_size)+"," +
                                        str(node_size)+");\n")
                if ag.has_edge(return_node_number(i, 0, 0), return_node_number(i, j, 0)):
                    if shm.edges[(return_node_number(i, 0, 0), return_node_number(i, j, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=.5mm, "+color+"][ -latex ] (" +
                                        str(start_x)+"," + str(node_size) +
                                        ") to  [bend left="+str(bend)+"] ("+str(start_x)+"," +
                                        str(start_y)+");\n")

            if i == Config.ag.x_size-1:
                if ag.has_edge(return_node_number(i, j, 0), return_node_number(0, j, 0)):

                    if shm.edges[(return_node_number(i, j, 0), return_node_number(0, j, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=.5mm, "+color+"][ -latex ] (" +
                                        str(start_x)+"," + str(start_y) +
                                        ") to  [bend left="+str(bend)+"] ("+str(node_size)+"," +
                                        str(start_y)+");\n")
                if ag.has_edge(return_node_number(0, j, 0), return_node_number(i, j, 0)):
                    if shm.edges[(return_node_number(0, j, 0), return_node_number(i, j, 0))]["LinkHealth"]:
                        color = 'blue'
                    else:
                        color = 'red'
                    latex_ag_file.write("\\draw [line width=.5mm, "+color+"][ -latex ] (" +
                                        str(node_size)+"," + str(start_y+node_size) +
                                        ") to  [bend left="+str(bend)+"] ("+str(start_x)+"," +
                                        str(start_y+node_size)+");\n")

    latex_ag_file.write("\\end{tikzpicture}\n")
    latex_ag_file.write("\\end{document}\n")
    latex_ag_file.close()
    return None