summaryrefslogtreecommitdiff
path: root/src/main/scala/chisel3/Driver.scala
blob: 30a97df6ea806eecdc34a10b19092d19c08ebe44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// SPDX-License-Identifier: Apache-2.0

package chisel3

import internal.firrtl._
import firrtl._
import firrtl.util.{BackendCompilationUtilities => FirrtlBackendCompilationUtilities}
import java.io._
import _root_.logger.LazyLogging

@deprecated("Use object firrtl.util.BackendCompilationUtilities instead", "Chisel 3.5")
trait BackendCompilationUtilities extends LazyLogging {

  import scala.sys.process.{ProcessBuilder, ProcessLogger, _}

  // Inlined from old trait firrtl.util.BackendCompilationUtilities
  lazy val TestDirectory = FirrtlBackendCompilationUtilities.TestDirectory
  def timeStamp:            String = FirrtlBackendCompilationUtilities.timeStamp
  def loggingProcessLogger: ProcessLogger = FirrtlBackendCompilationUtilities.loggingProcessLogger
  def copyResourceToFile(name: String, file: File): Unit =
    FirrtlBackendCompilationUtilities.copyResourceToFile(name, file)
  def createTestDirectory(testName: String): File = FirrtlBackendCompilationUtilities.createTestDirectory(testName)
  def makeHarness(template:         String => String, post: String)(f: File): File =
    FirrtlBackendCompilationUtilities.makeHarness(template, post)(f)
  def firrtlToVerilog(prefix: String, dir: File): ProcessBuilder =
    FirrtlBackendCompilationUtilities.firrtlToVerilog(prefix, dir)
  def verilogToCpp(
    dutFile:          String,
    dir:              File,
    vSources:         Seq[File],
    cppHarness:       File,
    suppressVcd:      Boolean = false,
    resourceFileName: String = firrtl.transforms.BlackBoxSourceHelper.defaultFileListName
  ): ProcessBuilder = {
    FirrtlBackendCompilationUtilities.verilogToCpp(dutFile, dir, vSources, cppHarness, suppressVcd, resourceFileName)
  }
  def cppToExe(prefix: String, dir: File): ProcessBuilder = FirrtlBackendCompilationUtilities.cppToExe(prefix, dir)
  def executeExpectingFailure(
    prefix:       String,
    dir:          File,
    assertionMsg: String = ""
  ): Boolean = {
    FirrtlBackendCompilationUtilities.executeExpectingFailure(prefix, dir, assertionMsg)
  }
  def executeExpectingSuccess(prefix: String, dir: File): Boolean =
    FirrtlBackendCompilationUtilities.executeExpectingSuccess(prefix, dir)

  /** Compile Chirrtl to Verilog by invoking Firrtl inside the same JVM
    *
    * @param prefix basename of the file
    * @param dir    directory where file lives
    * @return       true if compiler completed successfully
    */
  @deprecated("Use ChiselStage instead", "Chisel 3.5")
  def compileFirrtlToVerilog(prefix: String, dir: File): Boolean = {

    // ====== Implemented by inlining logic from ExecutionsOptionManager.toAnnotations =====
    import firrtl.stage.InfoModeAnnotation
    import firrtl.stage.phases.DriverCompatibility.TopNameAnnotation
    import _root_.logger.LogLevelAnnotation
    val annos: AnnotationSeq = List(
      InfoModeAnnotation("append"),
      TopNameAnnotation(prefix),
      TargetDirAnnotation(dir.getAbsolutePath),
      LogLevelAnnotation(_root_.logger.LogLevel.None)
    )

    // ******************* Implemented by inlining firrtl.Driver.execute ***************************
    import firrtl.stage.phases.DriverCompatibility
    import firrtl.stage.FirrtlStage
    import firrtl.options.{Dependency, Phase, PhaseManager}
    import firrtl.options.phases.DeletedWrapper

    val phases: Seq[Phase] = {
      import DriverCompatibility._
      new PhaseManager(
        List(
          Dependency[AddImplicitFirrtlFile],
          Dependency[AddImplicitAnnotationFile],
          Dependency[AddImplicitOutputFile],
          Dependency[AddImplicitEmitter],
          Dependency[FirrtlStage]
        )
      ).transformOrder
        .map(DeletedWrapper(_))
    }

    val annosx =
      try {
        phases.foldLeft(annos)((a, p) => p.transform(a))
      } catch {
        case _: firrtl.options.OptionsException => return false
      }
    // *********************************************************************************************

    val options = annosx

    // ********** Implemented by inlining firrtl.stage.FirrtlExecutionResultView.view **************
    import firrtl.stage.FirrtlCircuitAnnotation

    options.collectFirst { case a: FirrtlCircuitAnnotation => a.circuit } match {
      case None    => false
      case Some(_) => true
    }
    // *********************************************************************************************
  }
}