示例#1
0
class TestAnalysisTool(unittest.TestCase):
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])
        self.noc.link_array_filling()

        self.message1 = Message(1, 150, 896, 0, 100, Coordinate(0, 3),
                                Coordinate(0, 1))
        self.message2 = Message(2, 150, 256, 0, 100, Coordinate(2, 0),
                                Coordinate(3, 0))
        self.message3 = Message(3, 400, 256, 0, 300, Coordinate(0, 2),
                                Coordinate(3, 0))
        self.message4 = Message(4, 600, 256, 0, 550, Coordinate(2, 0),
                                Coordinate(3, 0))
        self.message5 = Message(5, 300, 3072, 0, 250, Coordinate(0, 1),
                                Coordinate(2, 0))

        self.messages = [
            self.message1, self.message2, self.message3, self.message4,
            self.message5
        ]

        self.qinModel = QinModel(self.noc, self.messages)

        self.tdma = TDMA(self.noc, self.noc.vc_quantum)

    def test_direct_interference_set(self):
        taskset = self.qinModel.direct_interference_set(self.message3)

        self.assertEqual(taskset[0].id, 1)
        self.assertEqual(taskset[1].id, 2)

    def test_indirect_interference_set(self):
        taskset = self.qinModel.indirect_interference_set(self.message5)

        self.assertEqual(taskset[0].id, 1)
        self.assertEqual(taskset[1].id, 2)

    def test_latency_0th(self):
        self.assertEqual(self.qinModel.latency_0th(self.message1), 30)

    def test_latency_nth(self):
        self.qinModel.latency_nth(self.message5)

    def test_total_slot(self):
        self.assertEqual(self.tdma.total_slot(), 4)

    def test_tdma_latency(self):
        latency = self.tdma.latency(self.message3, self.tdma.slot_table[1])
        self.assertEqual(latency, 37)
示例#2
0
class TestNoC(unittest.TestCase):
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])
        self.noc.router_linking()

    def test_noc_initialisation(self):
        self.assertEqual(len(self.noc.router_matrix), 4)
        self.assertEqual(self.noc.square_size, 4)

    def test_noc_routers(self):
        self.assertEqual(str(self.noc.router_matrix[0][0]), 'Router (0,0)')
        self.assertEqual(str(self.noc.router_matrix[3][3]), 'Router (3,3)')
        self.assertEqual(str(self.noc.router_matrix[2][1]), 'Router (2,1)')
        self.assertEqual(str(self.noc.router_matrix[1][0]), 'Router (1,0)')

        self.assertEqual(self.noc.router_matrix[0][0].id, 1)
        self.assertEqual(self.noc.router_matrix[3][3].id, 16)

    def test_noc_links(self):
        self.assertEqual(self.noc.router_matrix[0][0].outEast.inPort,
                         self.noc.router_matrix[0][1].inWest)
        self.assertEqual(self.noc.router_matrix[0][0].outSouth.inPort,
                         self.noc.router_matrix[1][0].inNorth)
        self.assertIsNone(self.noc.router_matrix[0][0].outNorth.inPort)
        self.assertIsNone(self.noc.router_matrix[0][0].outWest.inPort)

        self.assertEqual(self.noc.router_matrix[3][3].outNorth.inPort,
                         self.noc.router_matrix[2][3].inSouth)
        self.assertEqual(self.noc.router_matrix[3][3].outWest.inPort,
                         self.noc.router_matrix[3][2].inEast)
        self.assertIsNone(self.noc.router_matrix[3][3].outSouth.inPort)
        self.assertIsNone(self.noc.router_matrix[3][3].outEast.inPort)

        self.assertEqual(self.noc.router_matrix[2][2].outNorth.inPort,
                         self.noc.router_matrix[1][2].inSouth)
        self.assertEqual(self.noc.router_matrix[2][2].outWest.inPort,
                         self.noc.router_matrix[2][1].inEast)
        self.assertEqual(self.noc.router_matrix[2][2].outSouth.inPort,
                         self.noc.router_matrix[3][2].inNorth)
        self.assertEqual(self.noc.router_matrix[2][2].outEast.inPort,
                         self.noc.router_matrix[2][3].inWest)

    def test_get_router_coordinate_by_id(self):
        coord = self.noc.get_router_coordinate_by_id(1)
        self.assertEqual(coord.i, 0)
        self.assertEqual(coord.j, 0)
        coord = self.noc.get_router_coordinate_by_id(16)
        self.assertEqual(coord.i, 3)
        self.assertEqual(coord.j, 3)
示例#3
0
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])

        self.src = Coordinate(0, 0)
        self.dest = Coordinate(2, 2)
        self.message = Message(1, 12, 256, 0, 0, self.src, self.dest)
        self.packet = Packet(1, self.dest, self.message)

        self.flit = self.packet.flits[0]

        self.proc_engine = self.noc.router_matrix[0][0].proc_engine
        self.router = self.noc.router_matrix[0][0]

        self.generation = Generation()
        self.generation.set_noc(self.noc)
        self.generation.set_square_size(4)

        self.noc.link_array_filling()
示例#4
0
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])

        self.src = Coordinate(0, 0)
        self.dest = Coordinate(2, 2)
        self.message = Message(1, 23, 256, 0, 0, self.src, self.dest)
        self.packet = Packet(1, self.dest, self.message)

        self.flit = self.packet.flits[0]

        self.proc_engine = self.noc.router_matrix[0][0].proc_engine
        self.router = self.noc.router_matrix[0][0]
示例#5
0
class TestAnalysisTool(unittest.TestCase):
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])

        self.src = Coordinate(0, 0)
        self.dest = Coordinate(2, 2)
        self.message = Message(1, 12, 256, 0, 0, self.src, self.dest)
        self.packet = Packet(1, self.dest, self.message)

        self.flit = self.packet.flits[0]

        self.proc_engine = self.noc.router_matrix[0][0].proc_engine
        self.router = self.noc.router_matrix[0][0]

        self.generation = Generation()
        self.generation.set_noc(self.noc)
        self.generation.set_square_size(4)

        self.noc.link_array_filling()

    def test_is_links_equal(self):
        message1 = Message(1, 12, 256, 0, 0, Coordinate(0, 2),
                           Coordinate(2, 2))
        message2 = Message(1, 12, 256, 0, 0, Coordinate(0, 3),
                           Coordinate(3, 3))
        p1 = self.message.get_xy_path_coordinate(self.noc)
        p2 = message1.get_xy_path_coordinate(self.noc)
        p3 = message2.get_xy_path_coordinate(self.noc)

        self.assertEqual(self.generation.task_overlap(p1, p2), True)
        self.assertEqual(self.generation.task_overlap(p1, p3), False)

    def test_direction_intersection(self):
        self.assertEqual(
            len(self.generation.direction_intersection(self.message)), 0)
        self.generation.conflict_task_by_axe(self.message, 70, 40, 0)
        self.assertGreater(
            len(self.generation.direction_intersection(self.message)), 0)
示例#6
0
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])
        self.noc.link_array_filling()

        self.message1 = Message(1, 150, 896, 0, 100, Coordinate(0, 3),
                                Coordinate(0, 1))
        self.message2 = Message(2, 150, 256, 0, 100, Coordinate(2, 0),
                                Coordinate(3, 0))
        self.message3 = Message(3, 400, 256, 0, 300, Coordinate(0, 2),
                                Coordinate(3, 0))
        self.message4 = Message(4, 600, 256, 0, 550, Coordinate(2, 0),
                                Coordinate(3, 0))
        self.message5 = Message(5, 300, 3072, 0, 250, Coordinate(0, 1),
                                Coordinate(2, 0))

        self.messages = [
            self.message1, self.message2, self.message3, self.message4,
            self.message5
        ]

        self.qinModel = QinModel(self.noc, self.messages)

        self.tdma = TDMA(self.noc, self.noc.vc_quantum)
示例#7
0
class TestLink(unittest.TestCase):
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 3, 4, 12, [1, 1, 1, 1])
        self.noc.router_linking()

    def test_links_array(self):
        self.noc.link_array_filling()
        self.assertEqual(len(self.noc.links.keys()), 9)
        self.assertEqual(len(self.noc.links['1']), 2)
        self.assertEqual(len(self.noc.links['5']), 4)
        self.assertEqual(len(self.noc.links['2']), 3)

    def test_links_default_utilization_rate(self):
        self.noc.link_array_filling()
        self.assertEqual(self.noc.links['1']['2'], 0)
示例#8
0
 def setUp(self):
     self.noc = NoC("Network-On-Chip", 3, 4, 12, [1, 1, 1, 1])
     self.noc.router_linking()
示例#9
0
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])

        self.proc_engine = self.noc.router_matrix[0][0].proc_engine
        self.router = self.noc.router_matrix[0][0]
示例#10
0
class TestConflictByAxe(unittest.TestCase):
    def setUp(self):
        self.noc = NoC("Network-On-Chip", 4, 4, 12, [1, 1, 1, 1])

        self.src = Coordinate(0, 0)
        self.dest = Coordinate(2, 2)
        self.message = Message(1, 12, 256, 0, 0, self.src, self.dest)
        self.packet = Packet(1, self.dest, self.message)

        self.flit = self.packet.flits[0]

        self.proc_engine = self.noc.router_matrix[0][0].proc_engine
        self.router = self.noc.router_matrix[0][0]

        self.generation = Generation()
        self.generation.set_noc(self.noc)
        self.generation.set_square_size(4)

        self.noc.link_array_filling()

    def test_xy_path_coordinate(self):
        link_array = self.message.get_xy_path_coordinate(self.noc)
        self.assertEqual(len(link_array), 4)
        self.assertEqual(link_array[0][0], 1)
        self.assertEqual(link_array[0][1], 2)
        self.assertEqual(link_array[3][0], 7)
        self.assertEqual(link_array[3][1], 11)

    def test_find_links_outside_interval(self):
        link_array = self.message.get_xy_path_coordinate(self.noc)

        outside_link = self.generation.find_links_outside_interval(
            link_array, 70, 30, 0)
        self.assertEqual(len(outside_link), 4)

        self.generation.add_utilization_rate_to_link(outside_link[0], 50)
        new_outside_link = self.generation.find_links_outside_interval(
            link_array, 70, 30, 0)
        self.assertEqual(len(new_outside_link), 4)

    def test_get_link_direction(self):
        link_array = self.message.get_xy_path_coordinate(self.noc)
        link = link_array.pop()

        self.assertEqual(self.generation.get_link_direction(link), 0)

    def test_task_communication_axe(self):
        link_array = self.message.get_xy_path_coordinate(self.noc)

        router_src = self.noc.get_router_coordinate_by_id(link_array[0][0])
        router_dest = self.noc.get_router_coordinate_by_id(link_array[0][1])

        router_src_1 = self.noc.get_router_coordinate_by_id(link_array[3][0])
        router_dest_1 = self.noc.get_router_coordinate_by_id(link_array[3][1])

        axe = (0 if router_src.i == router_dest.i else 1)
        self.assertEqual(axe, 0)
        axe = (0 if router_src_1.i == router_dest_1.i else 1)
        self.assertEqual(axe, 1)

    def test_generate_conflict_task_by_axe(self):
        link_array = self.message.get_xy_path_coordinate(self.noc)
        link = link_array.pop()

        router_src = self.noc.get_router_coordinate_by_id(link[0])
        router_dest = self.noc.get_router_coordinate_by_id(link[1])

        axe = (0 if router_src.i == router_dest.i else 1)

        conflict_task = self.generation.generate_conflict_task_by_axe(
            [router_src, router_dest], link, axe, 50, 0)
        # conflict task generated by the above function has the following characteristics
        # from -> to : (0,0) -> (0,1) -> (0,2) -> (0,3) : 3 links
        # has a link utilization < 30
        self.assertEqual(len(conflict_task.get_xy_path_coordinate(self.noc)),
                         3)
        self.assertLessEqual(conflict_task.get_link_utilization(), 0.3)

    def test_conflict_task_by_axe(self):
        self.generation.conflict_task_by_axe(self.message, 70, 40, 0)
示例#11
0
def main():
    # parse input files
    input_files = os.popen("ls input").read().split('\n')
    del input_files[-1]

    # CLI Argument parsing
    level = 0
    try:
        options, args = getopt.getopt(sys.argv[1:], 'dimu:')
    except getopt.error as msg:
        sys.stdout = sys.stderr
        print(msg)
        print("""usage: %s [-d|-i] [-u|-m|-]
                -d, -i: DEBUG / INFO """ % sys.argv[0])
        sys.exit()

    for opt, value in options:
        if opt in '-d':
            level = logging.DEBUG
        if opt in '-i':
            level = logging.INFO

    # file parsing loop
    for file in input_files:
        Simulation.CLOCK = 0

        # NoC Settings
        generation = Generation()
        generation.config('input/' + file + '/config.yml')

        square_size = generation.square_size()
        nbvc = generation.nbvc()
        vc_size = generation.vc_size()
        vc_quantum = generation.vc_quantum()
        arbitration = generation.arbitration()

        noc = NoC('Network-On-Chip', square_size, nbvc, vc_size, vc_quantum)

        generation.set_noc(noc)

        # Messages generation
        messages = generation.scenario('input/' + file + '/scenario.yml')

        # set logging level + log file
        logging.basicConfig(level=level,
                            handlers=[
                                logging.FileHandler('input/output.log'),
                                logging.StreamHandler()
                            ])

        logging.info(
            '###################################################################'
        )
        logging.info(
            '### ReTiNAS - Real-Time Network-on-chip Analysis and Simulation ###'
        )
        logging.info('------ NoC Configuration ------')
        logging.info('\tDimension : %d x %d' % (square_size, square_size))
        logging.info('\tVC Number per Input : %d' % nbvc)
        logging.info('\tVC Buffer size : %d' % vc_size)
        logging.info('\tVC Quantum setting : %s' % vc_quantum)
        logging.info('\tArbitration Policy : %s' % arbitration)
        logging.info('-------------------------------')
        """
        Analysis : Begin
        """
        csv = CSVWriter(messages, 1)
        csv.generate_csv('input/' + file + '/result_analysis.csv',
                         arbitration=arbitration,
                         generation=generation)
        """
        Analysis : End
        """
        """
        Simulation : Begin
        """
        # Simulator Settings
        simulation = Simulation(noc, generation.hyperperiod())

        for message in messages:
            simulation.send_message(message)

        # Starting Simulation
        logging.info('### Simulation --> START - hyperperiod : %d ###' %
                     generation.hyperperiod())
        simulation.simulate(arbitration)
        logging.info('### Simulation --> END ###')

        # printing
        messages_i = simulation.get_message_instance_tab()
        csv = CSVWriter(messages_i, 0)
        csv.generate_csv('input/' + file + '/result_sim.csv')

        simulation.reset_clock()
        """
示例#12
0
def main1():
    # Create the SimPy environment. This is the thing that runs the simulation.
    env = simpy.Environment()

    # parse input files
    input_files = os.popen("ls input").read().split('\n')
    del input_files[-1]

    # CLI Argument parsing
    level = 0
    try:
        options, args = getopt.getopt(sys.argv[1:], 'dimu:')
    except getopt.error as msg:
        sys.stdout = sys.stderr
        print(msg)
        print("""usage: %s [-d|-i] [-u|-m|-]
                -d, -i: DEBUG / INFO """ % sys.argv[0])
        sys.exit()

    for opt, value in options:
        if opt in '-d':
            level = logging.DEBUG
        if opt in '-i':
            level = logging.INFO

    # file parsing loop
    for file in input_files:
        # NoC Settings
        generation = Generation()
        generation.config('input/' + file + '/config.yml')

        square_size = generation.square_size()
        nbvc = generation.nbvc()
        vc_size = generation.vc_size()
        vc_quantum = generation.vc_quantum()
        arbitration = generation.arbitration()

        noc = NoC(env, 'Network-On-Chip', square_size, nbvc, vc_size, vc_quantum)

        generation.set_noc(noc)

        # Messages generation
        messages = generation.scenario('input/' + file + '/scenario.yml')
        print("Taskset : %d" % len(messages))
        print("HP : %d" % generation.hyperperiod())
        # set logging level + log file
        logging.basicConfig(level=level,
                            handlers=[
                                # logging.FileHandler('input/' + file + '/output.log'),
                                logging.StreamHandler()
                            ])

        logging.info('###################################################################')
        logging.info('### ReTiNAS - Real-Time Network-on-chip Analysis and Simulation ###')
        logging.info('------ NoC Configuration ------')
        logging.info('\tDimension : %d x %d' % (square_size, square_size))
        logging.info('\tVC Number per Input : %d' % nbvc)
        logging.info('\tVC Buffer size : %d' % vc_size)
        logging.info('\tVC Quantum setting : %s' % vc_quantum)
        logging.info('\tArbitration Policy : %s' % arbitration)
        logging.info('-------------------------------')

        """
        Analysis : Begin
        """
        csv = CSVWriter(messages, arbitration, noc)
        csv.analysis_trace_csv('input/' + file + '/result_analysis.csv', messages)
        """
        Analysis : End
        """

        """
        Simulation : Begin
        """
        # Simulator Settings
        noc.messages = messages
        noc.arbitration = arbitration

        for msg in messages:
            print(msg)
        # Starting Simulation
        logging.info('### Simulation --> START - hyperperiod : %d ###' % generation.hyperperiod())
        env.run(until=generation.hyperperiod())
        # env.run(until=20)
        logging.info('### Simulation --> END ###')

        # printing
        messages_i = noc.messages_instance
        csv = CSVWriter(messages_i, 0, noc)

        """
        Simulation : End
        """

        # Trace generation : Latency
        # for msgi in messages_i:
        #     print("%s ---> Sched :: %s" % (msgi, msgi.is_deadline_met()))

        csv.simulation_trace_csv('input/' + file + '/result_sim.csv')
示例#13
0
def main_resource_augmentation():
    # parse input files
    input_files = os.popen("ls input").read().split('\n')
    del input_files[-1]

    # CLI Argument parsing
    level = 0
    try:
        options, args = getopt.getopt(sys.argv[1:], 'dimu:')
    except getopt.error as msg:
        sys.stdout = sys.stderr
        print(msg)
        print("""usage: %s [-d|-i] [-u|-m|-]
                -d, -i: DEBUG / INFO """ % sys.argv[0])
        sys.exit()

    for opt, value in options:
        if opt in '-d':
            level = logging.DEBUG
        if opt in '-i':
            level = logging.INFO

    # file parsing loop
    for file in input_files:
        # NoC Settings
        generation = Generation()
        generation.config('input/' + file + '/config.yml')

        square_size = generation.square_size()
        nbvc = generation.nbvc() - 1
        vc_size = generation.vc_size()
        vc_quantum = generation.vc_quantum()
        arbitration = generation.arbitration()

        # Messages generation
        # messages = generation.scenario('input/' + file + '/scenario.yml')
        # print("Taskset : %d" % len(messages))
        # print("HP : %d" % generation.hyperperiod())
        # set logging level + log file
        logging.basicConfig(level=level,
                            handlers=[
                                # logging.FileHandler('input/' + file + '/output.log'),
                                logging.StreamHandler()
                            ])

        logging.info('###################################################################')
        logging.info('### ReTiNAS - Real-Time Network-on-chip Analysis and Simulation ###')
        logging.info('------ NoC Configuration ------')
        logging.info('\tDimension : %d x %d' % (square_size, square_size))
        logging.info('\tVC Number per Input : %d' % nbvc)
        logging.info('\tVC Buffer size : %d' % vc_size)
        logging.info('\tVC Quantum setting : %s' % vc_quantum)
        logging.info('\tArbitration Policy : %s' % arbitration)
        logging.info('-------------------------------')

        # Starting Simulation
        tab = []
        for count in range(5):
            messages = None
            nbvc = generation.nbvc() - 1
            vc_quantum = generation.vc_quantum()
            vc_quantum.pop()
            while True:
                # Create the SimPy environment. This is the thing that runs the simulation.
                env = simpy.Environment()

                nbvc += 1
                vc_quantum.append(1)
                noc = NoC(env, 'Network-On-Chip', square_size, nbvc, vc_size, vc_quantum)
                generation.set_noc(noc)

                # Messages generation
                if messages is None:
                    print("GENERATION ----------------------------------")
                    messages = generation.scenario('input/' + file + '/scenario.yml')
                # Simulator Settings
                noc.messages = messages

                ##################  1 - RR  ##################
                noc.arbitration = arbitration

                logging.info('### Simulation --> START - hyperperiod : %d ###' % generation.hyperperiod())
                env.run(until=generation.hyperperiod())
                # env.run(until=20)
                logging.info('### Simulation --> END ###')

                # printing
                messages_i = noc.messages_instance
                csv = CSVWriter(messages_i, 0, noc)

                """
                Simulation : End
                """
                if is_taskset_deadline_meeting(messages_i):
                    print(">>>>>>>>>>>>>>>>> FINAL :: NUMBER OF VCS : %d" % len(noc.router_matrix[0][0].inNorth.vcs))
                    tab.append(len(noc.router_matrix[0][0].inNorth.vcs))
                    break
                else:
                    # TODO : RA
                    print(">>>>>>>>>>>>>>>>> NUMBER OF VCS : %d" % len(noc.router_matrix[0][0].inNorth.vcs))
                    continue

        CSVWriter.resource_augmentation_trace_csv('input/' + file + '/resource_augmentation.csv', tab)