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:
Hunter Nichols 2018-08-30 15:11:54 -07:00
parent 73388e9797
commit 53fa6108e1
1 changed files with 28 additions and 14 deletions

View File

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