|
|
|
|
@@ -233,9 +233,9 @@ def commandbus_slots_are_used_once(connection):
|
|
|
|
|
cursor = connection.cursor()
|
|
|
|
|
|
|
|
|
|
if (dramconfig.bankwiseLogic == "1"):
|
|
|
|
|
excludedPhases = "('REQ','RESP','PRE_ALL')"
|
|
|
|
|
excludedPhases = "('REQ','RESP','PREA')"
|
|
|
|
|
else:
|
|
|
|
|
excludedPhases = "('REQ','RESP','PRE_ALL','PDNA','PDNP','SREF','REFA')"
|
|
|
|
|
excludedPhases = "('REQ','RESP','PREA','PDNA','PDNP','SREF','REFA')"
|
|
|
|
|
|
|
|
|
|
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"""
|
|
|
|
|
@@ -258,7 +258,7 @@ def phase_transitions_are_valid(connection):
|
|
|
|
|
|
|
|
|
|
if (dramconfig.bankwiseLogic == "1"):
|
|
|
|
|
validTransitions['PRE'] = set(['ACT', 'REFB', 'SREFB'])
|
|
|
|
|
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PRE', 'PRE_ALL'])
|
|
|
|
|
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PRE', 'PREA'])
|
|
|
|
|
|
|
|
|
|
validTransitions['RD'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB'])
|
|
|
|
|
validTransitions['WR'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB'])
|
|
|
|
|
@@ -271,20 +271,20 @@ def phase_transitions_are_valid(connection):
|
|
|
|
|
validTransitions['PDNPB'] = set(['ACT', 'REFB', 'SREFB'])
|
|
|
|
|
validTransitions['SREFB'] = set(['ACT', 'REFB'])
|
|
|
|
|
else:
|
|
|
|
|
validTransitions['PRE'] = set(['ACT', 'PRE_ALL', 'REFA'])
|
|
|
|
|
validTransitions['PRE_ALL'] = set(['REFA', 'SREF'])
|
|
|
|
|
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PRE_ALL'])
|
|
|
|
|
validTransitions['PRE'] = set(['ACT', 'PREA', 'REFA'])
|
|
|
|
|
validTransitions['PREA'] = set(['REFA', 'SREF'])
|
|
|
|
|
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREA'])
|
|
|
|
|
|
|
|
|
|
validTransitions['RD'] = set(['PRE', 'PRE_ALL', 'RD', 'RDA', 'WR', 'WRA', 'PDNA'])
|
|
|
|
|
validTransitions['WR'] = set(['PRE', 'PRE_ALL', 'RD', 'RDA', 'WR', 'WRA', 'PDNA'])
|
|
|
|
|
validTransitions['RDA'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP'])
|
|
|
|
|
validTransitions['WRA'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP'])
|
|
|
|
|
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['REFA'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF'])
|
|
|
|
|
validTransitions['REFA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF'])
|
|
|
|
|
|
|
|
|
|
validTransitions['PDNA'] = set(['PRE', 'PRE_ALL', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFA', 'PDNA', 'PDNP'])
|
|
|
|
|
validTransitions['PDNP'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF'])
|
|
|
|
|
validTransitions['SREF'] = set(['PRE_ALL', 'ACT', 'REFA', 'PDNA', 'PDNP'])
|
|
|
|
|
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'])
|
|
|
|
|
|
|
|
|
|
if (dramconfig.bankwiseLogic == "1"):
|
|
|
|
|
query = """SELECT
|
|
|
|
|
@@ -294,13 +294,13 @@ def phase_transitions_are_valid(connection):
|
|
|
|
|
WHERE
|
|
|
|
|
(TBank=:bank) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
|
|
|
|
else:
|
|
|
|
|
# REFA, PRE_ALL, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation:
|
|
|
|
|
# REFA, PREA, 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 ('PRE_ALL', 'SREF', 'PDNP', 'PDNA', 'REFA'))
|
|
|
|
|
((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA'))
|
|
|
|
|
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
|
|
|
|
|
|
|
|
|
for bankNumber in range(dramconfig.numberOfBanks):
|
|
|
|
|
@@ -321,14 +321,14 @@ def timing_constraint(FirstPhase, SecondPhase):
|
|
|
|
|
FirstPhaseName = FirstPhase[0]
|
|
|
|
|
SecondPhaseName = SecondPhase[0]
|
|
|
|
|
|
|
|
|
|
if ((FirstPhaseName == "PRE" or FirstPhaseName == "PRE_ALL") and SecondPhaseName != "PRE_ALL"):
|
|
|
|
|
if ((FirstPhaseName == "PRE" or FirstPhaseName == "PREA") and SecondPhaseName != "PREA"):
|
|
|
|
|
return dramconfig.tRP
|
|
|
|
|
|
|
|
|
|
elif (FirstPhaseName == "ACT"):
|
|
|
|
|
return dramconfig.tRCD
|
|
|
|
|
|
|
|
|
|
elif (FirstPhaseName == "RD"):
|
|
|
|
|
if (SecondPhaseName in ["PRE, PRE_ALL"]):
|
|
|
|
|
if (SecondPhaseName in ["PRE, PREA"]):
|
|
|
|
|
return dramconfig.tRTP
|
|
|
|
|
elif (SecondPhaseName in ["RD, RDA"]):
|
|
|
|
|
return max(dramconfig.tCCD_L, getReadAccessTime())
|
|
|
|
|
@@ -338,7 +338,7 @@ def timing_constraint(FirstPhase, SecondPhase):
|
|
|
|
|
return dramconfig.tRL + getReadAccessTime() + dramconfig.clk
|
|
|
|
|
|
|
|
|
|
elif (FirstPhaseName == "WR"):
|
|
|
|
|
if (SecondPhaseName in ["PRE, PRE_ALL", "PDNA"]):
|
|
|
|
|
if (SecondPhaseName in ["PRE, PREA", "PDNA"]):
|
|
|
|
|
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR
|
|
|
|
|
elif (SecondPhaseName in ["RD, RDA"]):
|
|
|
|
|
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWTR_L
|
|
|
|
|
@@ -346,13 +346,13 @@ def timing_constraint(FirstPhase, SecondPhase):
|
|
|
|
|
return max(dramconfig.tCCD_L, burstlength/dramconfig.dataRate)
|
|
|
|
|
|
|
|
|
|
elif (FirstPhaseName == "RDA"):
|
|
|
|
|
if (SecondPhaseName in ["ACT", "PRE_ALL", "REFA"]):
|
|
|
|
|
if (SecondPhaseName in ["ACT", "PREA", "REFA"]):
|
|
|
|
|
return dramconfig.tRTP + dramconfig.tRP
|
|
|
|
|
elif (SecondPhaseName in ["PDNA", "PDNP"]):
|
|
|
|
|
return dramconfig.tRL + getReadAccessTime() + dramconfig.clk
|
|
|
|
|
|
|
|
|
|
elif (FirstPhaseName == "WRA"):
|
|
|
|
|
if (SecondPhaseName in ["ACT", "PRE_ALL", "REFA"]):
|
|
|
|
|
if (SecondPhaseName in ["ACT", "PREA", "REFA"]):
|
|
|
|
|
return dramconfig.tWL + getWriteAccessTime() + dramconfig.tWR + dramconfig.tRP
|
|
|
|
|
elif (SecondPhaseName in ["PDNA", "PDNP"]):
|
|
|
|
|
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.clk
|
|
|
|
|
@@ -390,7 +390,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 ('PRE_ALL', 'SREF', 'PDNP', 'PDNA', 'REFA')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
|
|
|
|
WHERE ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
|
|
|
|
for bankNumber in range(dramconfig.numberOfBanks):
|
|
|
|
|
cursor.execute(query, {"bank": bankNumber})
|
|
|
|
|
lastRow = cursor.fetchone()
|
|
|
|
|
@@ -416,21 +416,21 @@ 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 = "PRE_ALL" AND TBank=0))
|
|
|
|
|
((TBank=:bank) OR (PhaseNAME = "REFA" AND TBank=0) OR (PhaseNAME = "PREA" AND TBank=0))
|
|
|
|
|
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
|
|
|
|
else:
|
|
|
|
|
# REFA, PRE_ALL, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command:
|
|
|
|
|
# PhaseName IN ('PRE_ALL', 'SREF', 'PDNP', 'PDNA', 'REFA')
|
|
|
|
|
# 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')
|
|
|
|
|
query = """SELECT
|
|
|
|
|
PhaseName, phases.ID
|
|
|
|
|
FROM
|
|
|
|
|
phases INNER JOIN transactions ON phases.transact=transactions.ID
|
|
|
|
|
WHERE
|
|
|
|
|
((TBank=:bank) OR PhaseName IN ('PRE_ALL', 'SREF', 'PDNP', 'PDNA', 'REFA'))
|
|
|
|
|
((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA'))
|
|
|
|
|
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
|
|
|
|
|
|
|
|
|
# phases that precharge the bank and close the rowbuffer
|
|
|
|
|
prechargingPhases = set(['PRE', 'PRE_ALL', 'RDA', 'WRA'])
|
|
|
|
|
prechargingPhases = set(['PRE', 'PREA', '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'])
|
|
|
|
|
|