def get_compute_system_attr()

in design_utils/design.py [0:0]


    def get_compute_system_attr(self):
        ips = [el for el in self.dp_rep.get_blocks() if el.subtype == "ip"]
        gpps = [el for el in self.dp_rep.get_blocks() if el.subtype == "gpp"]


        # get frequency data
        ips_freqs = [mem.get_block_freq() for mem  in ips]
        gpp_freqs = [mem.get_block_freq() for mem  in gpps]
        if len(ips_freqs) == 0:
            ips_avg_freq =  0
        else:
            ips_avg_freq=  sum(ips_freqs)/max(len(ips_freqs),1)

        loop_itr_ratio = []
        for ip in ips:
            loop_itr_ratio.append(ip.get_loop_itr_cnt()/ip.get_loop_max_possible_itr_cnt())

        if len(ips) == 0:
            loop_itr_ratio_avg = 0
        else:
            loop_itr_ratio_avg = st.mean(loop_itr_ratio)


        if len(ips_freqs) in [0,1]:
            ips_freq_std = 0
            ips_freq_coeff_var = 0
            loop_itr_ratio_std = 0
            loop_itr_ratio_var = 0
        else:
            ips_freq_std = st.stdev(ips_freqs)
            ips_freq_coeff_var = st.stdev(ips_freqs)/st.mean(ips_freqs)
            loop_itr_ratio_std = st.stdev(loop_itr_ratio)
            loop_itr_ratio_var = st.stdev(loop_itr_ratio)/st.mean(loop_itr_ratio)

        if len(gpp_freqs) == 0:
            gpps_avg_freq =  0
        else:
            gpps_avg_freq=  sum(gpp_freqs)/max(len(gpp_freqs),1)

        if len(gpp_freqs + ips_freqs) in [0,1]:
            pes_freq_std = 0
            pes_freq_coeff_var = 0
        else:
            pes_freq_std = st.stdev(ips_freqs + gpp_freqs)
            pes_freq_coeff_var = st.stdev(ips_freqs + gpp_freqs) / st.mean(ips_freqs + gpp_freqs)


        # get area data
        ips_area = [mem.get_area() for mem in ips]
        gpp_area = [mem.get_area() for mem in gpps]

        if len(ips_area) == 0:
            ips_total_area = 0

        else:
            ips_total_area = sum(ips_area)

        if len(ips_area) in [0,1]:
            ips_area_std = 0
            ips_area_coeff_var = 0
        else:
            ips_area_std = st.stdev(ips_area)
            ips_area_coeff_var = st.stdev(ips_area) / st.mean(ips_area)

        if len(gpp_area) == 0:
            gpps_total_area = 0
        else:
            gpps_total_area = sum(gpp_area)


        if len(ips_area + gpp_area) in [0,1]:
            pes_area_std = 0
            pes_area_coeff_var = 0
        else:
            pes_area_std = st.stdev(ips_area+gpp_area)
            pes_area_coeff_var = st.stdev(ips_area+gpp_area)/st.mean(ips_area+gpp_area)

        phase_accelerator_parallelism = {}
        for phase, krnls in self.dp_rep.phase_krnl_present.items():
            accelerators_in_parallel =  []
            for krnl in krnls:
                accelerators_in_parallel.extend([blk for blk in krnl.get_blocks() if blk.subtype == "ip"])
            if len(accelerators_in_parallel)  == 0:
                continue
            phase_accelerator_parallelism[phase] = len(accelerators_in_parallel)

        if len(phase_accelerator_parallelism.keys()) == 0:
            avg_accel_parallelism = 0
            max_accel_parallelism = 0
        else:
            avg_accel_parallelism = sum(list(phase_accelerator_parallelism.values()))/len(list(phase_accelerator_parallelism.values()))
            max_accel_parallelism = max(list(phase_accelerator_parallelism.values()))


        phase_gpp_parallelism = {}
        for phase, krnls in self.dp_rep.phase_krnl_present.items():
            gpps_in_parallel =  []
            for krnl in krnls:
                gpps_in_parallel.extend([blk for blk in krnl.get_blocks() if blk.subtype == "gpp"])
            if len(gpps_in_parallel)  == 0:
                continue
            phase_gpp_parallelism[phase] = len(gpps_in_parallel)

        if len(phase_gpp_parallelism.keys()) == 0:
            avg_gpp_parallelism = 0
            max_gpp_parallelism = 0
        else:
            avg_gpp_parallelism = sum(list(phase_gpp_parallelism.values()))/len(list(phase_gpp_parallelism.values()))
            max_gpp_parallelism = max(list(phase_gpp_parallelism.values()))



        buses = [el for el in self.dp_rep.get_blocks() if el.subtype == "ic"]
        bus_neigh_count = []
        for bus in buses:
            pe_neighs  = [neigh for neigh in bus.get_neighs() if neigh.type == "pe"]
            bus_neigh_count.append(len(pe_neighs))

        cluster_pe_cnt_avg = st.mean(bus_neigh_count)
        if len(bus_neigh_count) in [0,1]:
            cluster_pe_cnt_std = 0
            cluster_pe_cnt_coeff_var = 0
        else:
            cluster_pe_cnt_std = st.stdev(bus_neigh_count)
            cluster_pe_cnt_coeff_var = st.stdev(bus_neigh_count)/st.mean(bus_neigh_count)

        return {
                "avg_accel_parallelism": avg_accel_parallelism, "max_accel_parallelism":max_accel_parallelism,
                "avg_gpp_parallelism": avg_gpp_parallelism, "max_gpp_parallelism": max_gpp_parallelism,
                "ip_cnt":len(ips), "gpp_cnt": len(gpps),
                "ips_avg_freq": ips_avg_freq, "gpps_avg_freq":gpps_avg_freq,
                "ips_freq_std": ips_freq_std, "pes_freq_std": pes_freq_std,
                "ips_freq_coeff_var": ips_freq_coeff_var, "pes_freq_coeff_var": pes_freq_coeff_var,
                "ips_total_area": ips_total_area, "gpps_total_area":gpps_total_area,
                "ips_area_std": ips_area_std, "pes_area_std": pes_area_std,
                "ips_area_coeff_var": ips_area_coeff_var, "pes_area_coeff_var": pes_area_coeff_var,
                "pe_total_area":ips_total_area+gpps_total_area,
                "loop_itr_ratio_avg":loop_itr_ratio_avg,
                "loop_itr_ratio_std":loop_itr_ratio_std,
                "loop_itr_ratio_var":loop_itr_ratio_var,
              "cluster_pe_cnt_avg":cluster_pe_cnt_avg,
                "cluster_pe_cnt_std":cluster_pe_cnt_std,
                "cluster_pe_cnt_coeff_var":cluster_pe_cnt_coeff_var
            }