mirror of https://github.com/VLSIDA/OpenRAM.git
Flip MSB and LSB in lib file due to bug report
This commit is contained in:
parent
cce1305da3
commit
9694237dba
|
|
@ -31,7 +31,7 @@ class lib:
|
||||||
self.gnd_name = spice["ground"]
|
self.gnd_name = spice["ground"]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
self.gnd_name = "gnd"
|
self.gnd_name = "gnd"
|
||||||
|
|
||||||
self.out_dir = out_dir
|
self.out_dir = out_dir
|
||||||
self.sram = sram
|
self.sram = sram
|
||||||
self.sp_file = sp_file
|
self.sp_file = sp_file
|
||||||
|
|
@ -60,7 +60,7 @@ class lib:
|
||||||
self.load_scales = np.array(OPTS.load_scales)
|
self.load_scales = np.array(OPTS.load_scales)
|
||||||
self.load = tech.spice["dff_in_cap"]
|
self.load = tech.spice["dff_in_cap"]
|
||||||
self.loads = self.load_scales * self.load
|
self.loads = self.load_scales * self.load
|
||||||
|
|
||||||
|
|
||||||
self.slew_scales = np.array(OPTS.slew_scales)
|
self.slew_scales = np.array(OPTS.slew_scales)
|
||||||
self.slew = tech.spice["rise_time"]
|
self.slew = tech.spice["rise_time"]
|
||||||
|
|
@ -79,7 +79,7 @@ class lib:
|
||||||
self.slews.append(slew)
|
self.slews.append(slew)
|
||||||
self.loads = np.array(self.loads)
|
self.loads = np.array(self.loads)
|
||||||
self.slews = np.array(self.slews)
|
self.slews = np.array(self.slews)
|
||||||
debug.info(1, "Slews: {0}".format(self.slews))
|
debug.info(1, "Slews: {0}".format(self.slews))
|
||||||
debug.info(1, "Loads: {0}".format(self.loads))
|
debug.info(1, "Loads: {0}".format(self.loads))
|
||||||
debug.info(1, "self.load_slews : {0}".format(self.load_slews))
|
debug.info(1, "self.load_slews : {0}".format(self.load_slews))
|
||||||
def create_corners(self):
|
def create_corners(self):
|
||||||
|
|
@ -102,7 +102,7 @@ class lib:
|
||||||
|
|
||||||
self.corners = []
|
self.corners = []
|
||||||
self.lib_files = []
|
self.lib_files = []
|
||||||
|
|
||||||
if OPTS.use_specified_corners == None:
|
if OPTS.use_specified_corners == None:
|
||||||
# Nominal corner
|
# Nominal corner
|
||||||
corner_tuples = set()
|
corner_tuples = set()
|
||||||
|
|
@ -114,7 +114,7 @@ class lib:
|
||||||
for v in self.supply_voltages:
|
for v in self.supply_voltages:
|
||||||
for t in self.temperatures:
|
for t in self.temperatures:
|
||||||
corner_tuples.add((p, v, t))
|
corner_tuples.add((p, v, t))
|
||||||
else:
|
else:
|
||||||
nom_corner = (nom_process, nom_supply, nom_temperature)
|
nom_corner = (nom_process, nom_supply, nom_temperature)
|
||||||
corner_tuples.add(nom_corner)
|
corner_tuples.add(nom_corner)
|
||||||
if not OPTS.nominal_corner_only:
|
if not OPTS.nominal_corner_only:
|
||||||
|
|
@ -132,7 +132,7 @@ class lib:
|
||||||
corner_tuples.remove(nom_corner)
|
corner_tuples.remove(nom_corner)
|
||||||
else:
|
else:
|
||||||
corner_tuples = OPTS.use_specified_corners
|
corner_tuples = OPTS.use_specified_corners
|
||||||
|
|
||||||
for corner_tuple in corner_tuples:
|
for corner_tuple in corner_tuples:
|
||||||
self.add_corner(*corner_tuple)
|
self.add_corner(*corner_tuple)
|
||||||
|
|
||||||
|
|
@ -366,16 +366,16 @@ class lib:
|
||||||
self.lib.write(" base_type : array;\n")
|
self.lib.write(" base_type : array;\n")
|
||||||
self.lib.write(" data_type : bit;\n")
|
self.lib.write(" data_type : bit;\n")
|
||||||
self.lib.write(" bit_width : {0};\n".format(self.sram.word_size))
|
self.lib.write(" bit_width : {0};\n".format(self.sram.word_size))
|
||||||
self.lib.write(" bit_from : 0;\n")
|
self.lib.write(" bit_from : {0};\n".format(self.sram.word_size - 1))
|
||||||
self.lib.write(" bit_to : {0};\n".format(self.sram.word_size - 1))
|
self.lib.write(" bit_to : 0;\n")
|
||||||
self.lib.write(" }\n\n")
|
self.lib.write(" }\n\n")
|
||||||
|
|
||||||
self.lib.write(" type (addr){\n")
|
self.lib.write(" type (addr){\n")
|
||||||
self.lib.write(" base_type : array;\n")
|
self.lib.write(" base_type : array;\n")
|
||||||
self.lib.write(" data_type : bit;\n")
|
self.lib.write(" data_type : bit;\n")
|
||||||
self.lib.write(" bit_width : {0};\n".format(self.sram.addr_size))
|
self.lib.write(" bit_width : {0};\n".format(self.sram.addr_size))
|
||||||
self.lib.write(" bit_from : 0;\n")
|
self.lib.write(" bit_from : {0};\n".format(self.sram.addr_size - 1))
|
||||||
self.lib.write(" bit_to : {0};\n".format(self.sram.addr_size - 1))
|
self.lib.write(" bit_to : 0;\n")
|
||||||
self.lib.write(" }\n\n")
|
self.lib.write(" }\n\n")
|
||||||
|
|
||||||
if self.sram.write_size:
|
if self.sram.write_size:
|
||||||
|
|
@ -383,8 +383,8 @@ class lib:
|
||||||
self.lib.write(" base_type : array;\n")
|
self.lib.write(" base_type : array;\n")
|
||||||
self.lib.write(" data_type : bit;\n")
|
self.lib.write(" data_type : bit;\n")
|
||||||
self.lib.write(" bit_width : {0};\n".format(self.sram.num_wmasks))
|
self.lib.write(" bit_width : {0};\n".format(self.sram.num_wmasks))
|
||||||
self.lib.write(" bit_from : 0;\n")
|
self.lib.write(" bit_from : {0};\n".format(self.sram.num_wmasks - 1))
|
||||||
self.lib.write(" bit_to : {0};\n".format(self.sram.num_wmasks - 1))
|
self.lib.write(" bit_to : 0;\n")
|
||||||
self.lib.write(" }\n\n")
|
self.lib.write(" }\n\n")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -650,21 +650,21 @@ class lib:
|
||||||
probe_address = "0" + "1" * (self.sram.addr_size - 1)
|
probe_address = "0" + "1" * (self.sram.addr_size - 1)
|
||||||
probe_data = self.sram.word_size - 1
|
probe_data = self.sram.word_size - 1
|
||||||
char_results = self.d.analyze(probe_address, probe_data, self.load_slews)
|
char_results = self.d.analyze(probe_address, probe_data, self.load_slews)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
self.char_sram_results, self.char_port_results = char_results
|
self.char_sram_results, self.char_port_results = char_results
|
||||||
if 'sim_time' in self.char_sram_results:
|
if 'sim_time' in self.char_sram_results:
|
||||||
self.pred_time = self.char_sram_results['sim_time']
|
self.pred_time = self.char_sram_results['sim_time']
|
||||||
# Add to the OPTS to be written out as part of the extended OPTS file
|
# Add to the OPTS to be written out as part of the extended OPTS file
|
||||||
# FIXME: Temporarily removed from characterization output
|
# FIXME: Temporarily removed from characterization output
|
||||||
# if not self.use_model:
|
# if not self.use_model:
|
||||||
# OPTS.sen_path_delays = self.char_sram_results["sen_path_measures"]
|
# OPTS.sen_path_delays = self.char_sram_results["sen_path_measures"]
|
||||||
# OPTS.sen_path_names = self.char_sram_results["sen_path_names"]
|
# OPTS.sen_path_names = self.char_sram_results["sen_path_names"]
|
||||||
# OPTS.bl_path_delays = self.char_sram_results["bl_path_measures"]
|
# OPTS.bl_path_delays = self.char_sram_results["bl_path_measures"]
|
||||||
# OPTS.bl_path_names = self.char_sram_results["bl_path_names"]
|
# OPTS.bl_path_names = self.char_sram_results["bl_path_names"]
|
||||||
|
|
||||||
|
|
||||||
def compute_setup_hold(self):
|
def compute_setup_hold(self):
|
||||||
""" Do the analysis if we haven't characterized a FF yet """
|
""" Do the analysis if we haven't characterized a FF yet """
|
||||||
# Do the analysis if we haven't characterized a FF yet
|
# Do the analysis if we haven't characterized a FF yet
|
||||||
|
|
@ -687,23 +687,23 @@ class lib:
|
||||||
datasheet = open(datasheet_path +'/datasheet.info', 'w')
|
datasheet = open(datasheet_path +'/datasheet.info', 'w')
|
||||||
else:
|
else:
|
||||||
datasheet = open(datasheet_path +'/datasheet.info', 'a+')
|
datasheet = open(datasheet_path +'/datasheet.info', 'a+')
|
||||||
|
|
||||||
self.write_inp_params_datasheet(datasheet, corner, lib_name)
|
self.write_inp_params_datasheet(datasheet, corner, lib_name)
|
||||||
self.write_signal_from_ports(datasheet,
|
self.write_signal_from_ports(datasheet,
|
||||||
"din{1}[{0}:0]".format(self.sram.word_size - 1, '{}'),
|
"din{1}[{0}:0]".format(self.sram.word_size - 1, '{}'),
|
||||||
self.write_ports,
|
self.write_ports,
|
||||||
"setup_times_LH",
|
"setup_times_LH",
|
||||||
"setup_times_HL",
|
"setup_times_HL",
|
||||||
"hold_times_LH",
|
"hold_times_LH",
|
||||||
"hold_times_HL")
|
"hold_times_HL")
|
||||||
|
|
||||||
# self.write_signal_from_ports(datasheet,
|
# self.write_signal_from_ports(datasheet,
|
||||||
# "dout{1}[{0}:0]".format(self.sram.word_size - 1, '{}'),
|
# "dout{1}[{0}:0]".format(self.sram.word_size - 1, '{}'),
|
||||||
# self.read_ports,
|
# self.read_ports,
|
||||||
# "delay_lh",
|
# "delay_lh",
|
||||||
# "delay_hl",
|
# "delay_hl",
|
||||||
# "slew_lh",
|
# "slew_lh",
|
||||||
# "slew_hl")
|
# "slew_hl")
|
||||||
for port in self.all_ports:
|
for port in self.all_ports:
|
||||||
#dout timing
|
#dout timing
|
||||||
if port in self.read_ports:
|
if port in self.read_ports:
|
||||||
|
|
@ -720,41 +720,41 @@ class lib:
|
||||||
|
|
||||||
min(list(map(round_time,self.char_port_results[port]["slew_hl"]))),
|
min(list(map(round_time,self.char_port_results[port]["slew_hl"]))),
|
||||||
max(list(map(round_time,self.char_port_results[port]["slew_hl"])))
|
max(list(map(round_time,self.char_port_results[port]["slew_hl"])))
|
||||||
))
|
))
|
||||||
|
|
||||||
self.write_signal_from_ports(datasheet,
|
self.write_signal_from_ports(datasheet,
|
||||||
"csb{}",
|
"csb{}",
|
||||||
self.all_ports,
|
self.all_ports,
|
||||||
"setup_times_LH",
|
"setup_times_LH",
|
||||||
"setup_times_HL",
|
"setup_times_HL",
|
||||||
"hold_times_LH",
|
"hold_times_LH",
|
||||||
"hold_times_HL")
|
"hold_times_HL")
|
||||||
|
|
||||||
self.write_signal_from_ports(datasheet,
|
|
||||||
"addr{1}[{0}:0]".format(self.sram.addr_size - 1, '{}'),
|
|
||||||
self.all_ports,
|
|
||||||
"setup_times_LH",
|
|
||||||
"setup_times_HL",
|
|
||||||
"hold_times_LH",
|
|
||||||
"hold_times_HL")
|
|
||||||
|
|
||||||
self.write_signal_from_ports(datasheet,
|
self.write_signal_from_ports(datasheet,
|
||||||
"web{}",
|
"addr{1}[{0}:0]".format(self.sram.addr_size - 1, '{}'),
|
||||||
self.readwrite_ports,
|
self.all_ports,
|
||||||
"setup_times_LH",
|
"setup_times_LH",
|
||||||
"setup_times_HL",
|
"setup_times_HL",
|
||||||
"hold_times_LH",
|
"hold_times_LH",
|
||||||
"hold_times_HL")
|
"hold_times_HL")
|
||||||
|
|
||||||
|
self.write_signal_from_ports(datasheet,
|
||||||
|
"web{}",
|
||||||
|
self.readwrite_ports,
|
||||||
|
"setup_times_LH",
|
||||||
|
"setup_times_HL",
|
||||||
|
"hold_times_LH",
|
||||||
|
"hold_times_HL")
|
||||||
|
|
||||||
self.write_power_datasheet(datasheet)
|
self.write_power_datasheet(datasheet)
|
||||||
|
|
||||||
self.write_model_params(datasheet, time)
|
self.write_model_params(datasheet, time)
|
||||||
|
|
||||||
datasheet.write("END\n")
|
datasheet.write("END\n")
|
||||||
datasheet.close()
|
datasheet.close()
|
||||||
|
|
||||||
def write_inp_params_datasheet(self, datasheet, corner, lib_name):
|
def write_inp_params_datasheet(self, datasheet, corner, lib_name):
|
||||||
|
|
||||||
if OPTS.is_unit_test:
|
if OPTS.is_unit_test:
|
||||||
git_id = 'FFFFFFFFFFFFFFFFFFFF'
|
git_id = 'FFFFFFFFFFFFFFFFFFFF'
|
||||||
|
|
||||||
|
|
@ -774,7 +774,7 @@ class lib:
|
||||||
debug.warning("Failed to retrieve git id")
|
debug.warning("Failed to retrieve git id")
|
||||||
git_id = 'Failed to retrieve'
|
git_id = 'Failed to retrieve'
|
||||||
current_time = datetime.date.today()
|
current_time = datetime.date.today()
|
||||||
|
|
||||||
# write static information to be parser later
|
# write static information to be parser later
|
||||||
datasheet.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},".format(
|
datasheet.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},".format(
|
||||||
OPTS.output_name,
|
OPTS.output_name,
|
||||||
|
|
@ -802,8 +802,8 @@ class lib:
|
||||||
|
|
||||||
# write area
|
# write area
|
||||||
datasheet.write(str(self.sram.width * self.sram.height) + ',')
|
datasheet.write(str(self.sram.width * self.sram.height) + ',')
|
||||||
|
|
||||||
def write_signal_from_ports(self, datasheet, signal, ports, time_pos_1, time_pos_2, time_pos_3, time_pos_4):
|
def write_signal_from_ports(self, datasheet, signal, ports, time_pos_1, time_pos_2, time_pos_3, time_pos_4):
|
||||||
for port in ports:
|
for port in ports:
|
||||||
datasheet.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},".format(
|
datasheet.write("{0},{1},{2},{3},{4},{5},{6},{7},{8},".format(
|
||||||
signal.format(port),
|
signal.format(port),
|
||||||
|
|
@ -820,8 +820,8 @@ class lib:
|
||||||
max(list(map(round_time,self.times[time_pos_4])))
|
max(list(map(round_time,self.times[time_pos_4])))
|
||||||
|
|
||||||
))
|
))
|
||||||
|
|
||||||
def write_power_datasheet(self, datasheet):
|
def write_power_datasheet(self, datasheet):
|
||||||
# write power information
|
# write power information
|
||||||
for port in self.all_ports:
|
for port in self.all_ports:
|
||||||
name = ''
|
name = ''
|
||||||
|
|
@ -860,34 +860,30 @@ class lib:
|
||||||
control_str += ' & csb{0}'.format(i)
|
control_str += ' & csb{0}'.format(i)
|
||||||
|
|
||||||
datasheet.write("{0},{1},{2},".format('leak', control_str, self.char_sram_results["leakage_power"]))
|
datasheet.write("{0},{1},{2},".format('leak', control_str, self.char_sram_results["leakage_power"]))
|
||||||
|
|
||||||
def write_model_params(self, datasheet, time):
|
def write_model_params(self, datasheet, time):
|
||||||
"""Write values which will be used in the analytical model as inputs"""
|
"""Write values which will be used in the analytical model as inputs"""
|
||||||
datasheet.write("{0},{1},".format('sim_time', time))
|
datasheet.write("{0},{1},".format('sim_time', time))
|
||||||
datasheet.write("{0},{1},".format('words_per_row', OPTS.words_per_row))
|
datasheet.write("{0},{1},".format('words_per_row', OPTS.words_per_row))
|
||||||
datasheet.write("{0},{1},".format('slews', list(self.slews)))
|
datasheet.write("{0},{1},".format('slews', list(self.slews)))
|
||||||
datasheet.write("{0},{1},".format('loads', list(self.loads)))
|
datasheet.write("{0},{1},".format('loads', list(self.loads)))
|
||||||
|
|
||||||
for port in self.read_ports:
|
for port in self.read_ports:
|
||||||
datasheet.write("{0},{1},".format('cell_rise_{}'.format(port), self.char_port_results[port]["delay_lh"]))
|
datasheet.write("{0},{1},".format('cell_rise_{}'.format(port), self.char_port_results[port]["delay_lh"]))
|
||||||
datasheet.write("{0},{1},".format('cell_fall_{}'.format(port), self.char_port_results[port]["delay_hl"]))
|
datasheet.write("{0},{1},".format('cell_fall_{}'.format(port), self.char_port_results[port]["delay_hl"]))
|
||||||
datasheet.write("{0},{1},".format('rise_transition_{}'.format(port), self.char_port_results[port]["slew_lh"]))
|
datasheet.write("{0},{1},".format('rise_transition_{}'.format(port), self.char_port_results[port]["slew_lh"]))
|
||||||
datasheet.write("{0},{1},".format('fall_transition_{}'.format(port), self.char_port_results[port]["slew_hl"]))
|
datasheet.write("{0},{1},".format('fall_transition_{}'.format(port), self.char_port_results[port]["slew_hl"]))
|
||||||
|
|
||||||
for port in self.write_ports:
|
for port in self.write_ports:
|
||||||
write1_power = np.mean(self.char_port_results[port]["write1_power"])
|
write1_power = np.mean(self.char_port_results[port]["write1_power"])
|
||||||
write0_power = np.mean(self.char_port_results[port]["write0_power"])
|
write0_power = np.mean(self.char_port_results[port]["write0_power"])
|
||||||
datasheet.write("{0},{1},".format('write_rise_power_{}'.format(port), write1_power))
|
datasheet.write("{0},{1},".format('write_rise_power_{}'.format(port), write1_power))
|
||||||
#FIXME: should be write_fall_power
|
#FIXME: should be write_fall_power
|
||||||
datasheet.write("{0},{1},".format('write_fall_power_{}'.format(port), write0_power))
|
datasheet.write("{0},{1},".format('write_fall_power_{}'.format(port), write0_power))
|
||||||
|
|
||||||
for port in self.read_ports:
|
for port in self.read_ports:
|
||||||
read1_power = np.mean(self.char_port_results[port]["read1_power"])
|
read1_power = np.mean(self.char_port_results[port]["read1_power"])
|
||||||
read0_power = np.mean(self.char_port_results[port]["read0_power"])
|
read0_power = np.mean(self.char_port_results[port]["read0_power"])
|
||||||
datasheet.write("{0},{1},".format('read_rise_power_{}'.format(port), read1_power))
|
datasheet.write("{0},{1},".format('read_rise_power_{}'.format(port), read1_power))
|
||||||
#FIXME: should be read_fall_power
|
#FIXME: should be read_fall_power
|
||||||
datasheet.write("{0},{1},".format('read_fall_power_{}'.format(port), read0_power))
|
datasheet.write("{0},{1},".format('read_fall_power_{}'.format(port), read0_power))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue