xref: /XiangShan/scripts/top-down/draw.py (revision 03a1a638e54b0b04a4d6c88c5f5cbc92c20e76fb)
1effccb7dSTang Haojinimport os.path as osp
2effccb7dSTang Haojinimport numpy as np
3effccb7dSTang Haojinimport matplotlib.pyplot as plt
4effccb7dSTang Haojinimport pandas as pd
5effccb7dSTang Haojinimport configs as cf
6effccb7dSTang Haojin
7effccb7dSTang Haojin
8effccb7dSTang Haojindef draw():
9effccb7dSTang Haojin    results = {
10effccb7dSTang Haojin        'XS': (cf.OUT_CSV, 'XS'),
11effccb7dSTang Haojin    }
12effccb7dSTang Haojin
13effccb7dSTang Haojin    configs = list(results.keys())
14effccb7dSTang Haojin
15effccb7dSTang Haojin    color_types = 10
16effccb7dSTang Haojin    cmap = plt.get_cmap('tab10')
17effccb7dSTang Haojin    color_index = np.arange(0, 1, 1.0 / color_types)
18effccb7dSTang Haojin    colors = [cmap(c) for c in color_index] * 3
19effccb7dSTang Haojin    hatches = [None] * color_types + ['//'] * color_types + ['|'] * color_types
20effccb7dSTang Haojin
21effccb7dSTang Haojin    n_conf = len(configs)
22effccb7dSTang Haojin    # Draw stacked bar chart for each simulator
23effccb7dSTang Haojin    width = 0.8 / n_conf
24effccb7dSTang Haojin    # set figure size:
25effccb7dSTang Haojin
26effccb7dSTang Haojin    fig, ax = plt.subplots()
27effccb7dSTang Haojin    fig.set_size_inches(8.0, 5.0)
28effccb7dSTang Haojin
29effccb7dSTang Haojin    x = None
30effccb7dSTang Haojin    have_set_label = False
31effccb7dSTang Haojin
32effccb7dSTang Haojin    dfs = [pd.read_csv(result[0], index_col=0)
33effccb7dSTang Haojin           for _, result in results.items()]
34effccb7dSTang Haojin    common_bmk = list(set.intersection(*[set(df.index) for df in dfs]))
35effccb7dSTang Haojin    dfs = [df.loc[common_bmk] for df in dfs]
36effccb7dSTang Haojin
37effccb7dSTang Haojin    rename = True
38effccb7dSTang Haojin    fine_grain_rename = False
39effccb7dSTang Haojin    renamed_dfs = []
40effccb7dSTang Haojin    for df in dfs:
41effccb7dSTang Haojin        to_drops = []
42effccb7dSTang Haojin        sorted_cols = []
43effccb7dSTang Haojin
44effccb7dSTang Haojin        def rename_with_map(df, rename_map):
45effccb7dSTang Haojin            for k in rename_map:
46effccb7dSTang Haojin                if rename_map[k] is not None:
47effccb7dSTang Haojin                    if rename_map[k].startswith('Merge'):
48effccb7dSTang Haojin                        merged = rename_map[k][5:]
49effccb7dSTang Haojin                        if merged not in df.columns:
50effccb7dSTang Haojin                            df[merged] = df[k]
51effccb7dSTang Haojin                            sorted_cols.append(merged)
52effccb7dSTang Haojin                        else:
53effccb7dSTang Haojin                            df[merged] += df[k]
54effccb7dSTang Haojin                    else:
55effccb7dSTang Haojin                        df[rename_map[k]] = df[k]
56effccb7dSTang Haojin                        sorted_cols.append(rename_map[k])
57effccb7dSTang Haojin
58effccb7dSTang Haojin                    to_drops.append(k)
59effccb7dSTang Haojin                else:
60effccb7dSTang Haojin                    sorted_cols.append(k)
61effccb7dSTang Haojin            df.drop(columns=to_drops, inplace=True)
62effccb7dSTang Haojin
63effccb7dSTang Haojin        # Merge df columns according to the rename map if value starting with 'Merge'
64effccb7dSTang Haojin        if rename:
65effccb7dSTang Haojin            if fine_grain_rename:
66effccb7dSTang Haojin                rename_with_map(df, cf.xs_fine_grain_rename_map)
67effccb7dSTang Haojin            else:
68effccb7dSTang Haojin                rename_with_map(df, cf.xs_coarse_rename_map)
69effccb7dSTang Haojin
70effccb7dSTang Haojin            icount = 20 * 10 ** 6
71effccb7dSTang Haojin            if 'BadSpecInst' in df.columns:
72effccb7dSTang Haojin                df['BadSpecInst'] += df['Base'] - icount
73effccb7dSTang Haojin            else:
74effccb7dSTang Haojin                df['BadSpecInst'] = df['Base'] - icount
75effccb7dSTang Haojin            df['Base'] = icount
76effccb7dSTang Haojin
77effccb7dSTang Haojin        df = df.astype(float)
78effccb7dSTang Haojin        renamed_dfs.append(df)
79effccb7dSTang Haojin
80effccb7dSTang Haojin    common_col = list(set.intersection(
81effccb7dSTang Haojin        *[set(df.columns) for df in renamed_dfs]))
82effccb7dSTang Haojin    unique_cols = set()
83effccb7dSTang Haojin    for df in renamed_dfs:
84effccb7dSTang Haojin        unique_col = set(df.columns) - set(common_col)
85effccb7dSTang Haojin        for col in unique_col:
86effccb7dSTang Haojin            unique_cols.add(col)
87effccb7dSTang Haojin    for df in renamed_dfs:
88effccb7dSTang Haojin        for col in unique_cols:
89effccb7dSTang Haojin            if col not in df.columns:
90effccb7dSTang Haojin                df[col] = 0.0
91effccb7dSTang Haojin        df.sort_index(axis=1, inplace=True)
92effccb7dSTang Haojin
93effccb7dSTang Haojin    put_to_front = ['Base', 'BadSpec']
94effccb7dSTang Haojin
95effccb7dSTang Haojin    tmp_df = renamed_dfs[0].sort_values(by='cpi', ascending=False)
96effccb7dSTang Haojin    bmk_sort = tmp_df.index.tolist()
97effccb7dSTang Haojin
98effccb7dSTang Haojin    for df in renamed_dfs:
99effccb7dSTang Haojin        df = df.loc[bmk_sort]
100effccb7dSTang Haojin        df = df[put_to_front +
101effccb7dSTang Haojin                [col for col in df.columns if col not in put_to_front]]
102effccb7dSTang Haojin        df = df.drop(columns=['cpi'])
103effccb7dSTang Haojin        for to_drop in ['ipc', 'cpi', 'Cycles', 'Insts', 'coverage']:
104effccb7dSTang Haojin            if to_drop in df.columns:
105effccb7dSTang Haojin                df = df.drop(columns=[to_drop])
106effccb7dSTang Haojin
107effccb7dSTang Haojin        # draw stacked bar chart
108effccb7dSTang Haojin        bottom = np.zeros(len(df))
109effccb7dSTang Haojin        highest = 0.0
110effccb7dSTang Haojin        if x is None:
111effccb7dSTang Haojin            x = np.arange(len(df), dtype=float)
112effccb7dSTang Haojin        for component, color, hatch in zip(df.columns, colors[:len(df.columns)], hatches[:len(df.columns)]):
113effccb7dSTang Haojin            if have_set_label:
114effccb7dSTang Haojin                label = None
115effccb7dSTang Haojin            else:
116effccb7dSTang Haojin                label = component
117effccb7dSTang Haojin            ax.bar(x, df[component], bottom=bottom,
118effccb7dSTang Haojin                   width=width, color=color, label=label, edgecolor='black', hatch=hatch)
119effccb7dSTang Haojin            highest = max((bottom + df[component]).max(), highest)
120effccb7dSTang Haojin            bottom += df[component]
121effccb7dSTang Haojin        x += width
122effccb7dSTang Haojin        have_set_label = True
123effccb7dSTang Haojin    # replace x tick labels with df.index with rotation
124effccb7dSTang Haojin    ax.set_xticks(x - width * len(results) / n_conf - 0.25)
125effccb7dSTang Haojin    ax.set_xticklabels(bmk_sort, rotation=90)
126effccb7dSTang Haojin    ax.tick_params(left=False, bottom=False)
127effccb7dSTang Haojin    ax.set_ylabel('Slots')
128effccb7dSTang Haojin    ax.set_xlabel('SPECCPU 2006 Benchmarks')
129effccb7dSTang Haojin
130effccb7dSTang Haojin    handles, labels = plt.gca().get_legend_handles_labels()
131*03a1a638SZakilim    ax.legend(list(reversed(handles)), list(reversed(labels)), fancybox=True,
132effccb7dSTang Haojin              framealpha=0.3,
133effccb7dSTang Haojin              loc='best',
134effccb7dSTang Haojin              ncol=3,
135effccb7dSTang Haojin              )
136effccb7dSTang Haojin    if n_conf == 2:
137effccb7dSTang Haojin        ax.set_title(f'{configs[0]} <-- VS. --> {configs[1]}')
138effccb7dSTang Haojin
139effccb7dSTang Haojin    fig.savefig(osp.join('results', 'result.png'),
140effccb7dSTang Haojin                bbox_inches='tight', pad_inches=0.05, dpi=200)
141