mirror of https://github.com/VLSIDA/OpenRAM.git
Changed most noops calls to have default input of all 0's. Changed parse_values to return dict even if some values fail.
This commit is contained in:
parent
73388e9797
commit
53fa6108e1
|
|
@ -379,16 +379,22 @@ class delay():
|
||||||
return (feasible_delay_lh, feasible_delay_hl)
|
return (feasible_delay_lh, feasible_delay_hl)
|
||||||
|
|
||||||
def parse_values(self, values_names, mult = 1.0):
|
def parse_values(self, values_names, mult = 1.0):
|
||||||
"""Parses values in the timing output file. Optional multiplier."""
|
"""Parse multiple values in the timing output file. Optional multiplier."""
|
||||||
values = []
|
values = []
|
||||||
|
all_values_floats = True
|
||||||
for vname in values_names:
|
for vname in values_names:
|
||||||
value = parse_spice_list("timing", vname.lower()) #ngspice converts all character to lower(), not tested on other sims
|
#ngspice converts all measure characters to lowercase, not tested on other sims
|
||||||
#Return an empty dict if any value is not a float
|
value = parse_spice_list("timing", vname.lower())
|
||||||
if type(value)!=float: #This check overrides the float check in check valid delays. I need to have a similar check here instead.
|
#Check if any of the values fail to parse
|
||||||
return {}
|
if type(value)!=float:
|
||||||
|
all_values_floats = False
|
||||||
values.append(value)
|
values.append(value)
|
||||||
#Convert to nano before returning
|
|
||||||
return {values_names[i]:values[i]*mult for i in range(len(values))}
|
#Apply Multiplier only if all values are floats. Let other check functions handle this error.
|
||||||
|
if all_values_floats:
|
||||||
|
return {values_names[i]:values[i]*mult for i in range(len(values))}
|
||||||
|
else:
|
||||||
|
{values_names[i]:values[i] for i in range(len(values))}
|
||||||
|
|
||||||
def run_delay_simulation(self):
|
def run_delay_simulation(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -409,14 +415,20 @@ class delay():
|
||||||
delay_names = ["delay_hl_{0}".format(port), "delay_lh_{0}".format(port),
|
delay_names = ["delay_hl_{0}".format(port), "delay_lh_{0}".format(port),
|
||||||
"slew_hl_{0}".format(port), "slew_lh_{0}".format(port)]
|
"slew_hl_{0}".format(port), "slew_lh_{0}".format(port)]
|
||||||
delays = self.parse_values(delay_names, 1e9) # scale delays to ns
|
delays = self.parse_values(delay_names, 1e9) # scale delays to ns
|
||||||
if len(delays) > 0 and not self.check_valid_delays((delays[delay_names[0]],delays[delay_names[1]],delays[delay_names[2]],delays[delay_names[3]])):
|
if not self.check_valid_delays((delays[delay_names[0]],delays[delay_names[1]],delays[delay_names[2]],delays[delay_names[3]])):
|
||||||
return (False,{})
|
return (False,{})
|
||||||
result.update(delays)
|
result.update(delays)
|
||||||
|
|
||||||
power_names = ["read0_power_{0}".format(port), "write0_power_{0}".format(port),
|
power_names = ["read0_power_{0}".format(port), "write0_power_{0}".format(port),
|
||||||
"read1_power_{0}".format(port), "write1_power_{0}".format(port)]
|
"read1_power_{0}".format(port), "write1_power_{0}".format(port)]
|
||||||
powers = self.parse_values(power_names, 1e3) # scale power to mw
|
powers = self.parse_values(power_names, 1e3) # scale power to mw
|
||||||
debug.check(len(powers) > 0,"Found valid delays but measured powers invalid.")
|
#Check that power parsing worked.
|
||||||
|
for key, value in powers.items():
|
||||||
|
if type(value)!=float:
|
||||||
|
read_power_str = "{3}={0} {4}={1}".format(powers[power_names[0]], powers[power_names[2]], power_names[0], power_names[2])
|
||||||
|
write_power_str = "{3}={0} {4}={1}".format(powers[power_names[1]], powers[power_names[3]], power_names[1], power_names[3])
|
||||||
|
debug.error("Failed to Parse Power Values:\n\t\t{0}\n\t\t{1}".format(read_power_str,
|
||||||
|
write_power_str),1)
|
||||||
result.update(powers)
|
result.update(powers)
|
||||||
|
|
||||||
# for read_port in self.read_ports:
|
# for read_port in self.read_ports:
|
||||||
|
|
@ -702,7 +714,7 @@ class delay():
|
||||||
debug.error("Non-binary address string",1)
|
debug.error("Non-binary address string",1)
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
def add_noop(self, address, data, port):
|
def add_noop_one_port(self, address, data, port):
|
||||||
""" Add the control values for a noop to a single port. """
|
""" Add the control values for a noop to a single port. """
|
||||||
#This is to be used as a helper function for the other add functions. Cycle and comments are omitted.
|
#This is to be used as a helper function for the other add functions. Cycle and comments are omitted.
|
||||||
if port in self.web_values and port in self.csb_values:
|
if port in self.web_values and port in self.csb_values:
|
||||||
|
|
@ -729,7 +741,7 @@ class delay():
|
||||||
self.t_current += self.period
|
self.t_current += self.period
|
||||||
|
|
||||||
for port in self.readwrite_ports+self.read_ports+self.write_ports:
|
for port in self.readwrite_ports+self.read_ports+self.write_ports:
|
||||||
self.add_noop(address, data, port)
|
self.add_noop_one_port(address, data, port)
|
||||||
|
|
||||||
|
|
||||||
def add_read(self, comment, address, data, port):
|
def add_read(self, comment, address, data, port):
|
||||||
|
|
@ -752,10 +764,12 @@ class delay():
|
||||||
|
|
||||||
self.add_address(address, port)
|
self.add_address(address, port)
|
||||||
|
|
||||||
|
#This value is hard coded here. May want to make it a member variable or input to give control over this value
|
||||||
|
noop_data = "0"*self.word_size
|
||||||
#Add noops to all other ports.
|
#Add noops to all other ports.
|
||||||
for unselected_port in self.readwrite_ports+self.read_ports+self.write_ports:
|
for unselected_port in self.readwrite_ports+self.read_ports+self.write_ports:
|
||||||
if unselected_port != port:
|
if unselected_port != port:
|
||||||
self.add_noop(address, data, unselected_port)
|
self.add_noop_one_port(address, noop_data, unselected_port)
|
||||||
|
|
||||||
def add_write(self, comment, address, data, port):
|
def add_write(self, comment, address, data, port):
|
||||||
""" Add the control values for a write cycle. """
|
""" Add the control values for a write cycle. """
|
||||||
|
|
@ -780,7 +794,7 @@ class delay():
|
||||||
#Add noops to all other ports.
|
#Add noops to all other ports.
|
||||||
for readwrite_port in self.readwrite_ports+self.read_ports+self.write_ports:
|
for readwrite_port in self.readwrite_ports+self.read_ports+self.write_ports:
|
||||||
if readwrite_port != port:
|
if readwrite_port != port:
|
||||||
self.add_noop(address, data, readwrite_port)
|
self.add_noop_one_port(address, data, readwrite_port)
|
||||||
|
|
||||||
def gen_test_cycles_one_port(self, read_port, write_port):
|
def gen_test_cycles_one_port(self, read_port, write_port):
|
||||||
"""Intended but not implemented: Returns a list of key time-points [ns] of the waveform (each rising edge)
|
"""Intended but not implemented: Returns a list of key time-points [ns] of the waveform (each rising edge)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue