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