1cc358710SLinJiawei/*************************************************************************************** 2cc358710SLinJiawei* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3cc358710SLinJiawei* Copyright (c) 2020-2021 Peng Cheng Laboratory 4cc358710SLinJiawei* 5cc358710SLinJiawei* XiangShan is licensed under Mulan PSL v2. 6cc358710SLinJiawei* You can use this software according to the terms and conditions of the Mulan PSL v2. 7cc358710SLinJiawei* You may obtain a copy of Mulan PSL v2 at: 8cc358710SLinJiawei* http://license.coscl.org.cn/MulanPSL2 9cc358710SLinJiawei* 10cc358710SLinJiawei* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11cc358710SLinJiawei* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12cc358710SLinJiawei* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13cc358710SLinJiawei* 14cc358710SLinJiawei* See the Mulan PSL v2 for more details. 15cc358710SLinJiawei***************************************************************************************/ 16cc358710SLinJiawei 17cc358710SLinJiaweipackage top 18cc358710SLinJiawei 19cc358710SLinJiaweiimport chisel3.RawModule 20cc358710SLinJiaweiimport chisel3.stage.{ChiselCli, ChiselGeneratorAnnotation} 21cc358710SLinJiaweiimport firrtl.options.Shell 22cc358710SLinJiaweiimport firrtl.stage.{FirrtlCli, RunFirrtlTransformAnnotation} 23cc358710SLinJiaweiimport freechips.rocketchip.transforms.naming.RenameDesiredNames 24cc358710SLinJiaweiimport xstransforms._ 25cc358710SLinJiawei 26cc358710SLinJiaweitrait XiangShanCli { this: Shell => 27cc358710SLinJiawei parser.note("XiangShan Options") 28cc358710SLinJiawei DisablePrintfAnnotation.addOptions(parser) 29cc358710SLinJiawei EnablePrintfAnnotation.addOptions(parser) 30cc358710SLinJiawei DisableAllPrintAnnotation.addOptions(parser) 31cc358710SLinJiawei RemoveAssertAnnotation.addOptions(parser) 32cc358710SLinJiawei} 33cc358710SLinJiawei 34cc358710SLinJiaweiclass XiangShanStage extends chisel3.stage.ChiselStage { 35cc358710SLinJiawei override val shell: Shell = new Shell("xiangshan") 36cc358710SLinJiawei with XiangShanCli 37cc358710SLinJiawei with ChiselCli 38cc358710SLinJiawei with FirrtlCli 39cc358710SLinJiawei} 40cc358710SLinJiawei 41cc358710SLinJiaweiabstract class FirrtlCompiler 42cc358710SLinJiaweicase object SFC extends FirrtlCompiler 43cc358710SLinJiaweicase object MFC extends FirrtlCompiler 44cc358710SLinJiawei 45cc358710SLinJiaweiobject Generator { 46cc358710SLinJiawei 47*b665b650STang Haojin def execute(args: Array[String], mod: => RawModule, fc: FirrtlCompiler, firtoolOpts: Array[String]) = { 48cc358710SLinJiawei fc match { 49cc358710SLinJiawei case MFC => 50cc358710SLinJiawei val sfcXsTransforms = Seq( 51cc358710SLinJiawei DisablePrintfAnnotation, 52cc358710SLinJiawei EnablePrintfAnnotation, 53cc358710SLinJiawei DisableAllPrintAnnotation, 54cc358710SLinJiawei RemoveAssertAnnotation 55cc358710SLinJiawei ) 56cc358710SLinJiawei val sfcOptions = sfcXsTransforms.flatMap(_.options.map(_.longOption)) ++ 57cc358710SLinJiawei sfcXsTransforms.flatMap(_.options.flatMap(_.shortOption)) 58cc358710SLinJiawei val mfcArgs = args.filter(s => { 59cc358710SLinJiawei val option_s = if(s.startsWith("--")){ 60cc358710SLinJiawei s.replace("--", "") 61cc358710SLinJiawei } else if(s.startsWith("-")){ 62cc358710SLinJiawei s.replace("-", "") 63cc358710SLinJiawei } else s 64cc358710SLinJiawei val cond = sfcOptions.contains(option_s) 65cc358710SLinJiawei if(cond){ 66cc358710SLinJiawei println(s"[Warnning] SFC Transform Option ${s} will be removed in MFC!") 67cc358710SLinJiawei } 68cc358710SLinJiawei !cond 69cc358710SLinJiawei }) 70cc358710SLinJiawei (new circt.stage.ChiselStage).execute(mfcArgs, Seq( 71cc358710SLinJiawei ChiselGeneratorAnnotation(mod _), 72*b665b650STang Haojin circt.stage.CIRCTTargetAnnotation(circt.stage.CIRCTTarget.Verilog) 73*b665b650STang Haojin ) ++ firtoolOpts.map(opt => circt.stage.FirtoolOption(opt))) 74cc358710SLinJiawei case SFC => 75cc358710SLinJiawei (new XiangShanStage).execute(args, Seq( 76cc358710SLinJiawei ChiselGeneratorAnnotation(mod _), 77cc358710SLinJiawei RunFirrtlTransformAnnotation(new PrintControl), 78cc358710SLinJiawei RunFirrtlTransformAnnotation(new PrintModuleName), 79cc358710SLinJiawei RunFirrtlTransformAnnotation(new RenameDesiredNames) 80cc358710SLinJiawei )) 81cc358710SLinJiawei case _ => 82cc358710SLinJiawei assert(false, s"Unknown firrtl compiler: ${fc.getClass.getName}!") 83cc358710SLinJiawei } 84cc358710SLinJiawei } 85cc358710SLinJiawei 86cc358710SLinJiawei} 87