mirror of https://github.com/VLSIDA/OpenRAM.git
Update delay tests to output useful information for debug.
This commit is contained in:
parent
a00e160274
commit
5088487cf7
|
|
@ -49,7 +49,7 @@ class timing_sram_test(openram_test):
|
||||||
loads = [tech.spice["msflop_in_cap"]*4]
|
loads = [tech.spice["msflop_in_cap"]*4]
|
||||||
slews = [tech.spice["rise_time"]*2]
|
slews = [tech.spice["rise_time"]*2]
|
||||||
data = d.analyze(probe_address, probe_data, slews, loads)
|
data = d.analyze(probe_address, probe_data, slews, loads)
|
||||||
#print data
|
|
||||||
if OPTS.tech_name == "freepdk45":
|
if OPTS.tech_name == "freepdk45":
|
||||||
golden_data = {'leakage_power': 0.0006964536000000001,
|
golden_data = {'leakage_power': 0.0006964536000000001,
|
||||||
'delay_lh': [0.0573055],
|
'delay_lh': [0.0573055],
|
||||||
|
|
@ -76,14 +76,20 @@ class timing_sram_test(openram_test):
|
||||||
self.assertTrue(False) # other techs fail
|
self.assertTrue(False) # other techs fail
|
||||||
# Check if no too many or too few results
|
# Check if no too many or too few results
|
||||||
self.assertTrue(len(data.keys())==len(golden_data.keys()))
|
self.assertTrue(len(data.keys())==len(golden_data.keys()))
|
||||||
|
|
||||||
# Check each result
|
# Check each result
|
||||||
|
data_matches = True
|
||||||
for k in data.keys():
|
for k in data.keys():
|
||||||
if type(data[k])==list:
|
if type(data[k])==list:
|
||||||
for i in range(len(data[k])):
|
for i in range(len(data[k])):
|
||||||
self.isclose(data[k][i],golden_data[k][i],0.15)
|
if not self.isclose(k,data[k][i],golden_data[k][i],0.15):
|
||||||
|
data_matches = False
|
||||||
else:
|
else:
|
||||||
self.isclose(data[k],golden_data[k],0.15)
|
self.isclose(k,data[k],golden_data[k],0.15)
|
||||||
|
if not data_matches:
|
||||||
|
debug.info(0,str(data))
|
||||||
|
self.assertTrue(data_matches)
|
||||||
|
|
||||||
globals.end_openram()
|
globals.end_openram()
|
||||||
|
|
||||||
# instantiate a copdsay of the class to actually run the test
|
# instantiate a copdsay of the class to actually run the test
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ class timing_sram_test(openram_test):
|
||||||
loads = [tech.spice["msflop_in_cap"]*4]
|
loads = [tech.spice["msflop_in_cap"]*4]
|
||||||
slews = [tech.spice["rise_time"]*2]
|
slews = [tech.spice["rise_time"]*2]
|
||||||
data = d.analyze(probe_address, probe_data, slews, loads)
|
data = d.analyze(probe_address, probe_data, slews, loads)
|
||||||
#print data
|
|
||||||
if OPTS.tech_name == "freepdk45":
|
if OPTS.tech_name == "freepdk45":
|
||||||
golden_data = {'leakage_power': 0.0007348262,
|
golden_data = {'leakage_power': 0.0007348262,
|
||||||
'delay_lh': [0.05799613],
|
'delay_lh': [0.05799613],
|
||||||
|
|
@ -75,13 +75,19 @@ class timing_sram_test(openram_test):
|
||||||
|
|
||||||
# Check if no too many or too few results
|
# Check if no too many or too few results
|
||||||
self.assertTrue(len(data.keys())==len(golden_data.keys()))
|
self.assertTrue(len(data.keys())==len(golden_data.keys()))
|
||||||
|
|
||||||
# Check each result
|
# Check each result
|
||||||
|
data_matches = True
|
||||||
for k in data.keys():
|
for k in data.keys():
|
||||||
if type(data[k])==list:
|
if type(data[k])==list:
|
||||||
for i in range(len(data[k])):
|
for i in range(len(data[k])):
|
||||||
self.isclose(data[k][i],golden_data[k][i],0.15)
|
if not self.isclose(k,data[k][i],golden_data[k][i],0.15):
|
||||||
|
data_matches = False
|
||||||
else:
|
else:
|
||||||
self.isclose(data[k],golden_data[k],0.15)
|
self.isclose(k,data[k],golden_data[k],0.15)
|
||||||
|
if not data_matches:
|
||||||
|
debug.info(0,str(data))
|
||||||
|
self.assertTrue(data_matches)
|
||||||
|
|
||||||
globals.end_openram()
|
globals.end_openram()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,21 +62,23 @@ class openram_test(unittest.TestCase):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def isclose(self, value1,value2,error_tolerance=1e-2):
|
def isclose(self,key,value,actual_value,error_tolerance=1e-2):
|
||||||
""" This is used to compare relative values. """
|
""" This is used to compare relative values. """
|
||||||
import debug
|
import debug
|
||||||
relative_diff = abs(value1 - value2) / max(value1,value2)
|
relative_diff = abs(value - actual_value) / max(value,actual_value)
|
||||||
check = relative_diff <= error_tolerance
|
check = relative_diff <= error_tolerance
|
||||||
if not check:
|
if not check:
|
||||||
self.fail("NOT CLOSE {0} {1} relative diff={2}".format(value1,value2,relative_diff))
|
debug.warning("NOT CLOSE\t{0: <10}\t{1:.3f}\t{2:.3f}\tdiff={3:.1f}%".format(key,value,actual_value,relative_diff*100))
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
debug.info(2,"CLOSE {0} {1} relative diff={2}".format(value1,value2,relative_diff))
|
debug.info(2,"CLOSE\t{0: <10}\t{1:.3f}\t{2:.3f}\tdiff={3:.1f}%".format(key,value,actual_value,relative_diff*100))
|
||||||
|
|
||||||
def relative_compare(self, value1,value2,error_tolerance):
|
|
||||||
""" This is used to compare relative values. """
|
|
||||||
if (value1==value2): # if we don't need a relative comparison!
|
|
||||||
return True
|
return True
|
||||||
return (abs(value1 - value2) / max(value1,value2) <= error_tolerance)
|
|
||||||
|
def relative_compare(self, value,actual_value,error_tolerance):
|
||||||
|
""" This is used to compare relative values. """
|
||||||
|
if (value==actual_value): # if we don't need a relative comparison!
|
||||||
|
return True
|
||||||
|
return (abs(value - actual_value) / max(value,actual_value) <= error_tolerance)
|
||||||
|
|
||||||
def isapproxdiff(self, f1, f2, error_tolerance=0.001):
|
def isapproxdiff(self, f1, f2, error_tolerance=0.001):
|
||||||
"""Compare two files.
|
"""Compare two files.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue