Added mean/variance plotting

This commit is contained in:
Hunter Nichols 2019-02-07 14:21:23 -08:00
parent d0edda93ad
commit ebf43298c0
1 changed files with 46 additions and 14 deletions

View File

@ -25,33 +25,38 @@ class data_collection(openram_test):
# ratio_data = self.calculate_delay_ratios_of_srams()
# self.display_data(ratio_data)
self.run_delay_chain_variation_analysis()
self.run_delay_chain_analysis()
globals.end_openram()
def run_delay_chain_variation_analysis(self):
def run_delay_chain_analysis(self):
"""Generates sram with different delay chain configs over different corners and
analyzes delay variation."""
analyzes delay average and variation."""
OPTS.use_tech_delay_chain_size = True
#Constant sram config for this test
word_size, num_words, words_per_row = 1, 16, 1
#Only change delay chain
dc_config_list = [(2,3), (3,3), (3,4), (4,2)]
#dc_config_list = [(2,3), (3,3)]
dc_avgs = []
dc_vars = []
for stages,fanout in dc_config_list:
self.init_data_gen()
self.set_delay_chain(stages,fanout)
self.save_data_sram_corners(word_size, num_words, words_per_row)
wl_dataframe, sae_dataframe = self.get_csv_data()
var = self.calculate_delay_chain_variance(sae_dataframe)
dc_vars.append(var)
debug.info(1,"DC config={}, variance={}".format((stages,fanout), var))
delay_sums = self.get_delay_chain_sums(sae_dataframe)
dc_avgs.append(self.get_average(delay_sums))
dc_vars.append(self.get_variance(delay_sums))
debug.info(1,"DC config={}: avg={} variance={}".format((stages,fanout), dc_avgs[-1], dc_vars[-1]))
self.plot_data(dc_config_list, dc_vars)
#display data
#plot data
self.plot_two_data_sets(dc_config_list, dc_avgs, dc_vars)
#self.plot_data(dc_config_list, dc_avgs)
#self.plot_data(dc_config_list, dc_vars)
def calculate_delay_chain_variance(self, sae_dataframe):
"""Determines the delay variance of the delay chain over corners"""
def get_delay_chain_sums(self, sae_dataframe):
"""Calculate the total delay of the delay chain over different corners"""
(start_dc, end_dc) = self.delay_obj.delay_chain_indices
start_data_pos = len(self.config_fields)+1 #items before this point are configuration related
delay_sums = []
@ -60,11 +65,15 @@ class data_collection(openram_test):
for sae_row in sae_dataframe.itertuples():
dc_delays = sae_row[start_data_pos+start_dc:start_data_pos+end_dc]
delay_sums.append(sum(dc_delays))
return delay_sums
#calculate mean then variance
m = sum(delay_sums) / len(delay_sums)
delay_variance = sum((xi - m) ** 2 for xi in delay_sums) / len(delay_sums)
def get_variance(self, nums):
avg = self.get_average(nums)
delay_variance = sum((xi - avg) ** 2 for xi in nums) / len(nums)
return delay_variance
def get_average(self,nums):
return sum(nums) / len(nums)
def plot_data(self, x_labels, y_values):
"""Display a plot using matplot lib.
@ -73,7 +82,30 @@ class data_collection(openram_test):
plt.xticks(data_range, x_labels)
plt.plot(data_range, y_values, 'ro')
plt.show()
def plot_two_data_sets(self, x_labels, y1_values, y2_values):
"""Plots two data sets on the same x-axis."""
data_range = [i for i in range(len(x_labels))]
fig, ax1 = plt.subplots()
color = 'tab:red'
ax1.set_xlabel('DC (Stages,Fanout)')
ax1.set_ylabel('Average Delay (ns)', color=color)
ax1.plot(data_range, y1_values, marker='o', color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color = 'tab:blue'
#ax2.set_xticks(data_range, x_labels)
ax2.set_ylabel('Delay Variance (ns)', color=color) # we already handled the x-label with ax1
ax2.plot(data_range, y2_values, marker='*', color=color)
ax2.tick_params(axis='y', labelcolor=color)
fig.tight_layout() # otherwise the right y-label is slightly clipped
plt.xticks(data_range, x_labels)
plt.show()
def calculate_delay_ratios_of_srams(self):
"""Runs delay measurements on several sram configurations.
Computes the delay ratio for each one."""