xref: /XiangShan/src/main/scala/utils/SeqUtils.scala (revision 39c59369af6e7d78fa72e13aae3735f1a6e98f5c)
12fbf1245SXuan Hupackage utils
22fbf1245SXuan Hu
3*39c59369SXuan Huimport chisel3._
4*39c59369SXuan Huimport chisel3.util._
5*39c59369SXuan Hu
62fbf1245SXuan Huimport scala.collection.mutable
72fbf1245SXuan Hu
82fbf1245SXuan Huobject SeqUtils {
92fbf1245SXuan Hu  /**
102fbf1245SXuan Hu    * @todo remove it when when xiangshan is updated to 2.13.11
112fbf1245SXuan Hu    */
122fbf1245SXuan Hu  def distinctBy[A, B](seqLike: Seq[B])(f: B => A): Seq[B] = {
132fbf1245SXuan Hu    val seen = new mutable.HashSet[A]()
142fbf1245SXuan Hu    var res = Seq[B]()
152fbf1245SXuan Hu    val it = seqLike.iterator
162fbf1245SXuan Hu    while (it.hasNext) {
172fbf1245SXuan Hu      val next = it.next
182fbf1245SXuan Hu      if (seen.add(f(next))) {
192fbf1245SXuan Hu        res :+= next
202fbf1245SXuan Hu      }
212fbf1245SXuan Hu    }
222fbf1245SXuan Hu    res
232fbf1245SXuan Hu  }
24*39c59369SXuan Hu
25*39c59369SXuan Hu  type Seq2[+T] = Seq[Seq[T]]
26*39c59369SXuan Hu  type Seq3[+T] = Seq2[Seq[T]]
27*39c59369SXuan Hu  type MixedVec2[T <: Data] = MixedVec[MixedVec[T]]
28*39c59369SXuan Hu  type MixedVec3[T <: Data] = MixedVec2[MixedVec[T]]
29*39c59369SXuan Hu
30*39c59369SXuan Hu  def mapToMixedVec[T, A <: Data](in: Seq[T], f: T => A): MixedVec[A] = {
31*39c59369SXuan Hu    MixedVec(in.map(f))
32*39c59369SXuan Hu  }
33*39c59369SXuan Hu
34*39c59369SXuan Hu  def mapToMixedVec2[T, A <: Data](in: Seq2[T], f: T => A): MixedVec2[A] = {
35*39c59369SXuan Hu    MixedVec(in.map(x => mapToMixedVec(x, f)))
36*39c59369SXuan Hu  }
37*39c59369SXuan Hu
38*39c59369SXuan Hu  def mapToMixedVec3[T, A <: Data](in: Seq3[T], f: T => A): MixedVec3[A] = {
39*39c59369SXuan Hu    MixedVec(in.map(x => mapToMixedVec2(x, f)))
40*39c59369SXuan Hu  }
412fbf1245SXuan Hu}
42