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.
#
# 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

View File

@ -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

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
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

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
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

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
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

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