From 6d2a35e929991922398f36696fb34faf5c549f23 Mon Sep 17 00:00:00 2001 From: Hunter Nichols Date: Tue, 19 Jan 2021 13:47:54 -0800 Subject: [PATCH] Changed most lists to dict to reduce hardcoded indices --- compiler/characterizer/linear_regression.py | 65 ++++++++++++--------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/compiler/characterizer/linear_regression.py b/compiler/characterizer/linear_regression.py index 367f7b9d..5d4cbe49 100644 --- a/compiler/characterizer/linear_regression.py +++ b/compiler/characterizer/linear_regression.py @@ -25,9 +25,18 @@ data_fnames = ["rise_delay.csv", "read1_power.csv", "read0_power.csv", "leakage_data.csv"] - +# Positions must correspond to data_fname list +lib_dnames = ["delay_lh", + "delay_hl", + "slew_lh", + "slew_hl", + "write1_power", + "write0_power", + "read1_power", + "read0_power", + "leakage_power"] data_dir = OPTS.openram_tech+relative_data_path -data_paths = [data_dir +'/'+fname for fname in data_fnames] +data_paths = {dname:data_dir +'/'+fname for dname, fname in zip(lib_dnames, data_fnames)} class linear_regression(simulation): @@ -60,31 +69,30 @@ class linear_regression(simulation): for slew in slews: for load in loads: # List returned with value order being delay, power, leakage, slew - # FIXME: make order less hard coded sram_vals = self.get_predictions(model_inputs+[slew, load], models) # Delay is only calculated on a single port and replicated for now. for port in self.all_ports: - port_data[port]['delay_lh'].append(sram_vals[0][0][0]) - port_data[port]['delay_hl'].append(sram_vals[1][0][0]) - port_data[port]['slew_lh'].append(sram_vals[2][0][0]) - port_data[port]['slew_hl'].append(sram_vals[3][0][0]) + port_data[port]['delay_lh'].append(sram_vals['delay_lh']) + port_data[port]['delay_hl'].append(sram_vals['delay_hl']) + port_data[port]['slew_lh'].append(sram_vals['slew_lh']) + port_data[port]['slew_hl'].append(sram_vals['slew_hl']) - port_data[port]['write1_power'].append(sram_vals[4][0][0]) - port_data[port]['write0_power'].append(sram_vals[5][0][0]) - port_data[port]['read1_power'].append(sram_vals[6][0][0]) - port_data[port]['read0_power'].append(sram_vals[7][0][0]) + port_data[port]['write1_power'].append(sram_vals['write1_power']) + port_data[port]['write0_power'].append(sram_vals['write0_power']) + port_data[port]['read1_power'].append(sram_vals['read1_power']) + port_data[port]['read0_power'].append(sram_vals['read0_power']) # Disabled power not modeled. Copied from other power predictions - port_data[port]['disabled_write1_power'].append(sram_vals[4][0][0]) - port_data[port]['disabled_write0_power'].append(sram_vals[5][0][0]) - port_data[port]['disabled_read1_power'].append(sram_vals[6][0][0]) - port_data[port]['disabled_read0_power'].append(sram_vals[7][0][0]) + port_data[port]['disabled_write1_power'].append(sram_vals['write1_power']) + port_data[port]['disabled_write0_power'].append(sram_vals['write0_power']) + port_data[port]['disabled_read1_power'].append(sram_vals['read1_power']) + port_data[port]['disabled_read0_power'].append(sram_vals['read0_power']) # Estimate the period as double the delay with margin period_margin = 0.1 - sram_data = {"min_period": sram_vals[0][0][0] * 2, - "leakage_power": sram_vals[8][0][0]} + sram_data = {"min_period": sram_vals['delay_lh'] * 2, + "leakage_power": sram_vals["leakage_power"]} debug.info(2, "SRAM Data:\n{}".format(sram_data)) debug.info(2, "Port Data:\n{}".format(port_data)) @@ -95,27 +103,32 @@ class linear_regression(simulation): """ Generate a model and prediction for LIB output """ - - scaled_inputs = np.asarray([scale_input_datapoint(model_inputs, data_paths[0])]) + + #Scaled the inputs using first data file as a reference + data_name = lib_dnames[0] + scaled_inputs = np.asarray([scale_input_datapoint(model_inputs, data_paths[data_name])]) - predictions = [] - for m, path in zip(models, data_paths): + predictions = {} + for dname in data_paths.keys(): + path = data_paths[dname] + m = models[dname] + features, labels = get_scaled_data(path) scaled_pred = self.model_prediction(m, scaled_inputs) pred = unscale_data(scaled_pred.tolist(), path) debug.info(1,"Unscaled Prediction = {}".format(pred)) - predictions.append(pred) + predictions[dname] = pred[0][0] return predictions def train_models(self): """ Generate and return models """ - models = [] - for path in data_paths: - features, labels = get_scaled_data(path) + models = {} + for dname, dpath in data_paths.items(): + features, labels = get_scaled_data(dpath) model = self.generate_model(features, labels) - models.append(model) + models[dname] = model return models