diff --git a/DRAMSys/traceAnalyzer/scripts/memUtil.py b/DRAMSys/traceAnalyzer/scripts/memUtil.py index 69885ec0..ce928d4d 100755 --- a/DRAMSys/traceAnalyzer/scripts/memUtil.py +++ b/DRAMSys/traceAnalyzer/scripts/memUtil.py @@ -72,6 +72,12 @@ def getNumberOfBankGroups(dbconnection): result = cursor.fetchone() return result[0] +def getPer2BankOffset(dbconnection): + cursor = dbconnection.cursor() + cursor.execute("SELECT Per2BankOffset FROM generalInfo") + result = cursor.fetchone() + return result[0] + def getWindowSize(connection): cursor = connection.cursor() cursor.execute(" SELECT WindowSize FROM GeneralInfo ") diff --git a/DRAMSys/traceAnalyzer/scripts/metrics.py b/DRAMSys/traceAnalyzer/scripts/metrics.py index cda9484c..9e6aa966 100644 --- a/DRAMSys/traceAnalyzer/scripts/metrics.py +++ b/DRAMSys/traceAnalyzer/scripts/metrics.py @@ -39,7 +39,8 @@ def trace_length_in_ns(connection): @metric def average_response_latency_in_ns(connection): cursor = connection.cursor() - cursor.execute("""SELECT AVG(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) + cursor.execute("""SELECT AVG(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP + WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) result = cursor.fetchone() return round(result[0], 1) @@ -47,7 +48,8 @@ def average_response_latency_in_ns(connection): @metric def max_response_latency_in_ns(connection): cursor = connection.cursor() - cursor.execute(""" SELECT max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) + cursor.execute(""" SELECT max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP + WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) result = cursor.fetchone() return result[0] @@ -55,7 +57,8 @@ def max_response_latency_in_ns(connection): @metric def trans_with_max_response_latency(connection): cursor = connection.cursor() - cursor.execute(""" SELECT REQ.TRANSACT, max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) + cursor.execute(""" SELECT REQ.TRANSACT, max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP + WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """) result = cursor.fetchone() return result[0] @@ -383,7 +386,8 @@ def memory_utilisation_percent_including_idle(connection): def refreshMissDecision(connection, calculatedMetrics): cursor = connection.cursor() - cursor.execute("""SELECT phases.ID,PhaseBegin,PhaseEnd,TBank FROM Phases INNER JOIN transactions on transactions.id = phases.transact WHERE PhaseName IN ('REFA')' """) + cursor.execute("""SELECT phases.ID,PhaseBegin,PhaseEnd,TBank FROM Phases INNER JOIN transactions + on transactions.id = phases.transact WHERE PhaseName IN ('REFAB')' """) queryMinREQ = """SELECT id,min(PhaseBegin) FROM (SELECT transactions.id, PhaseBegin FROM transactions inner join ranges on ranges.id = transactions.range inner join phases on phases.transact = transactions.id where tthread != 0 and tbank = :bank and PhaseName = "REQ" and ranges.begin<:begin and ranges.end>:end)""" @@ -482,19 +486,9 @@ def RESP_count(connection): return get_phase_occurrences(connection, 'RESP') -@metric -def PREB_count(connection): - return get_phase_occurrences(connection, 'PREB') - - -@metric -def PRE_count(connection): - return get_phase_occurrences(connection, 'PRE') - - -@metric -def ACTB_count(connection): - return get_phase_occurrences(connection, 'ACTB') +#@metric +#def ACTB_count(connection): +# return get_phase_occurrences(connection, 'ACTB') @metric @@ -502,19 +496,64 @@ def ACT_count(connection): return get_phase_occurrences(connection, 'ACT') -@metric -def PREA_count(connection): - return get_phase_occurrences(connection, 'PREA') +#@metric +#def PREB_count(connection): +# return get_phase_occurrences(connection, 'PREB') @metric -def REFA_count(connection): - return get_phase_occurrences(connection, 'REFA') +def PREPB_count(connection): + return get_phase_occurrences(connection, 'PREPB') + get_phase_occurrences(connection, 'PRE') @metric -def REFB_count(connection): - return get_phase_occurrences(connection, 'REFB') +def PRESB_count(connection): + return get_phase_occurrences(connection, 'PRESB') + + +@metric +def PREAB_count(connection): + return get_phase_occurrences(connection, 'PREAB') + get_phase_occurrences(connection, 'PREA') + + +@metric +def REFPB_count(connection): + return get_phase_occurrences(connection, 'REFPB') + get_phase_occurrences(connection, 'REFB') + + +@metric +def REFP2B_count(connection): + return get_phase_occurrences(connection, 'REFP2B') + + +@metric +def REFSB_count(connection): + return get_phase_occurrences(connection, 'REFSB') + + +@metric +def REFAB_count(connection): + return get_phase_occurrences(connection, 'REFAB') + get_phase_occurrences(connection, 'REFA') + + +@metric +def RFMPB_count(connection): + return get_phase_occurrences(connection, 'RFMPB') + + +@metric +def RFMP2B_count(connection): + return get_phase_occurrences(connection, 'RFMP2B') + + +@metric +def RFMSB_count(connection): + return get_phase_occurrences(connection, 'RFMSB') + + +@metric +def RFMAB_count(connection): + return get_phase_occurrences(connection, 'RFMAB') @metric @@ -591,17 +630,18 @@ def bank_overlap_ratio(connection): cursor.execute(""" select p1.PhaseBegin, p1.PhaseName from Phases p1 where - (p1.PhaseName = "ACT" or p1.PhaseName = "PREA" or p1.PhaseName = "PRE" or p1.PhaseName = "RDA" or p1.PhaseName = "WRA" or p1.PhaseName = "PREB" or p1.PhaseName = "ACTB") + (p1.PhaseName = "ACT" or p1.PhaseName = "PREPB" or p1.PhaseName = "PRE" or p1.PhaseName = "PRESB" + or p1.PhaseName = "PREAB" or p1.PhaseName = "PREA" or p1.PhaseName = "RDA" or p1.PhaseName = "WRA") order by PhaseBegin """) - prevPhase = "PREA" + prevPhase = "PREAB" prevTime = 0 for c in cursor: trace.append([(int(c[0]/clk)), c[1]]) # Insert a pseudo precharge all to mark the end of the trace - trace.append([traceEnd, "PREA"]) + trace.append([traceEnd, "PREAB"]) bankCounter = 0 bankTime = [] @@ -626,13 +666,13 @@ def bank_overlap_ratio(connection): print("Unexpected ACT. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange)) elif t[1] == "ACTB": actbCnt += 1 - elif(t[1] == "PREA"): + elif(t[1] == "PREAB" or t[1] == "PREA"): bankCounter = 0 - elif(t[1] == "PRE"): + elif(t[1] == "PREPB" or t[1] == "PRE"): if (bankCounter > 0): bankCounter -= 1 else: - print("Unexpected PRE. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange)) + print("Unexpected PREPB. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange)) elif(t[1] == "PREB"): # RGR first PREB closes the row ACT follows, then PREB again. if actbCnt > 0: diff --git a/DRAMSys/traceAnalyzer/scripts/tests.py b/DRAMSys/traceAnalyzer/scripts/tests.py index c23be21f..4f51e98c 100755 --- a/DRAMSys/traceAnalyzer/scripts/tests.py +++ b/DRAMSys/traceAnalyzer/scripts/tests.py @@ -236,9 +236,9 @@ def commandbus_slots_are_used_once(connection): cursor = connection.cursor() if (dramconfig.bankwiseLogic == "1"): - excludedPhases = "('REQ','RESP','PREA')" + excludedPhases = "('REQ','RESP','PREAB')" else: - excludedPhases = "('REQ','RESP','PREA','PDNA','PDNP','SREF','REFA')" + excludedPhases = "('REQ','RESP','PREAB','PDNA','PDNP','SREF','REFAB')" query = """SELECT PhaseBegin,count FROM (SELECT phaseBegin,count(phasebegin) AS count FROM Phases WHERE PhaseName NOT IN """ + excludedPhases + """ AND phasebegin>0 GROUP BY phaseBegin) WHERE count>1""" @@ -260,34 +260,34 @@ def phase_transitions_are_valid(connection): # validTransitions tells you which phases are allowed to follow the last transaction. if (dramconfig.bankwiseLogic == "1"): - validTransitions['PRE'] = set(['ACT', 'REFB', 'SREFB']) - validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PRE', 'PREA']) + validTransitions['PREPB'] = set(['ACT', 'REFPB', 'SREFB']) + validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREPB', 'PREAB']) - validTransitions['RD'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) - validTransitions['WR'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) - validTransitions['RDA'] = set(['ACT', 'REFB', 'PDNPB']) - validTransitions['WRA'] = set(['ACT', 'REFB', 'PDNPB']) + validTransitions['RD'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) + validTransitions['WR'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB']) + validTransitions['RDA'] = set(['ACT', 'REFPB', 'PDNPB']) + validTransitions['WRA'] = set(['ACT', 'REFPB', 'PDNPB']) - validTransitions['REFB'] = set(['ACT', 'REFB', 'PDNPB', 'SREFB']) + validTransitions['REFPB'] = set(['ACT', 'REFPB', 'PDNPB', 'SREFB']) - validTransitions['PDNAB'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'REFB']) - validTransitions['PDNPB'] = set(['ACT', 'REFB', 'SREFB']) - validTransitions['SREFB'] = set(['ACT', 'REFB']) + validTransitions['PDNAB'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'REFPB']) + validTransitions['PDNPB'] = set(['ACT', 'REFPB', 'SREFB']) + validTransitions['SREFB'] = set(['ACT', 'REFPB']) else: - validTransitions['PRE'] = set(['ACT', 'PREA', 'REFA']) - validTransitions['PREA'] = set(['REFA', 'SREF']) - validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREA']) + validTransitions['PREPB'] = set(['ACT', 'PREAB', 'REFAB']) + validTransitions['PREAB'] = set(['REFAB', 'SREF']) + validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREAB']) - validTransitions['RD'] = set(['PRE', 'PREA', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) - validTransitions['WR'] = set(['PRE', 'PREA', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) - validTransitions['RDA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP']) - validTransitions['WRA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP']) + validTransitions['RD'] = set(['PREPB', 'PREAB', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) + validTransitions['WR'] = set(['PREPB', 'PREAB', 'RD', 'RDA', 'WR', 'WRA', 'PDNA']) + validTransitions['RDA'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP']) + validTransitions['WRA'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP']) - validTransitions['REFA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF']) + validTransitions['REFAB'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP', 'SREF']) - validTransitions['PDNA'] = set(['PRE', 'PREA', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFA', 'PDNA', 'PDNP']) - validTransitions['PDNP'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF']) - validTransitions['SREF'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP']) + validTransitions['PDNA'] = set(['PREPB', 'PREAB', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFAB', 'PDNA', 'PDNP']) + validTransitions['PDNP'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP', 'SREF']) + validTransitions['SREF'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP']) if (dramconfig.bankwiseLogic == "1"): query = """SELECT @@ -297,13 +297,13 @@ def phase_transitions_are_valid(connection): WHERE (TBank=:bank) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" else: - # REFA, PREA, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation: + # REFAB, PREAB, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation: query = """SELECT PhaseName, phases.ID FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE - ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) + ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" for bankNumber in range(dramconfig.numberOfBanks): @@ -324,14 +324,14 @@ def timing_constraint(FirstPhase, SecondPhase): FirstPhaseName = FirstPhase[0] SecondPhaseName = SecondPhase[0] - if ((FirstPhaseName == "PRE" or FirstPhaseName == "PREA") and SecondPhaseName != "PREA"): + if ((FirstPhaseName == "PREPB" or FirstPhaseName == "PREAB") and SecondPhaseName != "PREAB"): return dramconfig.tRP elif (FirstPhaseName == "ACT"): return dramconfig.tRCD elif (FirstPhaseName == "RD"): - if (SecondPhaseName in ["PRE, PREA"]): + if (SecondPhaseName in ["PREPB, PREAB"]): return dramconfig.tRTP elif (SecondPhaseName in ["RD, RDA"]): return max(dramconfig.tCCD_L, dramconfig.getReadAccessTime()) @@ -341,7 +341,7 @@ def timing_constraint(FirstPhase, SecondPhase): return dramconfig.tRL + dramconfig.getReadAccessTime() + dramconfig.clk elif (FirstPhaseName == "WR"): - if (SecondPhaseName in ["PRE, PREA", "PDNA"]): + if (SecondPhaseName in ["PREPB, PREAB", "PDNA"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR elif (SecondPhaseName in ["RD, RDA"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWTR_L @@ -349,22 +349,22 @@ def timing_constraint(FirstPhase, SecondPhase): return max(dramconfig.tCCD_L, burstlength/dramconfig.dataRate) elif (FirstPhaseName == "RDA"): - if (SecondPhaseName in ["ACT", "REFA"]): + if (SecondPhaseName in ["ACT", "REFAB"]): return dramconfig.tRTP + dramconfig.tRP - elif (SecondPhaseName == "PREA"): + elif (SecondPhaseName == "PREAB"): return dramconfig.tRTP elif (SecondPhaseName in ["PDNA", "PDNP"]): return dramconfig.tRL + dramconfig.getReadAccessTime() + dramconfig.clk elif (FirstPhaseName == "WRA"): - if (SecondPhaseName in ["ACT", "REFA"]): + if (SecondPhaseName in ["ACT", "REFAB"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.tRP - elif (SecondPhaseName == "PREA"): + elif (SecondPhaseName == "PREAB"): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR elif (SecondPhaseName in ["PDNA", "PDNP"]): return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.clk - elif (FirstPhaseName == "REFA"): + elif (FirstPhaseName == "REFAB"): return dramconfig.tRFC elif (FirstPhaseName in ["PDNA", "PDNP"]): @@ -392,7 +392,7 @@ def timing_constraits_on_the_same_bank_hold(connection): AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" else: query = """SELECT PhaseName, phases.ID, PhaseBegin, PhaseEnd FROM phases INNER JOIN transactions ON phases.transact=transactions.ID - WHERE ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" + WHERE ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" for bankNumber in range(dramconfig.numberOfBanks): cursor.execute(query, {"bank": bankNumber}) lastRow = cursor.fetchone() @@ -418,27 +418,27 @@ def row_buffer_is_used_correctly(connection): FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE - ((TBank=:bank) OR (PhaseNAME = "REFA" AND TBank=0) OR (PhaseNAME = "PREA" AND TBank=0)) + ((TBank=:bank) OR (PhaseNAME = "REFAB" AND TBank=0) OR (PhaseNAME = "PREAB" AND TBank=0)) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" else: - # REFA, PREA, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command: - # PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA') + # REFAB, PREAB, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command: + # PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB') query = """SELECT PhaseName, phases.ID FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE - ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) + ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin""" # phases that precharge the bank and close the rowbuffer - prechargingPhases = set(['PRE', 'PREA', 'RDA', 'WRA']) + prechargingPhases = set(['PREPB', 'PREAB', 'RDA', 'WRA']) # phases that require the bank to be in active state and the rowbuffer to be opened - accessingPhases = set(['RD', 'RDA', 'WR', 'WRA', 'PRE']) + accessingPhases = set(['RD', 'RDA', 'WR', 'WRA', 'PREPB']) # phases that require the bank to be in precharged state and the robuffer to be closed - idlePhases = set(['ACT', 'PDNP', 'REFA', 'SREF']) + idlePhases = set(['ACT', 'PDNP', 'REFAB', 'SREF']) for bankNumber in range(dramconfig.numberOfBanks): cursor.execute(query, {"bank": bankNumber}) @@ -466,11 +466,11 @@ def no_commands_during_refresh(connection): """Checks that no command was scheduled during refresh period""" cursor = connection.cursor() if (dramconfig.bankwiseLogic == "1"): - query = """SELECT PhaseBegin, PhaseEnd, TBank FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE PhaseName = 'REFB' """ - test_query = """SELECT PhaseName FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFB') and TBank = ?""" + query = """SELECT PhaseBegin, PhaseEnd, TBank FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE PhaseName = 'REFPB' """ + test_query = """SELECT PhaseName FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFPB') and TBank = ?""" else: - query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' """ - test_query = """SELECT PhaseName FROM phases WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFA')""" + query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' """ + test_query = """SELECT PhaseName FROM phases WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFAB')""" cursor.execute(query) result = cursor.fetchall() @@ -488,9 +488,9 @@ def no_commands_during_refresh(connection): @test def max_number_ref_burst(connection): - """Checks that the maximum number of REFA commands in a burst is not exceeded""" + """Checks that the maximum number of REFAB commands in a burst is not exceeded""" cursor = connection.cursor() - query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' """ + query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' """ prevrow = [0] * 2 cnt = 0 flexibleRef = getFlexibleRef(connection) @@ -509,7 +509,7 @@ def max_number_ref_burst(connection): cnt = 0 # Reset the counter every time a burst ends prevrow = row if(cnt > maxRefBurst): - return TestFailed("Maximum number of REFA in a burst was exceeded at {0} with {1} REFA in sequence. Maximum allowed is {2}.".format(formatTime(row[0]), cnt, maxRefBurst)) + return TestFailed("Maximum number of REFAB in a burst was exceeded at {0} with {1} REFAB in sequence. Maximum allowed is {2}.".format(formatTime(row[0]), cnt, maxRefBurst)) return TestSuceeded() @@ -517,9 +517,9 @@ def max_number_ref_burst(connection): @test @test def max_time_without_ref(connection): - """Checks that the maximum time allowed between REFA/SREF commands is not exceeded""" + """Checks that the maximum time allowed between REFAB/SREF commands is not exceeded""" cursor = connection.cursor() - query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' OR PhaseName = 'SREF' """ + query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' OR PhaseName = 'SREF' """ prevrow = [0] * 2 flexibleRef = getFlexibleRef(connection) maxRefBurst = getMaxRefBurst(connection) diff --git a/DRAMSys/traceAnalyzer/scripts/vcdExport.py b/DRAMSys/traceAnalyzer/scripts/vcdExport.py index 2401f66a..a46e0419 100755 --- a/DRAMSys/traceAnalyzer/scripts/vcdExport.py +++ b/DRAMSys/traceAnalyzer/scripts/vcdExport.py @@ -89,8 +89,9 @@ class Transaction(): class Granularity(enum.Enum): Bankwise = 0 - Groupwise = 1 - Rankwise = 2 + TwoBankwise = 1 + Groupwise = 2 + Rankwise = 3 class TimeWindow(): def __init__(self, windowSize, lastTimestamp): @@ -113,30 +114,38 @@ class TimeWindow(): def numberOfIterations(self): return int(self.lastTimestamp / self.windowSize) + def getGranularity(phase): if phase == "PRESB" or phase == "REFSB" or phase == "RFMSB": return Granularity.Groupwise - elif phase == "PREA" or phase == "REFA" or phase=="RFMAB" or phase == "PDNA" or phase == "PDNP" or phase == "SREF": + elif phase == "REFP2B" or phase == "RFMP2B": + return Granularity.TwoBankwise + elif phase == "PREAB" or phase == "PREA" or phase == "REFAB" or phase == "REFA" or phase == "RFMAB" \ + or phase == "PDNA" or phase == "PDNP" or phase == "SREF": return Granularity.Rankwise else: return Granularity.Bankwise + def getAmountOfCommandBusSpans(phase): if phase == "PDNA" or phase == "PDNAB" or phase == "PDNP" or phase == "PDNPB" or phase == "SREF" or phase == "SREFB": return 2 else: return 1 + def getUnitOfTime(connection): _, unit = getClock(connection) return unit.lower() + def getLastTimestamp(connection): cursor = connection.cursor() cursor.execute("SELECT DataStrobeEnd FROM Transactions ORDER BY DataStrobeEnd DESC LIMIT 1") return cursor.fetchone()[0] + def getRanksBankgroupsBanks(connection): ranks = getNumberOfRanks(connection) bankgroups = int(getNumberOfBankGroups(connection) / ranks) @@ -144,9 +153,11 @@ def getRanksBankgroupsBanks(connection): return (ranks, bankgroups, banks) + def getBankName(rank, bankgroup, bank): return "RA" + str(rank) + "_BG" + str(bankgroup) + "_BA" + str(bank) + def getBankNames(ranks, bankgroups, banks): names = [] for rank in range(ranks): @@ -156,6 +167,7 @@ def getBankNames(ranks, bankgroups, banks): return names + def getOccurringSignals(connection): setOfSignals = set() @@ -172,6 +184,7 @@ def getOccurringSignals(connection): return setOfSignals + def getDataBusEvents(connection, eventDict, windowRange): beginWindow, endWindow = windowRange @@ -190,6 +203,7 @@ def getDataBusEvents(connection, eventDict, windowRange): eventDict[begin].append(Event("Data_Bus", command + " " + str(transactionId))) eventDict[end].append(Event("Data_Bus", "")) + def getCommandBusEvents(connection, eventDict, transactionDict, windowRange): beginWindow, endWindow = windowRange @@ -236,11 +250,15 @@ def getCommandBusEvents(connection, eventDict, transactionDict, windowRange): for _bankgroup in range(bankgroups): for _bank in range(banks): currentBanks.append((rank, _bankgroup, _bank)) - elif getGranularity(phase) == Granularity.Groupwise: for _bankgroup in range(bankgroups): currentBanks.append((rank, _bankgroup, bank)) - + elif getGranularity(phase) == Granularity.TwoBankwise: + currentBanks.append((rank, bankgroup, bank)) + per2BankOffset = getPer2BankOffset(connection) + bankgroupOffset = per2BankOffset // banks + bankOffset = per2BankOffset % banks + currentBanks.append((rank, bankgroup + bankgroupOffset, bank + bankOffset)) else: currentBanks.append((rank, bankgroup, bank)) @@ -250,6 +268,7 @@ def getCommandBusEvents(connection, eventDict, transactionDict, windowRange): eventDict[begin].append(Event(currentBankName, phase + " " + str(transactionId))) eventDict[end].append(Event(currentBankName, "")) + def getTransactionRange(connection, transactionRange, windowRange): beginWindow, endWindow = windowRange @@ -270,6 +289,7 @@ def getTransactionRange(connection, transactionRange, windowRange): transactionRange.append(minTransaction) transactionRange.append(maxTransaction) + def getReqAndRespPhases(connection, eventDict, transactionDict, windowRange): beginWindow, endWindow = windowRange @@ -294,6 +314,7 @@ def getReqAndRespPhases(connection, eventDict, transactionDict, windowRange): eventDict[begin].append(Event(phase, command + " " + str(transactionId))) eventDict[end].append(Event(phase, "")) + def getTransactions(connection, transactionDict, transactionRange): minTransaction, maxTransaction = transactionRange @@ -353,6 +374,7 @@ def dumpVcd(pathToTrace): f.seek(0) return f.read() + if __name__ == "__main__": if len(sys.argv) == 2: dump = dumpVcd(sys.argv[1])