def infer_local_buses_attr()

in design_utils/design.py [0:0]


    def infer_local_buses_attr(self):
        attr_val = {}
        # get all the local buses
        local_buses = []
        for block in self.dp_rep.get_blocks():
            if self.infer_if_is_a_local_bus(block):
                local_buses.append(block)

        # get all the frequenies
        freq_list = []
        for bus in local_buses:
            freq_list.append(bus.get_block_freq())

        # get all the bus widths
        bus_width_list = []
        for bus in local_buses:
            bus_width_list.append(bus.get_block_bus_width())

        bus_bandwidth_list = []
        for bus in local_buses:
            bus_bandwidth_list.append(bus.get_block_bus_width()*bus.get_block_freq())

        local_buses_avg_work_rate_list = []
        local_buses_max_work_rate_list = []
        for bus in local_buses:
            work_rate = []
            for pipe_cluster in bus.get_pipe_clusters():
                pathlet_phase_work_rate = pipe_cluster.get_pathlet_phase_work_rate()
                for pathlet, phase_work_rate in pathlet_phase_work_rate.items():
                    if not pathlet.get_out_pipe().get_slave().subtype == "dram":
                        work_rate.extend(list(phase_work_rate.values()))
            local_buses_avg_work_rate_list.append(sum(work_rate)/len(work_rate))
            local_buses_max_work_rate_list.append(max(work_rate))


        local_channels_avg_work_rate_list = []
        local_channels_max_work_rate_list = []
        for bus in local_buses:
            for pipe_cluster in bus.get_pipe_clusters():
                work_rate = []
                pathlet_phase_work_rate = pipe_cluster.get_pathlet_phase_work_rate()
                for pathlet, phase_work_rate in pathlet_phase_work_rate.items():
                    if not pathlet.get_out_pipe().get_slave().subtype == "dram":
                        work_rate.extend(list(phase_work_rate.values()))
                if len(work_rate) == 0:
                    continue
                local_channels_avg_work_rate_list.append(sum(work_rate)/max(len(work_rate),1))
                local_channels_max_work_rate_list.append(max(work_rate))


        local_channels_cnt_per_bus = {}
        for bus in local_buses:
            local_channels_cnt_per_bus[bus] =0
            work_rate = []
            for pipe_cluster in bus.get_pipe_clusters():
                pathlet_phase_work_rate = pipe_cluster.get_pathlet_phase_work_rate()
                for pathlet, phase_work_rate in pathlet_phase_work_rate.items():
                    if not pathlet.get_out_pipe().get_slave().subtype == "dram":
                        work_rate.extend(list(phase_work_rate.values()))
                if len(work_rate) == 0:
                    continue
                local_channels_cnt_per_bus[bus] +=1

        attr_val["local_bus_count"] = len(local_buses)
        if len(local_buses) == 0:
            attr_val["avg_freq"] = 0
            attr_val["local_bus_avg_freq"] = 0
            attr_val["local_bus_avg_bus_width"]  = 0
            attr_val["local_bus_avg_theoretical_bandwidth"]  = 0
            attr_val["local_bus_avg_actual_bandwidth"]  = 0
            attr_val["local_bus_max_actual_bandwidth"]  = 0
            attr_val["local_bus_cnt"]  = 0
            attr_val["local_channel_avg_actual_bandwidth"] = 0
            attr_val["local_channel_max_actual_bandwidth"] = 0
            attr_val["local_channel_count_per_bus_avg"] = 0
        else:
            attr_val["avg_freq"] = sum(freq_list) / len(freq_list)
            attr_val["local_bus_avg_freq"] = sum(freq_list) / len(freq_list)
            attr_val["local_bus_avg_bus_width"]  = sum(bus_width_list)/len(freq_list)
            attr_val["local_bus_avg_theoretical_bandwidth"]  = sum(bus_bandwidth_list)/len(bus_bandwidth_list)
            attr_val["local_bus_avg_actual_bandwidth"]  = sum(local_buses_avg_work_rate_list)/len(local_buses_avg_work_rate_list)
            # getting average of max
            attr_val["local_bus_max_actual_bandwidth"]  = sum(local_buses_max_work_rate_list)/len(local_buses_max_work_rate_list)
            attr_val["local_bus_cnt"]  = len(bus_width_list)
            attr_val["local_channel_avg_actual_bandwidth"] = st.mean(local_channels_avg_work_rate_list)
            attr_val["local_channel_max_actual_bandwidth"] = st.mean(local_channels_max_work_rate_list)
            attr_val["local_channel_count_per_bus_avg"] = st.mean(list(local_channels_cnt_per_bus.values()))


        if len(local_buses) in [0,1]:
            attr_val["local_bus_freq_std"] = 0
            attr_val["local_bus_freq_coeff_var"] = 0
            attr_val["local_bus_bus_width_std"] = 0
            attr_val["local_bus_bus_width_coeff_var"] = 0
            attr_val["local_bus_actual_bandwidth_std"] = 0
            attr_val["local_bus_actual_bandwidth_coeff_var"] = 0
            attr_val["local_channel_actual_bandwidth_std"] = 0
            attr_val["local_channel_actual_bandwidth_coeff_var"] = 0
            attr_val["local_channel_count_per_bus_std"] = 0
            attr_val["local_channel_count_per_bus_coeff_var"] = 0
        else:
            attr_val["local_bus_freq_std"] = st.stdev(freq_list)
            attr_val["local_bus_freq_coeff_var"] = st.stdev(freq_list)/st.mean(freq_list)
            attr_val["local_bus_bus_width_std"] = st.stdev(bus_width_list)
            attr_val["local_bus_bus_width_coeff_var"] = st.stdev(bus_width_list)/st.mean(bus_width_list)
            attr_val["local_bus_actual_bandwidth_std"] = st.stdev(local_buses_avg_work_rate_list)
            attr_val["local_bus_actual_bandwidth_coeff_var"] = st.stdev(local_buses_avg_work_rate_list)/st.mean(local_buses_avg_work_rate_list)
            attr_val["local_channel_actual_bandwidth_std"] = st.stdev(local_channels_avg_work_rate_list)
            attr_val["local_channel_actual_bandwidth_coeff_var"] = st.stdev(local_channels_avg_work_rate_list)/st.mean(local_channels_avg_work_rate_list)
            attr_val["local_channel_count_per_bus_std"] = st.stdev(list(local_channels_cnt_per_bus.values()))
            attr_val["local_channel_count_per_bus_coeff_var"] = st.stdev(list(local_channels_cnt_per_bus.values()))/st.mean(list(local_channels_cnt_per_bus.values()))

        return attr_val