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