tilelink2: optimize support testing circuits
This commit is contained in:
		@@ -136,6 +136,7 @@ case class TLManagerParameters(
 | 
			
		||||
 | 
			
		||||
case class TLManagerPortParameters(managers: Seq[TLManagerParameters], beatBytes: Int)
 | 
			
		||||
{
 | 
			
		||||
  require (!managers.isEmpty)
 | 
			
		||||
  require (isPow2(beatBytes))
 | 
			
		||||
 | 
			
		||||
  // Require disjoint ranges for Ids and addresses
 | 
			
		||||
@@ -182,8 +183,10 @@ case class TLManagerPortParameters(managers: Seq[TLManagerParameters], beatBytes
 | 
			
		||||
  def containsById(id: UInt) = findById(id).reduce(_ || _)
 | 
			
		||||
  
 | 
			
		||||
  private def safety_helper(member: TLManagerParameters => TransferSizes)(address: UInt, lgSize: UInt) = {
 | 
			
		||||
    (find(address) zip managers.map(member(_).containsLg(lgSize)))
 | 
			
		||||
    .map { case (m, s) => m && s } reduce (_ || _)
 | 
			
		||||
    val allSame = managers.map(member(_) == member(managers(0))).reduce(_ && _)
 | 
			
		||||
    if (allSame) member(managers(0)).containsLg(lgSize) else {
 | 
			
		||||
      Mux1H(find(address), managers.map(member(_).containsLg(lgSize)))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Check for support of a given operation at a specific address
 | 
			
		||||
@@ -194,8 +197,9 @@ case class TLManagerPortParameters(managers: Seq[TLManagerParameters], beatBytes
 | 
			
		||||
  val supportsPutFull    = safety_helper(_.supportsPutFull)    _
 | 
			
		||||
  val supportsPutPartial = safety_helper(_.supportsPutPartial) _
 | 
			
		||||
  def supportsHint(address: UInt) = {
 | 
			
		||||
    (find(address) zip managers.map(_.supportsHint))
 | 
			
		||||
    .map { case (m, b) => m && Bool(b) } reduce (_ || _)
 | 
			
		||||
    if (allSupportHint) Bool(true) else {
 | 
			
		||||
      Mux1H(find(address), managers.map(m => Bool(m.supportsHint)))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -220,6 +224,8 @@ case class TLClientParameters(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case class TLClientPortParameters(clients: Seq[TLClientParameters]) {
 | 
			
		||||
  require (!clients.isEmpty)
 | 
			
		||||
 | 
			
		||||
  // Require disjoint ranges for Ids
 | 
			
		||||
  clients.combinations(2).foreach({ case Seq(x,y) =>
 | 
			
		||||
    require (!x.sourceId.overlaps(y.sourceId))
 | 
			
		||||
@@ -255,8 +261,10 @@ case class TLClientPortParameters(clients: Seq[TLClientParameters]) {
 | 
			
		||||
  def contains(id: UInt) = find(id).reduce(_ || _)
 | 
			
		||||
  
 | 
			
		||||
  private def safety_helper(member: TLClientParameters => TransferSizes)(id: UInt, lgSize: UInt) = {
 | 
			
		||||
    (find(id) zip clients.map(member(_).containsLg(lgSize)))
 | 
			
		||||
    .map { case (m, s) => m && s } reduce (_ || _)
 | 
			
		||||
    val allSame = clients.map(member(_) == member(clients(0))).reduce(_ && _)
 | 
			
		||||
    if (allSame) member(clients(0)).containsLg(lgSize) else {
 | 
			
		||||
      Mux1H(find(id), clients.map(member(_).containsLg(lgSize)))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Check for support of a given operation at a specific id
 | 
			
		||||
@@ -267,8 +275,9 @@ case class TLClientPortParameters(clients: Seq[TLClientParameters]) {
 | 
			
		||||
  val supportsPutFull    = safety_helper(_.supportsPutFull)    _
 | 
			
		||||
  val supportsPutPartial = safety_helper(_.supportsPutPartial) _
 | 
			
		||||
  def supportsHint(id: UInt) = {
 | 
			
		||||
    (find(id) zip clients.map(_.supportsHint))
 | 
			
		||||
    .map { case (m, b) => m && Bool(b) } reduce (_ || _)
 | 
			
		||||
    if (allSupportHint) Bool(true) else {
 | 
			
		||||
      Mux1H(find(id), clients.map(c => Bool(c.supportsHint)))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user