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 xstransforms._ 24cc358710SLinJiawei 25cc358710SLinJiaweitrait XiangShanCli { this: Shell => 26cc358710SLinJiawei parser.note("XiangShan Options") 27cc358710SLinJiawei DisablePrintfAnnotation.addOptions(parser) 28cc358710SLinJiawei EnablePrintfAnnotation.addOptions(parser) 29cc358710SLinJiawei DisableAllPrintAnnotation.addOptions(parser) 30cc358710SLinJiawei RemoveAssertAnnotation.addOptions(parser) 31cc358710SLinJiawei} 32cc358710SLinJiawei 33cc358710SLinJiaweiclass XiangShanStage extends chisel3.stage.ChiselStage { 34cc358710SLinJiawei override val shell: Shell = new Shell("xiangshan") 35cc358710SLinJiawei with XiangShanCli 36cc358710SLinJiawei with ChiselCli 37cc358710SLinJiawei with FirrtlCli 38cc358710SLinJiawei} 39cc358710SLinJiawei 40cc358710SLinJiaweiabstract class FirrtlCompiler 41cc358710SLinJiaweicase object SFC extends FirrtlCompiler 42cc358710SLinJiaweicase object MFC extends FirrtlCompiler 43cc358710SLinJiawei 44cc358710SLinJiaweiobject Generator { 45cc358710SLinJiawei 46b665b650STang Haojin def execute(args: Array[String], mod: => RawModule, fc: FirrtlCompiler, firtoolOpts: Array[String]) = { 47cc358710SLinJiawei fc match { 48cc358710SLinJiawei case MFC => 49cc358710SLinJiawei val sfcXsTransforms = Seq( 50cc358710SLinJiawei DisablePrintfAnnotation, 51cc358710SLinJiawei EnablePrintfAnnotation, 52cc358710SLinJiawei DisableAllPrintAnnotation, 53cc358710SLinJiawei RemoveAssertAnnotation 54cc358710SLinJiawei ) 55cc358710SLinJiawei val sfcOptions = sfcXsTransforms.flatMap(_.options.map(_.longOption)) ++ 56cc358710SLinJiawei sfcXsTransforms.flatMap(_.options.flatMap(_.shortOption)) 57cc358710SLinJiawei val mfcArgs = args.filter(s => { 58cc358710SLinJiawei val option_s = if(s.startsWith("--")){ 59cc358710SLinJiawei s.replace("--", "") 60cc358710SLinJiawei } else if(s.startsWith("-")){ 61cc358710SLinJiawei s.replace("-", "") 62cc358710SLinJiawei } else s 63cc358710SLinJiawei val cond = sfcOptions.contains(option_s) 64cc358710SLinJiawei if(cond){ 65cc358710SLinJiawei println(s"[Warnning] SFC Transform Option ${s} will be removed in MFC!") 66cc358710SLinJiawei } 67cc358710SLinJiawei !cond 68cc358710SLinJiawei }) 69cc358710SLinJiawei (new circt.stage.ChiselStage).execute(mfcArgs, Seq( 70cc358710SLinJiawei ChiselGeneratorAnnotation(mod _), 71b665b650STang Haojin circt.stage.CIRCTTargetAnnotation(circt.stage.CIRCTTarget.Verilog) 72b665b650STang Haojin ) ++ firtoolOpts.map(opt => circt.stage.FirtoolOption(opt))) 73cc358710SLinJiawei case SFC => 74cc358710SLinJiawei (new XiangShanStage).execute(args, Seq( 75cc358710SLinJiawei ChiselGeneratorAnnotation(mod _), 76cc358710SLinJiawei RunFirrtlTransformAnnotation(new PrintControl), 77*7f37d55fSTang Haojin RunFirrtlTransformAnnotation(new PrintModuleName) 78cc358710SLinJiawei )) 79cc358710SLinJiawei case _ => 80cc358710SLinJiawei assert(false, s"Unknown firrtl compiler: ${fc.getClass.getName}!") 81cc358710SLinJiawei } 82cc358710SLinJiawei } 83cc358710SLinJiawei 84cc358710SLinJiawei} 85