From f1f6a1a520f75aabb64afc45dd6ff7d25632753d Mon Sep 17 00:00:00 2001 From: Hunter Nichols Date: Tue, 15 Dec 2020 12:08:31 -0800 Subject: [PATCH] Removed windows end of line characters. --- compiler/characterizer/linear_regression.py | 238 +++++++++--------- technology/scn4m_subm/sim_data/delay_data.csv | 18 +- .../scn4m_subm/sim_data/leakage_data.csv | 18 +- technology/scn4m_subm/sim_data/power_data.csv | 18 +- technology/scn4m_subm/sim_data/slew_data.csv | 18 +- 5 files changed, 152 insertions(+), 158 deletions(-) diff --git a/compiler/characterizer/linear_regression.py b/compiler/characterizer/linear_regression.py index 65b5c9c9..ef6cf4f6 100644 --- a/compiler/characterizer/linear_regression.py +++ b/compiler/characterizer/linear_regression.py @@ -1,123 +1,117 @@ -# See LICENSE for licensing information. -# -# Copyright (c) 2016-2019 Regents of the University of California and The Board -# of Regents for the Oklahoma Agricultural and Mechanical College -# (acting for and on behalf of Oklahoma State University) -# All rights reserved. -# - -from .analytical_util import * -from .simulation import simulation -from globals import OPTS -import debug - -import os -from sklearn.linear_model import LinearRegression -import math - -relative_data_path = "/sim_data" -data_fnames = ["delay_data.csv", - "power_data.csv", - "leakage_data.csv", - "slew_data.csv"] -tech_path = os.environ.get('OPENRAM_TECH') -data_dir = tech_path+'/'+OPTS.tech_name+relative_data_path -data_paths = [data_dir +'/'+fname for fname in data_fnames] - -class linear_regression(simulation): - - def __init__(self, sram, spfile, corner): - super().__init__(sram, spfile, corner) - self.set_corner(corner) - self.create_signal_names() - self.add_graph_exclusions() - self.delay_model = None - self.slew_model = None - self.power_model = None - self.leakage_model = None - - def get_lib_values(self, slews, loads): - """ - A model and prediction is created for each output needed for the LIB - """ - - log_num_words = math.log(OPTS.num_words, 2) - debug.info(1, "OPTS.words_per_row={}".format(OPTS.words_per_row)) - model_inputs = [log_num_words, - OPTS.word_size, - OPTS.words_per_row, - self.sram.width * self.sram.height] - - # List returned with value order being delay, power, leakage, slew - # FIXME: make order less hard coded - sram_vals = self.get_predictions(model_inputs) - - self.create_measurement_names() - - - # Set delay/power for slews and loads - port_data = self.get_empty_measure_data_dict() - debug.info(1, 'Slew, Load, Delay(ns), Slew(ns)') - max_delay = 0.0 - for slew in slews: - for load in loads: - - # Delay is only calculated on a single port and replicated for now. - for port in self.all_ports: - for mname in self.delay_meas_names + self.power_meas_names: - #FIXME: fix magic for indexing the data - #FIXME: model output is double list. Simply this - if "power" in mname: - port_data[port][mname].append(sram_vals[1][0][0]) - elif "delay" in mname and port in self.read_ports: - port_data[port][mname].append(sram_vals[0][0][0]) - elif "slew" in mname and port in self.read_ports: - port_data[port][mname].append(sram_vals[3][0][0]) - else: - debug.error("Measurement name not recognized: {}".format(mname), 1) - - # 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[2][0][0]} - - debug.info(2, "SRAM Data:\n{}".format(sram_data)) - debug.info(2, "Port Data:\n{}".format(port_data)) - - return (sram_data, port_data) - - def get_predictions(self, model_inputs): - """ - Generate a model and prediction for LIB output - """ - - scaled_inputs = np.asarray([scale_input_datapoint(model_inputs, data_paths[0])]) - - predictions = [] - for path in data_paths: - features, labels = get_scaled_data(path) - model = self.generate_model(features, labels) - scaled_pred = self.model_prediction(model, scaled_inputs) - pred = unscale_data(scaled_pred.tolist(), path) - debug.info(1,"Unscaled Prediction = {}".format(pred)) - predictions.append(pred) - return predictions - - def generate_model(self, features, labels): - """ - Supervised training of model. - """ - - model = LinearRegression() - model.fit(features, labels) - return model - - def model_prediction(self, model, features): - """ - Have the model perform a prediction and unscale the prediction - as the model is trained with scaled values. - """ - - pred = model.predict(features) - return pred +# See LICENSE for licensing information. +# +# Copyright (c) 2016-2019 Regents of the University of California and The Board +# of Regents for the Oklahoma Agricultural and Mechanical College +# (acting for and on behalf of Oklahoma State University) +# All rights reserved. +# + +from .analytical_util import * +from .simulation import simulation +from globals import OPTS +import debug + +import os +from sklearn.linear_model import LinearRegression +import math + +relative_data_path = "/sim_data" +data_fnames = ["delay_data.csv", + "power_data.csv", + "leakage_data.csv", + "slew_data.csv"] +tech_path = os.environ.get('OPENRAM_TECH') +data_dir = tech_path+'/'+OPTS.tech_name+relative_data_path +data_paths = [data_dir +'/'+fname for fname in data_fnames] + +class linear_regression(simulation): + + def __init__(self, sram, spfile, corner): + super().__init__(sram, spfile, corner) + self.set_corner(corner) + + def get_lib_values(self, slews, loads): + """ + A model and prediction is created for each output needed for the LIB + """ + + log_num_words = math.log(OPTS.num_words, 2) + debug.info(1, "OPTS.words_per_row={}".format(OPTS.words_per_row)) + model_inputs = [log_num_words, + OPTS.word_size, + OPTS.words_per_row, + self.sram.width * self.sram.height] + + # List returned with value order being delay, power, leakage, slew + # FIXME: make order less hard coded + sram_vals = self.get_predictions(model_inputs) + + self.create_measurement_names() + + + # Set delay/power for slews and loads + port_data = self.get_empty_measure_data_dict() + debug.info(1, 'Slew, Load, Delay(ns), Slew(ns)') + max_delay = 0.0 + for slew in slews: + for load in loads: + + # Delay is only calculated on a single port and replicated for now. + for port in self.all_ports: + for mname in self.delay_meas_names + self.power_meas_names: + #FIXME: fix magic for indexing the data + #FIXME: model output is double list. Simply this + if "power" in mname: + port_data[port][mname].append(sram_vals[1][0][0]) + elif "delay" in mname and port in self.read_ports: + port_data[port][mname].append(sram_vals[0][0][0]) + elif "slew" in mname and port in self.read_ports: + port_data[port][mname].append(sram_vals[3][0][0]) + else: + debug.error("Measurement name not recognized: {}".format(mname), 1) + + # 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[2][0][0]} + + debug.info(2, "SRAM Data:\n{}".format(sram_data)) + debug.info(2, "Port Data:\n{}".format(port_data)) + + return (sram_data, port_data) + + def get_predictions(self, model_inputs): + """ + Generate a model and prediction for LIB output + """ + + scaled_inputs = np.asarray([scale_input_datapoint(model_inputs, data_paths[0])]) + + predictions = [] + for path in data_paths: + features, labels = get_scaled_data(path) + model = self.generate_model(features, labels) + scaled_pred = self.model_prediction(model, scaled_inputs) + pred = unscale_data(scaled_pred.tolist(), path) + debug.info(1,"Unscaled Prediction = {}".format(pred)) + predictions.append(pred) + return predictions + + def generate_model(self, features, labels): + """ + Supervised training of model. + """ + + model = LinearRegression() + model.fit(features, labels) + return model + + def model_prediction(self, model, features): + """ + Have the model perform a prediction and unscale the prediction + as the model is trained with scaled values. + """ + + pred = model.predict(features) + return pred \ No newline at end of file diff --git a/technology/scn4m_subm/sim_data/delay_data.csv b/technology/scn4m_subm/sim_data/delay_data.csv index 043403e8..46a88c5f 100644 --- a/technology/scn4m_subm/sim_data/delay_data.csv +++ b/technology/scn4m_subm/sim_data/delay_data.csv @@ -1,9 +1,9 @@ -num_words,word_size,words_per_row,area,max_delay -16,2,1,88873,2.272 -64,2,4,108116,2.721 -16,1,1,86004,2.267 -32,3,2,101618,2.634 -32,2,2,95878,2.594 -16,3,1,93009,2.292 -64,1,4,95878,2.705 -32,1,2,90139,2.552 +num_words,word_size,words_per_row,area,max_delay +16,2,1,88873,2.272 +64,2,4,108116,2.721 +16,1,1,86004,2.267 +32,3,2,101618,2.634 +32,2,2,95878,2.594 +16,3,1,93009,2.292 +64,1,4,95878,2.705 +32,1,2,90139,2.552 diff --git a/technology/scn4m_subm/sim_data/leakage_data.csv b/technology/scn4m_subm/sim_data/leakage_data.csv index f3e8afd3..5f748e04 100644 --- a/technology/scn4m_subm/sim_data/leakage_data.csv +++ b/technology/scn4m_subm/sim_data/leakage_data.csv @@ -1,9 +1,9 @@ -num_words,word_size,words_per_row,area,leakage_power -16,2,1,88873,0.0009381791 -64,2,4,108116,0.0011511999999999998 -16,1,1,86004,0.0005252088 -32,3,2,101618,0.0012168 -32,2,2,95878,0.000771978 -16,3,1,93009,0.0009978024 -64,1,4,95878,0.0006975546000000001 -32,1,2,90139,0.0006437493 +num_words,word_size,words_per_row,area,leakage_power +16,2,1,88873,0.0009381791 +64,2,4,108116,0.0011511999999999998 +16,1,1,86004,0.0005252088 +32,3,2,101618,0.0012168 +32,2,2,95878,0.000771978 +16,3,1,93009,0.0009978024 +64,1,4,95878,0.0006975546000000001 +32,1,2,90139,0.0006437493 diff --git a/technology/scn4m_subm/sim_data/power_data.csv b/technology/scn4m_subm/sim_data/power_data.csv index 301d5f9f..8e3d3de2 100644 --- a/technology/scn4m_subm/sim_data/power_data.csv +++ b/technology/scn4m_subm/sim_data/power_data.csv @@ -1,9 +1,9 @@ -num_words,word_size,words_per_row,area,read_power -16,2,1,88873,8.0252 -64,2,4,108116,9.8616 -16,1,1,86004,7.4911 -32,3,2,101618,9.0957 -32,2,2,95878,8.7143 -16,3,1,93009,8.5708 -64,1,4,95878,8.5750 -32,1,2,90139,7.9725 +num_words,word_size,words_per_row,area,read_power +16,2,1,88873,8.0252 +64,2,4,108116,9.8616 +16,1,1,86004,7.4911 +32,3,2,101618,9.0957 +32,2,2,95878,8.7143 +16,3,1,93009,8.5708 +64,1,4,95878,8.5750 +32,1,2,90139,7.9725 diff --git a/technology/scn4m_subm/sim_data/slew_data.csv b/technology/scn4m_subm/sim_data/slew_data.csv index 7bf1cbf9..87d0e196 100644 --- a/technology/scn4m_subm/sim_data/slew_data.csv +++ b/technology/scn4m_subm/sim_data/slew_data.csv @@ -1,9 +1,9 @@ -num_words,word_size,words_per_row,area,output_slew -16,2,1,88873,1.81 -64,2,4,108116,1.69 -16,1,1,86004,1.786 -32,3,2,101618,1.725 -32,2,2,95878,1.71 -16,3,1,93009,1.835 -64,1,4,95878,1.662 -32,1,2,90139,1.69 +num_words,word_size,words_per_row,area,output_slew +16,2,1,88873,1.81 +64,2,4,108116,1.69 +16,1,1,86004,1.786 +32,3,2,101618,1.725 +32,2,2,95878,1.71 +16,3,1,93009,1.835 +64,1,4,95878,1.662 +32,1,2,90139,1.69