|  | #!/usr/bin/env python3 | 
|  |  | 
|  | import argparse | 
|  | import sys | 
|  | import os | 
|  | from json import loads | 
|  | from subprocess import Popen, PIPE | 
|  |  | 
|  | # Holds code regions statistics. | 
|  | class Summary: | 
|  | def __init__( | 
|  | self, | 
|  | name, | 
|  | block_rthroughput, | 
|  | dispatch_width, | 
|  | ipc, | 
|  | instructions, | 
|  | iterations, | 
|  | total_cycles, | 
|  | total_uops, | 
|  | uops_per_cycle, | 
|  | iteration_resource_pressure, | 
|  | name_target_info_resources, | 
|  | ): | 
|  | self.name = name | 
|  | self.block_rthroughput = block_rthroughput | 
|  | self.dispatch_width = dispatch_width | 
|  | self.ipc = ipc | 
|  | self.instructions = instructions | 
|  | self.iterations = iterations | 
|  | self.total_cycles = total_cycles | 
|  | self.total_uops = total_uops | 
|  | self.uops_per_cycle = uops_per_cycle | 
|  | self.iteration_resource_pressure = iteration_resource_pressure | 
|  | self.name_target_info_resources = name_target_info_resources | 
|  |  | 
|  |  | 
|  | # Parse the program arguments. | 
|  | def parse_program_args(parser): | 
|  | parser.add_argument( | 
|  | "file_names", | 
|  | nargs="+", | 
|  | type=str, | 
|  | help="Names of files which llvm-mca tool process.", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--llvm-mca-binary", | 
|  | nargs=1, | 
|  | required=True, | 
|  | type=str, | 
|  | action="store", | 
|  | metavar="[=<path to llvm-mca>]", | 
|  | help="Specified relative path to binary of llvm-mca.", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--args", | 
|  | nargs=1, | 
|  | type=str, | 
|  | action="store", | 
|  | metavar="[='-option1=<arg> -option2=<arg> ...']", | 
|  | default=["-"], | 
|  | help="Forward options to lvm-mca tool.", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "-plot", | 
|  | action="store_true", | 
|  | default=False, | 
|  | help="Draw plots of statistics for input files.", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "-plot-resource-pressure", | 
|  | action="store_true", | 
|  | default=False, | 
|  | help="Draw plots of resource pressure per iterations for input files.", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--plot-path", | 
|  | nargs=1, | 
|  | type=str, | 
|  | action="store", | 
|  | metavar="[=<path>]", | 
|  | default=["-"], | 
|  | help="Specify relative path where you want to save the plots.", | 
|  | ) | 
|  | parser.add_argument( | 
|  | "-v", | 
|  | action="store_true", | 
|  | default=False, | 
|  | help="More details about the running lvm-mca tool.", | 
|  | ) | 
|  | return parser.parse_args() | 
|  |  | 
|  |  | 
|  | # Verify that the program inputs meet the requirements. | 
|  | def verify_program_inputs(opts): | 
|  | if opts.plot_path[0] != "-" and not opts.plot and not opts.plot_resource_pressure: | 
|  | print( | 
|  | "error: Please specify --plot-path only with the -plot or -plot-resource-pressure options." | 
|  | ) | 
|  | return False | 
|  |  | 
|  | return True | 
|  |  | 
|  |  | 
|  | # Returns the name of the file to be analyzed from the path it is on. | 
|  | def get_filename_from_path(path): | 
|  | index_of_slash = path.rfind("/") | 
|  | return path[(index_of_slash + 1) : len(path)] | 
|  |  | 
|  |  | 
|  | # Returns the results of the running llvm-mca tool for the input file. | 
|  | def run_llvm_mca_tool(opts, file_name): | 
|  | # Get the path of the llvm-mca binary file. | 
|  | llvm_mca_cmd = opts.llvm_mca_binary[0] | 
|  |  | 
|  | # The statistics llvm-mca options. | 
|  | if opts.args[0] != "-": | 
|  | llvm_mca_cmd += " " + opts.args[0] | 
|  | llvm_mca_cmd += " -json" | 
|  |  | 
|  | # Set file which llvm-mca tool will process. | 
|  | llvm_mca_cmd += " " + file_name | 
|  |  | 
|  | if opts.v: | 
|  | print("run: $ " + llvm_mca_cmd + "\n") | 
|  |  | 
|  | # Generate the stats with the llvm-mca. | 
|  | subproc = Popen( | 
|  | llvm_mca_cmd.split(" "), | 
|  | stdin=PIPE, | 
|  | stdout=PIPE, | 
|  | stderr=PIPE, | 
|  | universal_newlines=True, | 
|  | ) | 
|  |  | 
|  | cmd_stdout, cmd_stderr = subproc.communicate() | 
|  |  | 
|  | try: | 
|  | json_parsed = loads(cmd_stdout) | 
|  | except: | 
|  | print("error: No valid llvm-mca statistics found.") | 
|  | print(cmd_stderr) | 
|  | sys.exit(1) | 
|  |  | 
|  | if opts.v: | 
|  | print("Simulation Parameters: ") | 
|  | simulation_parameters = json_parsed["SimulationParameters"] | 
|  | for key in simulation_parameters: | 
|  | print(key, ":", simulation_parameters[key]) | 
|  | print("\n") | 
|  |  | 
|  | code_regions_len = len(json_parsed["CodeRegions"]) | 
|  | array_of_code_regions = [None] * code_regions_len | 
|  |  | 
|  | for i in range(code_regions_len): | 
|  | code_region_instructions_len = len( | 
|  | json_parsed["CodeRegions"][i]["Instructions"] | 
|  | ) | 
|  | target_info_resources_len = len(json_parsed["TargetInfo"]["Resources"]) | 
|  | iteration_resource_pressure = ["-" for k in range(target_info_resources_len)] | 
|  | resource_pressure_info = json_parsed["CodeRegions"][i]["ResourcePressureView"][ | 
|  | "ResourcePressureInfo" | 
|  | ] | 
|  |  | 
|  | name_target_info_resources = json_parsed["TargetInfo"]["Resources"] | 
|  |  | 
|  | for s in range(len(resource_pressure_info)): | 
|  | obj_of_resource_pressure_info = resource_pressure_info[s] | 
|  | if ( | 
|  | obj_of_resource_pressure_info["InstructionIndex"] | 
|  | == code_region_instructions_len | 
|  | ): | 
|  | iteration_resource_pressure[ | 
|  | obj_of_resource_pressure_info["ResourceIndex"] | 
|  | ] = str(round(obj_of_resource_pressure_info["ResourceUsage"], 2)) | 
|  |  | 
|  | array_of_code_regions[i] = Summary( | 
|  | file_name, | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["BlockRThroughput"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["DispatchWidth"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["IPC"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["Instructions"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["Iterations"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["TotalCycles"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["TotaluOps"], | 
|  | json_parsed["CodeRegions"][i]["SummaryView"]["uOpsPerCycle"], | 
|  | iteration_resource_pressure, | 
|  | name_target_info_resources, | 
|  | ) | 
|  |  | 
|  | return array_of_code_regions | 
|  |  | 
|  |  | 
|  | # Print statistics in console for single file or for multiple files. | 
|  | def console_print_results(matrix_of_code_regions, opts): | 
|  | try: | 
|  | import termtables as tt | 
|  | except ImportError: | 
|  | print("error: termtables not found.") | 
|  | sys.exit(1) | 
|  |  | 
|  | headers_names = [None] * (len(opts.file_names) + 1) | 
|  | headers_names[0] = " " | 
|  |  | 
|  | max_code_regions = 0 | 
|  |  | 
|  | print("Input files:") | 
|  | for i in range(len(matrix_of_code_regions)): | 
|  | if max_code_regions < len(matrix_of_code_regions[i]): | 
|  | max_code_regions = len(matrix_of_code_regions[i]) | 
|  | print("[f" + str(i + 1) + "]: " + get_filename_from_path(opts.file_names[i])) | 
|  | headers_names[i + 1] = "[f" + str(i + 1) + "]: " | 
|  |  | 
|  | print("\nITERATIONS: " + str(matrix_of_code_regions[0][0].iterations) + "\n") | 
|  |  | 
|  | for i in range(max_code_regions): | 
|  |  | 
|  | print( | 
|  | "\n-----------------------------------------\nCode region: " | 
|  | + str(i + 1) | 
|  | + "\n" | 
|  | ) | 
|  |  | 
|  | table_values = [ | 
|  | [[None] for i in range(len(matrix_of_code_regions) + 1)] for j in range(7) | 
|  | ] | 
|  |  | 
|  | table_values[0][0] = "Instructions: " | 
|  | table_values[1][0] = "Total Cycles: " | 
|  | table_values[2][0] = "Total uOps: " | 
|  | table_values[3][0] = "Dispatch Width: " | 
|  | table_values[4][0] = "uOps Per Cycle: " | 
|  | table_values[5][0] = "IPC: " | 
|  | table_values[6][0] = "Block RThroughput: " | 
|  |  | 
|  | for j in range(len(matrix_of_code_regions)): | 
|  | if len(matrix_of_code_regions[j]) > i: | 
|  | table_values[0][j + 1] = str(matrix_of_code_regions[j][i].instructions) | 
|  | table_values[1][j + 1] = str(matrix_of_code_regions[j][i].total_cycles) | 
|  | table_values[2][j + 1] = str(matrix_of_code_regions[j][i].total_uops) | 
|  | table_values[3][j + 1] = str( | 
|  | matrix_of_code_regions[j][i].dispatch_width | 
|  | ) | 
|  | table_values[4][j + 1] = str( | 
|  | round(matrix_of_code_regions[j][i].uops_per_cycle, 2) | 
|  | ) | 
|  | table_values[5][j + 1] = str(round(matrix_of_code_regions[j][i].ipc, 2)) | 
|  | table_values[6][j + 1] = str( | 
|  | round(matrix_of_code_regions[j][i].block_rthroughput, 2) | 
|  | ) | 
|  | else: | 
|  | table_values[0][j + 1] = "-" | 
|  | table_values[1][j + 1] = "-" | 
|  | table_values[2][j + 1] = "-" | 
|  | table_values[3][j + 1] = "-" | 
|  | table_values[4][j + 1] = "-" | 
|  | table_values[5][j + 1] = "-" | 
|  | table_values[6][j + 1] = "-" | 
|  |  | 
|  | tt.print( | 
|  | table_values, | 
|  | header=headers_names, | 
|  | style=tt.styles.ascii_thin_double, | 
|  | padding=(0, 1), | 
|  | ) | 
|  |  | 
|  | print("\nResource pressure per iteration: \n") | 
|  |  | 
|  | table_values = [ | 
|  | [ | 
|  | [None] | 
|  | for i in range( | 
|  | len(matrix_of_code_regions[0][0].iteration_resource_pressure) + 1 | 
|  | ) | 
|  | ] | 
|  | for j in range(len(matrix_of_code_regions) + 1) | 
|  | ] | 
|  |  | 
|  | table_values[0] = [" "] + matrix_of_code_regions[0][ | 
|  | 0 | 
|  | ].name_target_info_resources | 
|  |  | 
|  | for j in range(len(matrix_of_code_regions)): | 
|  | if len(matrix_of_code_regions[j]) > i: | 
|  | table_values[j + 1] = [ | 
|  | "[f" + str(j + 1) + "]: " | 
|  | ] + matrix_of_code_regions[j][i].iteration_resource_pressure | 
|  | else: | 
|  | table_values[j + 1] = ["[f" + str(j + 1) + "]: "] + len( | 
|  | matrix_of_code_regions[0][0].iteration_resource_pressure | 
|  | ) * ["-"] | 
|  |  | 
|  | tt.print( | 
|  | table_values, | 
|  | style=tt.styles.ascii_thin_double, | 
|  | padding=(0, 1), | 
|  | ) | 
|  | print("\n") | 
|  |  | 
|  |  | 
|  | # Based on the obtained results (summary view) of llvm-mca tool, draws plots for multiple input files. | 
|  | def draw_plot_files_summary(array_of_summary, opts): | 
|  | try: | 
|  | import matplotlib.pyplot as plt | 
|  | except ImportError: | 
|  | print("error: matplotlib.pyplot not found.") | 
|  | sys.exit(1) | 
|  | try: | 
|  | from matplotlib.cm import get_cmap | 
|  | except ImportError: | 
|  | print("error: get_cmap (matplotlib.cm) not found.") | 
|  | sys.exit(1) | 
|  |  | 
|  | names = [ | 
|  | "Block RThroughput", | 
|  | "Dispatch Width", | 
|  | "IPC", | 
|  | "uOps Per Cycle", | 
|  | "Instructions", | 
|  | "Total Cycles", | 
|  | "Total uOps", | 
|  | ] | 
|  |  | 
|  | rows, cols = (len(opts.file_names), 7) | 
|  |  | 
|  | values = [[0 for x in range(cols)] for y in range(rows)] | 
|  |  | 
|  | for i in range(len(opts.file_names)): | 
|  | values[i][0] = array_of_summary[i].block_rthroughput | 
|  | values[i][1] = array_of_summary[i].dispatch_width | 
|  | values[i][2] = array_of_summary[i].ipc | 
|  | values[i][3] = array_of_summary[i].uops_per_cycle | 
|  | values[i][4] = array_of_summary[i].instructions | 
|  | values[i][5] = array_of_summary[i].total_cycles | 
|  | values[i][6] = array_of_summary[i].total_uops | 
|  |  | 
|  | fig, axs = plt.subplots(4, 2) | 
|  | fig.suptitle( | 
|  | "Machine code statistics", fontsize=20, fontweight="bold", color="black" | 
|  | ) | 
|  | i = 0 | 
|  |  | 
|  | for x in range(4): | 
|  | for y in range(2): | 
|  | cmap = get_cmap("tab20") | 
|  | colors = cmap.colors | 
|  | if not (x == 0 and y == 1) and i < 7: | 
|  | axs[x][y].grid(True, color="grey", linestyle="--") | 
|  | maxValue = 0 | 
|  | if i == 0: | 
|  | for j in range(len(opts.file_names)): | 
|  | if maxValue < values[j][i]: | 
|  | maxValue = values[j][i] | 
|  | axs[x][y].bar( | 
|  | 0.3 * j, | 
|  | values[j][i], | 
|  | width=0.1, | 
|  | color=colors[j], | 
|  | label=get_filename_from_path(opts.file_names[j]), | 
|  | ) | 
|  | else: | 
|  | for j in range(len(opts.file_names)): | 
|  | if maxValue < values[j][i]: | 
|  | maxValue = values[j][i] | 
|  | axs[x][y].bar(0.3 * j, values[j][i], width=0.1, color=colors[j]) | 
|  | axs[x][y].set_axisbelow(True) | 
|  | axs[x][y].set_xlim([-0.3, len(opts.file_names) / 3]) | 
|  | axs[x][y].set_ylim([0, maxValue + (maxValue / 2)]) | 
|  | axs[x][y].set_title(names[i], fontsize=15, fontweight="bold") | 
|  | axs[x][y].axes.xaxis.set_visible(False) | 
|  | for j in range(len(opts.file_names)): | 
|  | axs[x][y].text( | 
|  | 0.3 * j, | 
|  | values[j][i] + (maxValue / 40), | 
|  | s=str(values[j][i]), | 
|  | color="black", | 
|  | fontweight="bold", | 
|  | fontsize=4, | 
|  | ) | 
|  | i = i + 1 | 
|  |  | 
|  | axs[0][1].set_visible(False) | 
|  | fig.legend(prop={"size": 15}) | 
|  | figg = plt.gcf() | 
|  | figg.set_size_inches((25, 15), forward=False) | 
|  | if opts.plot_path[0] == "-": | 
|  | plt.savefig("llvm-mca-plot.png", dpi=500) | 
|  | print("The plot was saved within llvm-mca-plot.png") | 
|  | else: | 
|  | plt.savefig( | 
|  | os.path.normpath(os.path.join(opts.plot_path[0], "llvm-mca-plot.png")), | 
|  | dpi=500, | 
|  | ) | 
|  | print( | 
|  | "The plot was saved within {}.".format( | 
|  | os.path.normpath(os.path.join(opts.plot_path[0], "llvm-mca-plot.png")) | 
|  | ) | 
|  | ) | 
|  |  | 
|  |  | 
|  | # Calculates the average value (summary view) per region. | 
|  | def summary_average_code_region(array_of_code_regions, file_name): | 
|  | summary = Summary(file_name, 0, 0, 0, 0, 0, 0, 0, 0, None, None) | 
|  | for i in range(len(array_of_code_regions)): | 
|  | summary.block_rthroughput += array_of_code_regions[i].block_rthroughput | 
|  | summary.dispatch_width += array_of_code_regions[i].dispatch_width | 
|  | summary.ipc += array_of_code_regions[i].ipc | 
|  | summary.instructions += array_of_code_regions[i].instructions | 
|  | summary.iterations += array_of_code_regions[i].iterations | 
|  | summary.total_cycles += array_of_code_regions[i].total_cycles | 
|  | summary.total_uops += array_of_code_regions[i].total_uops | 
|  | summary.uops_per_cycle += array_of_code_regions[i].uops_per_cycle | 
|  | summary.block_rthroughput = round( | 
|  | summary.block_rthroughput / len(array_of_code_regions), 2 | 
|  | ) | 
|  | summary.dispatch_width = round( | 
|  | summary.dispatch_width / len(array_of_code_regions), 2 | 
|  | ) | 
|  | summary.ipc = round(summary.ipc / len(array_of_code_regions), 2) | 
|  | summary.instructions = round(summary.instructions / len(array_of_code_regions), 2) | 
|  | summary.iterations = round(summary.iterations / len(array_of_code_regions), 2) | 
|  | summary.total_cycles = round(summary.total_cycles / len(array_of_code_regions), 2) | 
|  | summary.total_uops = round(summary.total_uops / len(array_of_code_regions), 2) | 
|  | summary.uops_per_cycle = round( | 
|  | summary.uops_per_cycle / len(array_of_code_regions), 2 | 
|  | ) | 
|  | return summary | 
|  |  | 
|  |  | 
|  | # Based on the obtained results (resource pressure per iter) of llvm-mca tool, draws plots for multiple input files. | 
|  | def draw_plot_resource_pressure( | 
|  | array_average_resource_pressure_per_file, opts, name_target_info_resources | 
|  | ): | 
|  | try: | 
|  | import matplotlib.pyplot as plt | 
|  | except ImportError: | 
|  | print("error: matplotlib.pyplot not found.") | 
|  | sys.exit(1) | 
|  | try: | 
|  | from matplotlib.cm import get_cmap | 
|  | except ImportError: | 
|  | print("error: get_cmap (matplotlib.cm) not found.") | 
|  | sys.exit(1) | 
|  |  | 
|  | fig, axs = plt.subplots() | 
|  | fig.suptitle( | 
|  | "Resource pressure per iterations", | 
|  | fontsize=20, | 
|  | fontweight="bold", | 
|  | color="black", | 
|  | ) | 
|  |  | 
|  | maxValue = 0 | 
|  | for j in range(len(opts.file_names)): | 
|  | if maxValue < max(array_average_resource_pressure_per_file[j]): | 
|  | maxValue = max(array_average_resource_pressure_per_file[j]) | 
|  |  | 
|  | cmap = get_cmap("tab20") | 
|  | colors = cmap.colors | 
|  |  | 
|  | xticklabels = [None] * len(opts.file_names) * len(name_target_info_resources) | 
|  | index = 0 | 
|  |  | 
|  | for j in range(len(name_target_info_resources)): | 
|  | for i in range(len(opts.file_names)): | 
|  | if i == 0: | 
|  | axs.bar( | 
|  | j * len(opts.file_names) * 10 + i * 10, | 
|  | array_average_resource_pressure_per_file[i][j], | 
|  | width=1, | 
|  | color=colors[j], | 
|  | label=name_target_info_resources[j], | 
|  | ) | 
|  | else: | 
|  | axs.bar( | 
|  | j * len(opts.file_names) * 10 + i * 10, | 
|  | array_average_resource_pressure_per_file[i][j], | 
|  | width=1, | 
|  | color=colors[j], | 
|  | ) | 
|  | axs.text( | 
|  | j * len(opts.file_names) * 10 + i * 10, | 
|  | array_average_resource_pressure_per_file[i][j] + (maxValue / 40), | 
|  | s=str(array_average_resource_pressure_per_file[i][j]), | 
|  | color=colors[j], | 
|  | fontweight="bold", | 
|  | fontsize=3, | 
|  | ) | 
|  | xticklabels[index] = opts.file_names[i] | 
|  | index = index + 1 | 
|  |  | 
|  | axs.set_xticks( | 
|  | [ | 
|  | j * len(opts.file_names) * 10 + i * 10 | 
|  | for j in range(len(name_target_info_resources)) | 
|  | for i in range(len(opts.file_names)) | 
|  | ] | 
|  | ) | 
|  | axs.set_xticklabels(xticklabels, rotation=65) | 
|  |  | 
|  | axs.set_axisbelow(True) | 
|  | axs.set_xlim([-0.5, len(opts.file_names) * len(name_target_info_resources) * 10]) | 
|  | axs.set_ylim([0, maxValue + maxValue / 10]) | 
|  |  | 
|  | fig.legend(prop={"size": 15}) | 
|  | figg = plt.gcf() | 
|  | figg.set_size_inches((25, 15), forward=False) | 
|  | if opts.plot_path[0] == "-": | 
|  | plt.savefig("llvm-mca-plot-resource-pressure.png", dpi=500) | 
|  | print("The plot was saved within llvm-mca-plot-resource-pressure.png") | 
|  | else: | 
|  | plt.savefig( | 
|  | os.path.normpath( | 
|  | os.path.join(opts.plot_path[0], "llvm-mca-plot-resource-pressure.png") | 
|  | ), | 
|  | dpi=500, | 
|  | ) | 
|  | print( | 
|  | "The plot was saved within {}.".format( | 
|  | os.path.normpath( | 
|  | os.path.join( | 
|  | opts.plot_path[0], "llvm-mca-plot-resource-pressure.png" | 
|  | ) | 
|  | ) | 
|  | ) | 
|  | ) | 
|  |  | 
|  |  | 
|  | # Calculates the average value (resource pressure per iter) per region. | 
|  | def average_code_region_resource_pressure(array_of_code_regions, file_name): | 
|  | resource_pressure_per_iter_one_file = [0] * len( | 
|  | array_of_code_regions[0].iteration_resource_pressure | 
|  | ) | 
|  | for i in range(len(array_of_code_regions)): | 
|  | for j in range(len(array_of_code_regions[i].iteration_resource_pressure)): | 
|  | if array_of_code_regions[i].iteration_resource_pressure[j] != "-": | 
|  | resource_pressure_per_iter_one_file[j] += float( | 
|  | array_of_code_regions[i].iteration_resource_pressure[j] | 
|  | ) | 
|  | for i in range(len(resource_pressure_per_iter_one_file)): | 
|  | resource_pressure_per_iter_one_file[i] = round( | 
|  | resource_pressure_per_iter_one_file[i] / len(array_of_code_regions), 2 | 
|  | ) | 
|  | return resource_pressure_per_iter_one_file | 
|  |  | 
|  |  | 
|  | def Main(): | 
|  | parser = argparse.ArgumentParser() | 
|  | opts = parse_program_args(parser) | 
|  |  | 
|  | if not verify_program_inputs(opts): | 
|  | parser.print_help() | 
|  | sys.exit(1) | 
|  |  | 
|  | matrix_of_code_regions = [None] * len(opts.file_names) | 
|  |  | 
|  | for i in range(len(opts.file_names)): | 
|  | matrix_of_code_regions[i] = run_llvm_mca_tool(opts, opts.file_names[i]) | 
|  | if not opts.plot and not opts.plot_resource_pressure: | 
|  | console_print_results(matrix_of_code_regions, opts) | 
|  | else: | 
|  | if opts.plot: | 
|  | array_average_summary_per_file = [None] * len(matrix_of_code_regions) | 
|  | for j in range(len(matrix_of_code_regions)): | 
|  | array_average_summary_per_file[j] = summary_average_code_region( | 
|  | matrix_of_code_regions[j], opts.file_names[j] | 
|  | ) | 
|  | draw_plot_files_summary(array_average_summary_per_file, opts) | 
|  | if opts.plot_resource_pressure: | 
|  | array_average_resource_pressure_per_file = [None] * len( | 
|  | matrix_of_code_regions | 
|  | ) | 
|  | for j in range(len(matrix_of_code_regions)): | 
|  | array_average_resource_pressure_per_file[ | 
|  | j | 
|  | ] = average_code_region_resource_pressure( | 
|  | matrix_of_code_regions[j], opts.file_names[j] | 
|  | ) | 
|  | draw_plot_resource_pressure( | 
|  | array_average_resource_pressure_per_file, | 
|  | opts, | 
|  | matrix_of_code_regions[0][0].name_target_info_resources, | 
|  | ) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | Main() | 
|  | sys.exit(0) |