如何解决为应用方法返回多个元素
我正在使用 DSL(凿子),其中库的一个特定部分要求我定义 Seq
项。我有几个配套对象来创建一些中间逻辑并返回这些项目之一。我有一种情况,我想实际退回其中的两个项目,但我很难弄清楚如何做到这一点。
假设这里的“项目”是 Person
。 (Person
是什么并不重要)
DSL 要求您通过 Person
描述您的所有 Seq
。
val p1 = new Person(1)
val p2 = new Person(2)
Seq(p1,p2)
我有一个案例,我想将两个人联系在一起。例如,我知道有些人的朋友到处都是,所以如果他们出现,他们的朋友也会出现(即使我不喜欢他们)。所以我希望能够做类似以下的事情。
object Group {
def apply(): Person,Person = { //return two of these
val pA = new Person(10)
val pAA = new Person(10+1)
}
}
这样,我可以轻松地执行以下操作
Seq(p1,p2,Group)
//The Seq should have p1,and the pA,pAA
由于这是一个 DSL,我无权更改内部结构。我可以创建 Seq 的每一部分,然后将它们全部组合在一起,但这并不理想,因为这是我经常做的事情,因此需要一个好的解决方案。出于同样的原因,我无法发回元组。
我试图查看变量 args 是否对返回起作用,但这似乎不起作用。
任何帮助将不胜感激。谢谢
我们的领主和救世主杰克·科尼格的更新
这是利用 RocketChip RegisterRotuer
节点来描述 RegFields
通常在我的设计中,我有来自某些逻辑的信号,并且我希望软件能够阻止上游逻辑并手动驱动信号(考虑一些您希望软件能够驱动的启用) .为此,我构建了一个代表驱动值的 SW 寄存器,以及一个处理控制的“mux”SW 寄存器。我目前所做的是这个(目前返回一个 Seq[RegField]
但希望你看到我希望这是两个 RegField
类型
/**
* Creates a muxed override register. This allows software to take control of a particular signal by setting the "_mux" register
* high. Once in this mode,the value of the signal is based on the software register defined here.
*
* This method makes the assumption that you want the two bitfields to be next to each other (reg then mux). If you do not want this
* or can't do this (because the signal you want to control is >=32bits) you will have to create two separate RWReg. One for the mux
* and one for the SW control value
*
*
* val rx_reset_reg = Wire(Bool())
* val rx_reset_mux = Wire(Bool())
* val rx_reset = WavClockMux (rx_reset_mux,rx_reset_reg,io.core.rx_reset)
* WavD2DRxRegs.CoreOverride -> Seq(WavRWReg(rx_reset_reg,0.U,"rx_reset","RX Reset"),* WavRWReg(rx_reset_mux,"rx_reset_mux","Mux override for rx_reset")),*
*
* This method also has the nuance that it returns a Seq[RegField]. So you must concatenate this companion object with the higher leve
* Seq[RegField] that we normally use for register generation
*
* WavRWMuxReg(in=io.core.tx_en,muxed=io.ana.tx_en,reg_reset=false.B,mux_reset=false.B,"tx_en","Main TX enable") ++ Seq(<other regFields>)
*/
object WavRWMuxReg{
def apply[T <: Data](in: T,muxed : T,reg_reset: T,mux_reset: Bool,name: String,desc: String)(implicit p: Parameters): Seq[RegField] = {
//val reg = RegInit(reset)
val reg = RegInit(muxed.cloneType,reg_reset)
reg.suggestName("swi_" + name)
val mux = RegInit(mux_reset)
mux.suggestName("swi_" + name + "_mux")
muxed := Mux(mux,reg,in)
//litValue returns the Bigint value
val rf_reg = RegField(reg.getWidth,reg.asUInt,RegFieldDesc(name,desc,access=RegFieldAccesstype.RW,reset=Some(reg_reset.litValue)))
val rf_mux = RegField(1,mux.asUInt,RegFieldDesc(name+"_mux","Mux control for corresponding register",reset=Some(mux_reset.litValue)))
Seq(rf_reg,rf_mux)
}
}
所以理想情况下,我会用它来创建两者,并且可以说
node.regmap(
0x0 -> Seq(WavRWReg(/*custom method that returns RegField*/),WavRWMuxReg(/*returns two RegFields*/))
)
解决方法
返回一个 Seq
并连接?
object PlusN {
def apply(m,n): Seq[Person] = (m to m+n).map(Person)
}
val people = Seq(p1,p2) ++ PlusN(10,1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。