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