use thunk for dir info
This commit is contained in:
parent
f7b1e23ead
commit
faed47d131
@ -39,7 +39,7 @@ object MasterMetadata {
|
|||||||
}
|
}
|
||||||
class MasterMetadata(implicit c: CoherencePolicy) extends CoherenceMetadata {
|
class MasterMetadata(implicit c: CoherencePolicy) extends CoherenceMetadata {
|
||||||
val state = UInt(width = c.masterStateWidth)
|
val state = UInt(width = c.masterStateWidth)
|
||||||
val sharers = c.dir.clone
|
val sharers = c.dir()
|
||||||
override def clone = new MasterMetadata()(c).asInstanceOf[this.type]
|
override def clone = new MasterMetadata()(c).asInstanceOf[this.type]
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -75,10 +75,12 @@ class FullRepresentation(nClients: Int) extends DirectoryRepresentation {
|
|||||||
def flush(dummy: Int = 0) = { sharers := UInt(0, width = nClients); this }
|
def flush(dummy: Int = 0) = { sharers := UInt(0, width = nClients); this }
|
||||||
def none(dummy: Int = 0) = sharers === UInt(0)
|
def none(dummy: Int = 0) = sharers === UInt(0)
|
||||||
def one(dummy: Int = 0) = PopCount(sharers) === UInt(1)
|
def one(dummy: Int = 0) = PopCount(sharers) === UInt(1)
|
||||||
|
def count(dummy: Int = 0) = PopCount(sharers)
|
||||||
|
def next(dummy: Int = 0) = PriorityEncoder(sharers)
|
||||||
override def clone = new FullRepresentation(nClients).asInstanceOf[this.type]
|
override def clone = new FullRepresentation(nClients).asInstanceOf[this.type]
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class CoherencePolicy(val dir: DirectoryRepresentation) {
|
abstract class CoherencePolicy(val dir: () => DirectoryRepresentation) {
|
||||||
def nClientStates: Int
|
def nClientStates: Int
|
||||||
def nMasterStates: Int
|
def nMasterStates: Int
|
||||||
def nAcquireTypes: Int
|
def nAcquireTypes: Int
|
||||||
@ -144,10 +146,10 @@ trait UncachedTransactions {
|
|||||||
def isUncachedReadTransaction(acq: Acquire): Bool
|
def isUncachedReadTransaction(acq: Acquire): Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class CoherencePolicyWithUncached(dir: DirectoryRepresentation) extends CoherencePolicy(dir)
|
abstract class CoherencePolicyWithUncached(dir: () => DirectoryRepresentation) extends CoherencePolicy(dir)
|
||||||
with UncachedTransactions
|
with UncachedTransactions
|
||||||
|
|
||||||
class MICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
class MICoherence(dir: () => DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
||||||
def nClientStates = 2
|
def nClientStates = 2
|
||||||
def nMasterStates = 2
|
def nMasterStates = 2
|
||||||
def nAcquireTypes = 6
|
def nAcquireTypes = 6
|
||||||
@ -299,7 +301,7 @@ class MICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUncac
|
|||||||
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
||||||
}
|
}
|
||||||
|
|
||||||
class MEICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
class MEICoherence(dir: () => DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
||||||
def nClientStates = 3
|
def nClientStates = 3
|
||||||
def nMasterStates = 2
|
def nMasterStates = 2
|
||||||
def nAcquireTypes = 7
|
def nAcquireTypes = 7
|
||||||
@ -470,7 +472,7 @@ class MEICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUnca
|
|||||||
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
||||||
}
|
}
|
||||||
|
|
||||||
class MSICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
class MSICoherence(dir: () => DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
||||||
def nClientStates = 3
|
def nClientStates = 3
|
||||||
def nMasterStates = 3
|
def nMasterStates = 3
|
||||||
def nAcquireTypes = 7
|
def nAcquireTypes = 7
|
||||||
@ -643,7 +645,7 @@ class MSICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUnca
|
|||||||
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
||||||
}
|
}
|
||||||
|
|
||||||
class MESICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
class MESICoherence(dir: () => DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
||||||
def nClientStates = 4
|
def nClientStates = 4
|
||||||
def nMasterStates = 3
|
def nMasterStates = 3
|
||||||
def nAcquireTypes = 7
|
def nAcquireTypes = 7
|
||||||
@ -822,7 +824,7 @@ class MESICoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUnc
|
|||||||
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
def pendingVoluntaryReleaseIsSufficient(r_type: UInt, p_type: UInt): Bool = (r_type === releaseVoluntaryInvalidateData)
|
||||||
}
|
}
|
||||||
|
|
||||||
class MigratoryCoherence(dir: DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
class MigratoryCoherence(dir: () => DirectoryRepresentation) extends CoherencePolicyWithUncached(dir) {
|
||||||
def nClientStates = 7
|
def nClientStates = 7
|
||||||
def nMasterStates = 3
|
def nMasterStates = 3
|
||||||
def nAcquireTypes = 8
|
def nAcquireTypes = 8
|
||||||
|
Loading…
Reference in New Issue
Block a user