unittest: add an API for describing LazyModule unit tests
This commit is contained in:
parent
cc789e9063
commit
fdeed7bbb3
@ -36,7 +36,8 @@ abstract class LazyModule()(implicit val p: Parameters)
|
||||
getClass.getMethods.filter { m =>
|
||||
m.getParameterTypes.isEmpty &&
|
||||
!java.lang.reflect.Modifier.isStatic(m.getModifiers) &&
|
||||
m.getName != "children"
|
||||
m.getName != "children" &&
|
||||
m.getName != "getChildren"
|
||||
}.flatMap { m =>
|
||||
if (classOf[LazyModule].isAssignableFrom(m.getReturnType)) {
|
||||
val obj = m.invoke(this)
|
||||
@ -126,6 +127,8 @@ abstract class LazyModule()(implicit val p: Parameters)
|
||||
iterfunc(this)
|
||||
children.foreach( _.nodeIterator(iterfunc) )
|
||||
}
|
||||
|
||||
def getChildren = children
|
||||
}
|
||||
|
||||
object LazyModule
|
||||
|
35
src/main/scala/unittest/TestGenerator.scala
Normal file
35
src/main/scala/unittest/TestGenerator.scala
Normal file
@ -0,0 +1,35 @@
|
||||
// See LICENSE.SiFive for license details.
|
||||
|
||||
package freechips.rocketchip.unittest
|
||||
|
||||
import Chisel._
|
||||
import freechips.rocketchip.config._
|
||||
import freechips.rocketchip.diplomacy._
|
||||
|
||||
abstract class LazyUnitTest(implicit p: Parameters) extends LazyModule
|
||||
{ self =>
|
||||
protected def finished: Bool
|
||||
|
||||
lazy val module = new LazyModuleImp(this) {
|
||||
val finished = IO(Bool(OUTPUT))
|
||||
finished := self.finished
|
||||
}
|
||||
}
|
||||
|
||||
// FYI, you can call .finished on a Seq[LazyUnitTest]
|
||||
class TestGenerator(gen: LazyModule => Seq[LazyUnitTest])
|
||||
{
|
||||
def apply(lm: LazyModule) = gen(lm)
|
||||
def ++ (other: TestGenerator) = new TestGenerator(gen = lm => gen(lm) ++ other(lm))
|
||||
}
|
||||
|
||||
object TestGenerator
|
||||
{
|
||||
def apply(matcher: PartialFunction[LazyModule, Seq[LazyUnitTest]]): TestGenerator =
|
||||
new TestGenerator(gen = matcher.lift(_).getOrElse(Nil))
|
||||
def recurse(other: TestGenerator): TestGenerator = {
|
||||
def helper(lm: LazyModule, tail: Seq[LazyUnitTest]): Seq[LazyUnitTest] =
|
||||
lm.getChildren.foldLeft(other(lm) ++ tail) { case (tail, child) => helper(child, tail) }
|
||||
new TestGenerator(gen = helper(_, Nil))
|
||||
}
|
||||
}
|
12
src/main/scala/unittest/package.scala
Normal file
12
src/main/scala/unittest/package.scala
Normal file
@ -0,0 +1,12 @@
|
||||
// See LICENSE.SiFive for license details.
|
||||
|
||||
package freechips.rocketchip
|
||||
|
||||
import Chisel._
|
||||
|
||||
package object unittest
|
||||
{
|
||||
implicit class LazyUnitTestSeq(val seq: Seq[LazyUnitTest]) {
|
||||
def finished = seq.map(_.module.finished).foldLeft(Bool(true))(_ && _)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user