tilelink2: connect Nodes to LazyModules for better error messages
This commit is contained in:
parent
53987cd9d4
commit
d7df7d3109
@ -3,12 +3,13 @@
|
|||||||
package uncore.tilelink2
|
package uncore.tilelink2
|
||||||
|
|
||||||
import Chisel._
|
import Chisel._
|
||||||
import chisel3.internal.sourceinfo._
|
import chisel3.internal.sourceinfo.{SourceInfo, SourceLine, UnlocatableSourceInfo}
|
||||||
|
|
||||||
abstract class LazyModule
|
abstract class LazyModule
|
||||||
{
|
{
|
||||||
protected[tilelink2] var bindings = List[() => Unit]()
|
protected[tilelink2] var bindings = List[() => Unit]()
|
||||||
protected[tilelink2] var children = List[LazyModule]()
|
protected[tilelink2] var children = List[LazyModule]()
|
||||||
|
protected[tilelink2] var nodes = List[RootNode]()
|
||||||
protected[tilelink2] var info: SourceInfo = UnlocatableSourceInfo
|
protected[tilelink2] var info: SourceInfo = UnlocatableSourceInfo
|
||||||
protected[tilelink2] val parent = LazyModule.stack.headOption
|
protected[tilelink2] val parent = LazyModule.stack.headOption
|
||||||
|
|
||||||
@ -22,6 +23,12 @@ abstract class LazyModule
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def name = getClass.getName.split('.').last
|
||||||
|
def line = info match {
|
||||||
|
case SourceLine(filename, line, col) => s" ($filename:$line:$col)"
|
||||||
|
case _ => ""
|
||||||
|
}
|
||||||
|
|
||||||
def module: LazyModuleImp
|
def module: LazyModuleImp
|
||||||
implicit val lazyModule = this
|
implicit val lazyModule = this
|
||||||
|
|
||||||
@ -55,6 +62,6 @@ abstract class LazyModuleImp(outer: LazyModule) extends Module
|
|||||||
// .module had better not be accessed while LazyModules are still being built!
|
// .module had better not be accessed while LazyModules are still being built!
|
||||||
require (LazyModule.stack.isEmpty)
|
require (LazyModule.stack.isEmpty)
|
||||||
|
|
||||||
override def desiredName = outer.getClass.getName.split('.').last
|
override def desiredName = outer.name
|
||||||
outer.instantiate()
|
outer.instantiate()
|
||||||
}
|
}
|
||||||
|
@ -19,11 +19,20 @@ abstract class NodeImp[PO, PI, EO, EI, B <: Data]
|
|||||||
def connect(bo: B, eo: EO, bi: B, ei: EI)(implicit sourceInfo: SourceInfo): Unit
|
def connect(bo: B, eo: EO, bi: B, ei: EI)(implicit sourceInfo: SourceInfo): Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class RootNode
|
||||||
|
{
|
||||||
|
// You cannot create a Node outside a LazyModule!
|
||||||
|
require (!LazyModule.stack.isEmpty)
|
||||||
|
|
||||||
|
val lazyModule = LazyModule.stack.head
|
||||||
|
lazyModule.nodes = this :: lazyModule.nodes
|
||||||
|
}
|
||||||
|
|
||||||
class BaseNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(
|
class BaseNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(
|
||||||
private val oFn: Option[Seq[PO] => PO],
|
private val oFn: Option[Seq[PO] => PO],
|
||||||
private val iFn: Option[Seq[PI] => PI],
|
private val iFn: Option[Seq[PI] => PI],
|
||||||
private val numPO: Range.Inclusive,
|
private val numPO: Range.Inclusive,
|
||||||
private val numPI: Range.Inclusive)
|
private val numPI: Range.Inclusive) extends RootNode
|
||||||
{
|
{
|
||||||
// At least 0 ports must be supported
|
// At least 0 ports must be supported
|
||||||
require (!numPO.isEmpty)
|
require (!numPO.isEmpty)
|
||||||
@ -42,8 +51,12 @@ class BaseNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])(
|
|||||||
private var oRealized = false
|
private var oRealized = false
|
||||||
private var iRealized = false
|
private var iRealized = false
|
||||||
|
|
||||||
private lazy val oPorts = { oRealized = true; require (numPO.contains(accPO.size)); accPO.result() }
|
def name = lazyModule.name + "." + getClass.getName.split('.').last
|
||||||
private lazy val iPorts = { iRealized = true; require (numPI.contains(accPI.size)); accPI.result() }
|
private def reqO() = require(numPO.contains(accPO.size), s"${name} has ${accPO.size} outputs, expected ${numPO}${lazyModule.line}")
|
||||||
|
private def reqI() = require(numPI.contains(accPI.size), s"${name} has ${accPI.size} inputs, expected ${numPI}${lazyModule.line}")
|
||||||
|
|
||||||
|
private lazy val oPorts = { oRealized = true; reqO(); accPO.result() }
|
||||||
|
private lazy val iPorts = { iRealized = true; reqI(); accPI.result() }
|
||||||
private lazy val oParams : Option[PO] = oFn.map(_(iPorts.map(_.oParams.get)))
|
private lazy val oParams : Option[PO] = oFn.map(_(iPorts.map(_.oParams.get)))
|
||||||
private lazy val iParams : Option[PI] = iFn.map(_(oPorts.map(_.iParams.get)))
|
private lazy val iParams : Option[PI] = iFn.map(_(oPorts.map(_.iParams.get)))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user