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)
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)
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 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]
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)
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)
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)
def setUp(self): self.noc = NoC("Network-On-Chip", 3, 4, 12, [1, 1, 1, 1]) self.noc.router_linking()
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]
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)
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() """
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')
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)