From d0edda93adeed7e8fd5c23a09b0cee86ddfe5745 Mon Sep 17 00:00:00 2001 From: Hunter Nichols Date: Thu, 7 Feb 2019 02:27:22 -0800 Subject: [PATCH] Added more variance analysis for the delay data --- compiler/characterizer/model_check.py | 5 +- compiler/tests/config_data.py | 2 +- compiler/tests/delay_data_collection.py | 74 ++++++++++++++++++------- 3 files changed, 57 insertions(+), 24 deletions(-) diff --git a/compiler/characterizer/model_check.py b/compiler/characterizer/model_check.py index b791e520..88e0b96a 100644 --- a/compiler/characterizer/model_check.py +++ b/compiler/characterizer/model_check.py @@ -38,6 +38,7 @@ class model_check(delay): self.rbl_delay_meas_names = ["delay_gated_clk_nand", "delay_delay_chain_in"]+dc_delay_names self.sae_delay_meas_names = ["delay_pre_sen"]+sen_driver_delay_names+["delay_sen"] + self.delay_chain_indices = (len(self.rbl_delay_meas_names)-len(dc_delay_names), len(self.rbl_delay_meas_names)) #Create slew measurement names wl_en_driver_slew_names = ["slew_wl_en_dvr{}_".format(stage) for stage in range(1,self.get_num_wl_en_driver_stages())] wl_driver_slew_names = ["slew_wl_dvr{}_".format(stage) for stage in range(1,self.get_num_wl_driver_stages())] @@ -61,14 +62,14 @@ class model_check(delay): ["Xsram.wl_en0", "Xsram.Xbank0.Xwordline_driver0.wl_bar_{}".format(self.wordline_row)]+\ wl_driver_signals+\ ["Xsram.Xbank0.wl_{}".format(self.wordline_row)] - self.rbl_en_signal_names = ["Xsram.Xcontrol0.gated_clk_bar", "Xsram.Xcontrol0.Xand2_rbl_in.zb_int", "Xsram.Xcontrol0.rbl_in"]+\ + pre_delay_chain_names = ["Xsram.Xcontrol0.gated_clk_bar", "Xsram.Xcontrol0.Xand2_rbl_in.zb_int", "Xsram.Xcontrol0.rbl_in"] + self.rbl_en_signal_names = pre_delay_chain_names+\ delay_chain_signal_names+\ ["Xsram.Xcontrol0.Xreplica_bitline.delayed_en"] self.sae_signal_names = ["Xsram.Xcontrol0.Xreplica_bitline.bl0_0", "Xsram.Xcontrol0.pre_s_en"]+\ sen_driver_signals+\ ["Xsram.s_en0"] - def create_measurement_objects(self): """Create the measurements used for read and write ports""" self.create_wordline_measurement_objects() diff --git a/compiler/tests/config_data.py b/compiler/tests/config_data.py index f81a2451..849d441d 100755 --- a/compiler/tests/config_data.py +++ b/compiler/tests/config_data.py @@ -4,7 +4,7 @@ num_words = 16 tech_name = "freepdk45" #process_corners = ["TT", "FF", "SS", "SF", "FS"] -process_corners = ["TT"] +process_corners = ["TT", "FF", "SS"] supply_voltages = [1.0] temperatures = [25] diff --git a/compiler/tests/delay_data_collection.py b/compiler/tests/delay_data_collection.py index 7c98bccf..3b1fe938 100644 --- a/compiler/tests/delay_data_collection.py +++ b/compiler/tests/delay_data_collection.py @@ -20,28 +20,60 @@ MODEL_DIR = "model_data/" class data_collection(openram_test): def runTest(self): - ratio_data = self.calculate_delay_ratios_of_srams() - self.display_data(ratio_data) - # word_size, num_words, words_per_row = 4, 16, 1 - # self.init_data_gen() - # self.set_delay_chain(2,3) - # self.save_data_sram_corners(word_size, num_words, words_per_row) - # wl_dataframe, sae_dataframe = self.get_csv_data() - # self.evaluate_data(wl_dataframe, sae_dataframe) - - #Run again but with different delay chain sizes - # self.init_data_gen() - # self.set_delay_chain(4,2) - # self.save_data_sram_corners(word_size, num_words, words_per_row) - # wl_dataframe, sae_dataframe = self.get_csv_data() - # self.evaluate_data(wl_dataframe, sae_dataframe) - - # model_delay_ratios, meas_delay_ratios, ratio_error = self.compare_model_to_measure() - # debug.info(1, "model_delay_ratios={}".format(model_delay_ratios)) - # debug.info(1, "meas_delay_ratios={}".format(meas_delay_ratios)) - # debug.info(1, "ratio_error={}".format(ratio_error)) - # globals.end_openram() + #Uncomment this for model evaluation + # ratio_data = self.calculate_delay_ratios_of_srams() + # self.display_data(ratio_data) + + self.run_delay_chain_variation_analysis() + + globals.end_openram() + + def run_delay_chain_variation_analysis(self): + """Generates sram with different delay chain configs over different corners and + analyzes delay 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_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)) + + self.plot_data(dc_config_list, dc_vars) + #display data + + def calculate_delay_chain_variance(self, sae_dataframe): + """Determines the delay variance of the delay chain over 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 = [] + row_count = 0 + #Get delay sums over different corners + 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)) + + #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) + return delay_variance + + def plot_data(self, x_labels, y_values): + """Display a plot using matplot lib. + Assumes input x values are just labels and y values are actual data.""" + data_range = [i+1 for i in range(len(x_labels))] + plt.xticks(data_range, x_labels) + plt.plot(data_range, y_values, 'ro') + plt.show() + def calculate_delay_ratios_of_srams(self): """Runs delay measurements on several sram configurations. Computes the delay ratio for each one."""