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