xref: /XiangShan/src/main/scala/top/Generator.scala (revision b665b65009f36cbe77ec1a1cb4246701d9cee88b)
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