Removed windows end of line characters.

This commit is contained in:
Hunter Nichols 2020-12-15 12:08:31 -08:00
parent 942675051a
commit f1f6a1a520
5 changed files with 152 additions and 158 deletions

View File

@ -1,123 +1,117 @@
# See LICENSE for licensing information. # See LICENSE for licensing information.
# #
# Copyright (c) 2016-2019 Regents of the University of California and The Board # Copyright (c) 2016-2019 Regents of the University of California and The Board
# of Regents for the Oklahoma Agricultural and Mechanical College # of Regents for the Oklahoma Agricultural and Mechanical College
# (acting for and on behalf of Oklahoma State University) # (acting for and on behalf of Oklahoma State University)
# All rights reserved. # All rights reserved.
# #
from .analytical_util import * from .analytical_util import *
from .simulation import simulation from .simulation import simulation
from globals import OPTS from globals import OPTS
import debug import debug
import os import os
from sklearn.linear_model import LinearRegression from sklearn.linear_model import LinearRegression
import math import math
relative_data_path = "/sim_data" relative_data_path = "/sim_data"
data_fnames = ["delay_data.csv", data_fnames = ["delay_data.csv",
"power_data.csv", "power_data.csv",
"leakage_data.csv", "leakage_data.csv",
"slew_data.csv"] "slew_data.csv"]
tech_path = os.environ.get('OPENRAM_TECH') tech_path = os.environ.get('OPENRAM_TECH')
data_dir = tech_path+'/'+OPTS.tech_name+relative_data_path data_dir = tech_path+'/'+OPTS.tech_name+relative_data_path
data_paths = [data_dir +'/'+fname for fname in data_fnames] data_paths = [data_dir +'/'+fname for fname in data_fnames]
class linear_regression(simulation): class linear_regression(simulation):
def __init__(self, sram, spfile, corner): def __init__(self, sram, spfile, corner):
super().__init__(sram, spfile, corner) super().__init__(sram, spfile, corner)
self.set_corner(corner) self.set_corner(corner)
self.create_signal_names()
self.add_graph_exclusions() def get_lib_values(self, slews, loads):
self.delay_model = None """
self.slew_model = None A model and prediction is created for each output needed for the LIB
self.power_model = None """
self.leakage_model = None
log_num_words = math.log(OPTS.num_words, 2)
def get_lib_values(self, slews, loads): debug.info(1, "OPTS.words_per_row={}".format(OPTS.words_per_row))
""" model_inputs = [log_num_words,
A model and prediction is created for each output needed for the LIB OPTS.word_size,
""" OPTS.words_per_row,
self.sram.width * self.sram.height]
log_num_words = math.log(OPTS.num_words, 2)
debug.info(1, "OPTS.words_per_row={}".format(OPTS.words_per_row)) # List returned with value order being delay, power, leakage, slew
model_inputs = [log_num_words, # FIXME: make order less hard coded
OPTS.word_size, sram_vals = self.get_predictions(model_inputs)
OPTS.words_per_row,
self.sram.width * self.sram.height] self.create_measurement_names()
# List returned with value order being delay, power, leakage, slew
# FIXME: make order less hard coded # Set delay/power for slews and loads
sram_vals = self.get_predictions(model_inputs) port_data = self.get_empty_measure_data_dict()
debug.info(1, 'Slew, Load, Delay(ns), Slew(ns)')
self.create_measurement_names() max_delay = 0.0
for slew in slews:
for load in loads:
# Set delay/power for slews and loads
port_data = self.get_empty_measure_data_dict() # Delay is only calculated on a single port and replicated for now.
debug.info(1, 'Slew, Load, Delay(ns), Slew(ns)') for port in self.all_ports:
max_delay = 0.0 for mname in self.delay_meas_names + self.power_meas_names:
for slew in slews: #FIXME: fix magic for indexing the data
for load in loads: #FIXME: model output is double list. Simply this
if "power" in mname:
# Delay is only calculated on a single port and replicated for now. port_data[port][mname].append(sram_vals[1][0][0])
for port in self.all_ports: elif "delay" in mname and port in self.read_ports:
for mname in self.delay_meas_names + self.power_meas_names: port_data[port][mname].append(sram_vals[0][0][0])
#FIXME: fix magic for indexing the data elif "slew" in mname and port in self.read_ports:
#FIXME: model output is double list. Simply this port_data[port][mname].append(sram_vals[3][0][0])
if "power" in mname: else:
port_data[port][mname].append(sram_vals[1][0][0]) debug.error("Measurement name not recognized: {}".format(mname), 1)
elif "delay" in mname and port in self.read_ports:
port_data[port][mname].append(sram_vals[0][0][0]) # Estimate the period as double the delay with margin
elif "slew" in mname and port in self.read_ports: period_margin = 0.1
port_data[port][mname].append(sram_vals[3][0][0]) sram_data = {"min_period": sram_vals[0][0][0] * 2,
else: "leakage_power": sram_vals[2][0][0]}
debug.error("Measurement name not recognized: {}".format(mname), 1)
debug.info(2, "SRAM Data:\n{}".format(sram_data))
# Estimate the period as double the delay with margin debug.info(2, "Port Data:\n{}".format(port_data))
period_margin = 0.1
sram_data = {"min_period": sram_vals[0][0][0] * 2, return (sram_data, port_data)
"leakage_power": sram_vals[2][0][0]}
def get_predictions(self, model_inputs):
debug.info(2, "SRAM Data:\n{}".format(sram_data)) """
debug.info(2, "Port Data:\n{}".format(port_data)) Generate a model and prediction for LIB output
"""
return (sram_data, port_data)
scaled_inputs = np.asarray([scale_input_datapoint(model_inputs, data_paths[0])])
def get_predictions(self, model_inputs):
""" predictions = []
Generate a model and prediction for LIB output for path in data_paths:
""" features, labels = get_scaled_data(path)
model = self.generate_model(features, labels)
scaled_inputs = np.asarray([scale_input_datapoint(model_inputs, data_paths[0])]) scaled_pred = self.model_prediction(model, scaled_inputs)
pred = unscale_data(scaled_pred.tolist(), path)
predictions = [] debug.info(1,"Unscaled Prediction = {}".format(pred))
for path in data_paths: predictions.append(pred)
features, labels = get_scaled_data(path) return predictions
model = self.generate_model(features, labels)
scaled_pred = self.model_prediction(model, scaled_inputs) def generate_model(self, features, labels):
pred = unscale_data(scaled_pred.tolist(), path) """
debug.info(1,"Unscaled Prediction = {}".format(pred)) Supervised training of model.
predictions.append(pred) """
return predictions
model = LinearRegression()
def generate_model(self, features, labels): model.fit(features, labels)
""" return model
Supervised training of model.
""" def model_prediction(self, model, features):
"""
model = LinearRegression() Have the model perform a prediction and unscale the prediction
model.fit(features, labels) as the model is trained with scaled values.
return model """
def model_prediction(self, model, features): pred = model.predict(features)
""" return pred
Have the model perform a prediction and unscale the prediction
as the model is trained with scaled values.
"""
pred = model.predict(features)
return pred

View File

@ -1,9 +1,9 @@
num_words,word_size,words_per_row,area,max_delay num_words,word_size,words_per_row,area,max_delay
16,2,1,88873,2.272 16,2,1,88873,2.272
64,2,4,108116,2.721 64,2,4,108116,2.721
16,1,1,86004,2.267 16,1,1,86004,2.267
32,3,2,101618,2.634 32,3,2,101618,2.634
32,2,2,95878,2.594 32,2,2,95878,2.594
16,3,1,93009,2.292 16,3,1,93009,2.292
64,1,4,95878,2.705 64,1,4,95878,2.705
32,1,2,90139,2.552 32,1,2,90139,2.552

1 num_words word_size words_per_row area max_delay
2 16 2 1 88873 2.272
3 64 2 4 108116 2.721
4 16 1 1 86004 2.267
5 32 3 2 101618 2.634
6 32 2 2 95878 2.594
7 16 3 1 93009 2.292
8 64 1 4 95878 2.705
9 32 1 2 90139 2.552

View File

@ -1,9 +1,9 @@
num_words,word_size,words_per_row,area,leakage_power num_words,word_size,words_per_row,area,leakage_power
16,2,1,88873,0.0009381791 16,2,1,88873,0.0009381791
64,2,4,108116,0.0011511999999999998 64,2,4,108116,0.0011511999999999998
16,1,1,86004,0.0005252088 16,1,1,86004,0.0005252088
32,3,2,101618,0.0012168 32,3,2,101618,0.0012168
32,2,2,95878,0.000771978 32,2,2,95878,0.000771978
16,3,1,93009,0.0009978024 16,3,1,93009,0.0009978024
64,1,4,95878,0.0006975546000000001 64,1,4,95878,0.0006975546000000001
32,1,2,90139,0.0006437493 32,1,2,90139,0.0006437493

1 num_words word_size words_per_row area leakage_power
2 16 2 1 88873 0.0009381791
3 64 2 4 108116 0.0011511999999999998
4 16 1 1 86004 0.0005252088
5 32 3 2 101618 0.0012168
6 32 2 2 95878 0.000771978
7 16 3 1 93009 0.0009978024
8 64 1 4 95878 0.0006975546000000001
9 32 1 2 90139 0.0006437493

View File

@ -1,9 +1,9 @@
num_words,word_size,words_per_row,area,read_power num_words,word_size,words_per_row,area,read_power
16,2,1,88873,8.0252 16,2,1,88873,8.0252
64,2,4,108116,9.8616 64,2,4,108116,9.8616
16,1,1,86004,7.4911 16,1,1,86004,7.4911
32,3,2,101618,9.0957 32,3,2,101618,9.0957
32,2,2,95878,8.7143 32,2,2,95878,8.7143
16,3,1,93009,8.5708 16,3,1,93009,8.5708
64,1,4,95878,8.5750 64,1,4,95878,8.5750
32,1,2,90139,7.9725 32,1,2,90139,7.9725

1 num_words word_size words_per_row area read_power
2 16 2 1 88873 8.0252
3 64 2 4 108116 9.8616
4 16 1 1 86004 7.4911
5 32 3 2 101618 9.0957
6 32 2 2 95878 8.7143
7 16 3 1 93009 8.5708
8 64 1 4 95878 8.5750
9 32 1 2 90139 7.9725

View File

@ -1,9 +1,9 @@
num_words,word_size,words_per_row,area,output_slew num_words,word_size,words_per_row,area,output_slew
16,2,1,88873,1.81 16,2,1,88873,1.81
64,2,4,108116,1.69 64,2,4,108116,1.69
16,1,1,86004,1.786 16,1,1,86004,1.786
32,3,2,101618,1.725 32,3,2,101618,1.725
32,2,2,95878,1.71 32,2,2,95878,1.71
16,3,1,93009,1.835 16,3,1,93009,1.835
64,1,4,95878,1.662 64,1,4,95878,1.662
32,1,2,90139,1.69 32,1,2,90139,1.69

1 num_words word_size words_per_row area output_slew
2 16 2 1 88873 1.81
3 64 2 4 108116 1.69
4 16 1 1 86004 1.786
5 32 3 2 101618 1.725
6 32 2 2 95878 1.71
7 16 3 1 93009 1.835
8 64 1 4 95878 1.662
9 32 1 2 90139 1.69