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,17 +379,23 @@ class delay():
|
|||
return (feasible_delay_lh, feasible_delay_hl)
|
||||
|
||||
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 = []
|
||||
all_values_floats = True
|
||||
for vname in values_names:
|
||||
value = parse_spice_list("timing", vname.lower()) #ngspice converts all character to lower(), not tested on other sims
|
||||
#Return an empty dict if any value is not a float
|
||||
if type(value)!=float: #This check overrides the float check in check valid delays. I need to have a similar check here instead.
|
||||
return {}
|
||||
#ngspice converts all measure characters to lowercase, not tested on other sims
|
||||
value = parse_spice_list("timing", vname.lower())
|
||||
#Check if any of the values fail to parse
|
||||
if type(value)!=float:
|
||||
all_values_floats = False
|
||||
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):
|
||||
"""
|
||||
This tries to simulate a period and checks if the result works. If
|
||||
|
|
@ -409,14 +415,20 @@ class delay():
|
|||
delay_names = ["delay_hl_{0}".format(port), "delay_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
|
||||
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,{})
|
||||
result.update(delays)
|
||||
|
||||
power_names = ["read0_power_{0}".format(port), "write0_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
|
||||
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)
|
||||
|
||||
# for read_port in self.read_ports:
|
||||
|
|
@ -702,7 +714,7 @@ class delay():
|
|||
debug.error("Non-binary address string",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. """
|
||||
#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:
|
||||
|
|
@ -729,7 +741,7 @@ class delay():
|
|||
self.t_current += self.period
|
||||
|
||||
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):
|
||||
|
|
@ -752,10 +764,12 @@ class delay():
|
|||
|
||||
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.
|
||||
for unselected_port in self.readwrite_ports+self.read_ports+self.write_ports:
|
||||
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):
|
||||
""" Add the control values for a write cycle. """
|
||||
|
|
@ -780,7 +794,7 @@ class delay():
|
|||
#Add noops to all other ports.
|
||||
for readwrite_port in self.readwrite_ports+self.read_ports+self.write_ports:
|
||||
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):
|
||||
"""Intended but not implemented: Returns a list of key time-points [ns] of the waveform (each rising edge)
|
||||
|
|
|
|||
Loading…
Reference in New Issue