Update Python scripts to new commands.
This commit is contained in:
@@ -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 ")
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user