Update Python scripts to new commands.

This commit is contained in:
Lukas Steiner
2021-12-07 15:10:56 +01:00
parent 73cba6b1f6
commit 4e1407eb51
4 changed files with 153 additions and 85 deletions

View File

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

View File

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

View File

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

View File

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