From 85595b0f6fa7515810277b103b8dfa9855f4181c Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Thu, 26 Jul 2018 16:05:24 -0700 Subject: [PATCH] Update format of delay test output during an error to directly copy into unit test. Factor function into testutils.py for comparison. --- compiler/tests/21_hspice_delay_test.py | 33 +++++++-------------- compiler/tests/21_hspice_setuphold_test.py | 9 ++---- compiler/tests/21_ngspice_delay_test.py | 13 +------- compiler/tests/21_ngspice_setuphold_test.py | 9 ++---- compiler/tests/testutils.py | 24 ++++++++++++++- 5 files changed, 39 insertions(+), 49 deletions(-) diff --git a/compiler/tests/21_hspice_delay_test.py b/compiler/tests/21_hspice_delay_test.py index 99f20cef..ceac5be9 100755 --- a/compiler/tests/21_hspice_delay_test.py +++ b/compiler/tests/21_hspice_delay_test.py @@ -62,33 +62,22 @@ class timing_sram_test(openram_test): 'delay_hl': [0.070554], 'slew_lh': [0.0190073]} elif OPTS.tech_name == "scn3me_subm": - golden_data = {'leakage_power': 0.0004004581, - 'delay_lh': [0.6538954], - 'read0_power': [9.7622], - 'read1_power': [9.589], - 'write1_power': [10.8], - 'write0_power': [6.928400000000001], - 'slew_hl': [0.8321625], - 'min_period': 2.344, - 'delay_hl': [0.9019090999999999], - 'slew_lh': [0.5896232]} + golden_data = {'delay_hl': [6.473300000000001], + 'delay_lh': [1.0442000000000002], + 'leakage_power': 0.025569099999999997, + 'min_period': 9.375, + 'read0_power': [8.0248], + 'read1_power': [7.5243], + 'slew_hl': [6.266000000000001], + 'slew_lh': [0.7857840999999999], + 'write0_power': [7.7587], + 'write1_power': [8.0425]} else: self.assertTrue(False) # other techs fail # Check if no too many or too few results self.assertTrue(len(data.keys())==len(golden_data.keys())) - # Check each result - data_matches = True - for k in data.keys(): - if type(data[k])==list: - for i in range(len(data[k])): - if not self.isclose(k,data[k][i],golden_data[k][i],0.15): - data_matches = False - else: - self.isclose(k,data[k],golden_data[k],0.15) - if not data_matches: - debug.info(0,str(data)) - self.assertTrue(data_matches) + self.assertTrue(self.check_golden_data(data,golden_data,0.25)) globals.end_openram() diff --git a/compiler/tests/21_hspice_setuphold_test.py b/compiler/tests/21_hspice_setuphold_test.py index f9d8a01c..b123ed57 100755 --- a/compiler/tests/21_hspice_setuphold_test.py +++ b/compiler/tests/21_hspice_setuphold_test.py @@ -49,13 +49,8 @@ class timing_setup_test(openram_test): # Check if no too many or too few results self.assertTrue(len(data.keys())==len(golden_data.keys())) - # Check each result - for k in data.keys(): - if type(data[k])==list: - for i in range(len(data[k])): - self.isclose(data[k][i],golden_data[k][i],0.15) - else: - self.isclose(data[k],golden_data[k],0.15) + + self.assertTrue(self.check_golden_data(data,golden_data,0.25)) globals.end_openram() diff --git a/compiler/tests/21_ngspice_delay_test.py b/compiler/tests/21_ngspice_delay_test.py index cdc0eba5..fa20d893 100755 --- a/compiler/tests/21_ngspice_delay_test.py +++ b/compiler/tests/21_ngspice_delay_test.py @@ -76,18 +76,7 @@ class timing_sram_test(openram_test): # Check if no too many or too few results self.assertTrue(len(data.keys())==len(golden_data.keys())) - # Check each result - data_matches = True - for k in data.keys(): - if type(data[k])==list: - for i in range(len(data[k])): - if not self.isclose(k,data[k][i],golden_data[k][i],0.15): - data_matches = False - else: - self.isclose(k,data[k],golden_data[k],0.15) - if not data_matches: - debug.info(0,str(data)) - self.assertTrue(data_matches) + self.assertTrue(self.check_golden_data(data,golden_data,0.25)) globals.end_openram() diff --git a/compiler/tests/21_ngspice_setuphold_test.py b/compiler/tests/21_ngspice_setuphold_test.py index 24c69aa7..849a23f0 100755 --- a/compiler/tests/21_ngspice_setuphold_test.py +++ b/compiler/tests/21_ngspice_setuphold_test.py @@ -49,14 +49,9 @@ class timing_setup_test(openram_test): # Check if no too many or too few results self.assertTrue(len(data.keys())==len(golden_data.keys())) - # Check each result - for k in data.keys(): - if type(data[k])==list: - for i in range(len(data[k])): - self.isclose(data[k][i],golden_data[k][i],0.15) - else: - self.isclose(data[k],golden_data[k],0.15) + self.assertTrue(self.check_golden_data(data,golden_data,0.25)) + reload(characterizer) globals.end_openram() diff --git a/compiler/tests/testutils.py b/compiler/tests/testutils.py index 52861d7b..2d5de9f7 100644 --- a/compiler/tests/testutils.py +++ b/compiler/tests/testutils.py @@ -59,7 +59,29 @@ class openram_test(unittest.TestCase): # Reset the static duplicate name checker for unit tests. import hierarchy_design hierarchy_design.hierarchy_design.name_map=[] - + + def check_golden_data(self, data, golden_data, error_tolerance=1e-2): + """ + This function goes through two dictionaries, key by key and compares + each item. It uses relative comparisons for the items and returns false + if there is a mismatch. + """ + + # Check each result + data_matches = True + for k in data.keys(): + if type(data[k])==list: + for i in range(len(data[k])): + if not self.isclose(k,data[k][i],golden_data[k][i],error_tolerance): + data_matches = False + else: + self.isclose(k,data[k],golden_data[k],error_tolerance) + if not data_matches: + import pprint + data_string=pprint.pformat(data) + debug.info(0,"Consider replacing data in unit test with:\n"+data_string) + return data_matches + def isclose(self,key,value,actual_value,error_tolerance=1e-2):