xref: /XiangShan/src/main/scala/utils/VerilogAXI4Record.scala (revision 2993c5ecece73b73073301e23435ca1b763d0b5f)
1*2993c5ecSHaojin Tang/***************************************************************************************
2*2993c5ecSHaojin Tang* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC)
3*2993c5ecSHaojin Tang* Copyright (c) 2024 Institute of Computing Technology, Chinese Academy of Sciences
4*2993c5ecSHaojin Tang*
5*2993c5ecSHaojin Tang* XiangShan is licensed under Mulan PSL v2.
6*2993c5ecSHaojin Tang* You can use this software according to the terms and conditions of the Mulan PSL v2.
7*2993c5ecSHaojin Tang* You may obtain a copy of Mulan PSL v2 at:
8*2993c5ecSHaojin Tang*          http://license.coscl.org.cn/MulanPSL2
9*2993c5ecSHaojin Tang*
10*2993c5ecSHaojin Tang* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11*2993c5ecSHaojin Tang* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12*2993c5ecSHaojin Tang* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13*2993c5ecSHaojin Tang*
14*2993c5ecSHaojin Tang* See the Mulan PSL v2 for more details.
15*2993c5ecSHaojin Tang***************************************************************************************/
16*2993c5ecSHaojin Tang
17*2993c5ecSHaojin Tangpackage utils
18*2993c5ecSHaojin Tang
19*2993c5ecSHaojin Tangimport chisel3._
20*2993c5ecSHaojin Tangimport chisel3.util._
21*2993c5ecSHaojin Tangimport chisel3.experimental.dataview._
22*2993c5ecSHaojin Tangimport scala.collection.immutable._
23*2993c5ecSHaojin Tangimport freechips.rocketchip.amba.axi4._
24*2993c5ecSHaojin Tang
25*2993c5ecSHaojin Tangclass VerilogAXI4Record(val params: AXI4BundleParameters) extends Record {
26*2993c5ecSHaojin Tang  private val axi4Bundle = new AXI4Bundle(params)
27*2993c5ecSHaojin Tang  private def traverseAndMap(data: (String, Data)): SeqMap[String, Data] = {
28*2993c5ecSHaojin Tang    data match {
29*2993c5ecSHaojin Tang      case (name: String, node: Bundle) => SeqMap.from(
30*2993c5ecSHaojin Tang        node.elements.map(x => traverseAndMap(x)).flatten.map {
31*2993c5ecSHaojin Tang          case (nodeName, node) => (s"${name.replace("bits", "")}${nodeName}", node)
32*2993c5ecSHaojin Tang        }
33*2993c5ecSHaojin Tang      )
34*2993c5ecSHaojin Tang      case (name: String, node: Data) => SeqMap(name -> node)
35*2993c5ecSHaojin Tang    }
36*2993c5ecSHaojin Tang  }
37*2993c5ecSHaojin Tang  private val outputPattern = "^(aw|w|ar).*".r
38*2993c5ecSHaojin Tang  private val elems = traverseAndMap("", axi4Bundle) map { case (name, node) => name match {
39*2993c5ecSHaojin Tang    case outputPattern(_) => (name, Output(node))
40*2993c5ecSHaojin Tang    case _: String        => (name, Input (node))
41*2993c5ecSHaojin Tang  }} map { case (name, node) => name match {
42*2993c5ecSHaojin Tang    case s"${_}ready" => (name, Flipped(node))
43*2993c5ecSHaojin Tang    case _: String    => (name, node)
44*2993c5ecSHaojin Tang  }}
45*2993c5ecSHaojin Tang  def elements: SeqMap[String, Data] = elems
46*2993c5ecSHaojin Tang}
47*2993c5ecSHaojin Tang
48*2993c5ecSHaojin Tangobject VerilogAXI4Record {
49*2993c5ecSHaojin Tang  private val elementsMap: Seq[(VerilogAXI4Record, AXI4Bundle) => (Data, Data)] = {
50*2993c5ecSHaojin Tang    val names = (new VerilogAXI4Record(AXI4BundleParameters(1, 8, 1))).elements.map(_._1)
51*2993c5ecSHaojin Tang    val pattern = "^(aw|w|b|ar|r)(.*)".r
52*2993c5ecSHaojin Tang    names.map { name => { (verilog: VerilogAXI4Record, chisel: AXI4Bundle) => {
53*2993c5ecSHaojin Tang      val (channel: Record, signal: String) = name match {
54*2993c5ecSHaojin Tang        case pattern(prefix, signal) =>
55*2993c5ecSHaojin Tang          (chisel.elements(prefix).asInstanceOf[Record], signal)
56*2993c5ecSHaojin Tang        case _: String => require(false, "unexpected prefix"); null
57*2993c5ecSHaojin Tang      }
58*2993c5ecSHaojin Tang      verilog.elements(name) -> channel.elements.applyOrElse(signal,
59*2993c5ecSHaojin Tang        channel.elements("bits").asInstanceOf[Record].elements)
60*2993c5ecSHaojin Tang    }}}.toSeq
61*2993c5ecSHaojin Tang  }
62*2993c5ecSHaojin Tang  implicit val axi4View: DataView[VerilogAXI4Record, AXI4Bundle] = DataView[VerilogAXI4Record, AXI4Bundle](
63*2993c5ecSHaojin Tang    vab => new AXI4Bundle(vab.params), elementsMap: _*
64*2993c5ecSHaojin Tang  )
65*2993c5ecSHaojin Tang  implicit val axi4View2: DataView[AXI4Bundle, VerilogAXI4Record] = axi4View.invert(ab => new VerilogAXI4Record(ab.params))
66*2993c5ecSHaojin Tang}
67