CIRCT  20.0.0git
ImportVerilog.h
Go to the documentation of this file.
1 //===- ImportVerilog.h - Slang Verilog frontend integration ---------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Defines the interface to the Verilog frontend.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef CIRCT_CONVERSION_IMPORTVERILOG_H
14 #define CIRCT_CONVERSION_IMPORTVERILOG_H
15 
16 #include "circt/Support/LLVM.h"
17 #include <optional>
18 #include <string>
19 #include <vector>
20 
21 namespace llvm {
22 class SourceMgr;
23 } // namespace llvm
24 
25 namespace mlir {
26 class LocationAttr;
27 class TimingScope;
28 } // namespace mlir
29 
30 namespace circt {
31 
32 /// Options that control how Verilog input files are parsed and processed.
33 ///
34 /// See `slang::driver::Driver::Options` for inspiration. Also check out
35 /// `Driver::addStandardArgs()` for some inspiration on how to expose these on
36 /// the command line.
38  /// Limit importing to linting or parsing only.
39  enum class Mode {
40  /// Only lint the input, without elaboration and lowering to CIRCT IR.
41  OnlyLint,
42  /// Only parse and elaborate the input, without mapping to CIRCT IR.
43  OnlyParse,
44  /// Perform a full import and mapping to CIRCT IR.
45  Full
46  };
48 
49  /// Generate debug information in the form of debug dialect ops in the IR.
50  bool debugInfo = false;
51 
52  //===--------------------------------------------------------------------===//
53  // Include paths
54  //===--------------------------------------------------------------------===//
55 
56  /// A list of include directories in which to search for files.
57  std::vector<std::string> includeDirs;
58 
59  /// A list of system include directories in which to search for files.
60  std::vector<std::string> includeSystemDirs;
61 
62  /// A list of library directories in which to search for missing modules.
63  std::vector<std::string> libDirs;
64 
65  /// A list of extensions that will be used to search for library files.
66  std::vector<std::string> libExts;
67 
68  /// A list of extensions that will be used to exclude files.
69  std::vector<std::string> excludeExts;
70 
71  /// A list of preprocessor directives to be ignored.
72  std::vector<std::string> ignoreDirectives;
73 
74  //===--------------------------------------------------------------------===//
75  // Preprocessing
76  //===--------------------------------------------------------------------===//
77 
78  /// The maximum depth of included files before an error is issued.
79  std::optional<uint32_t> maxIncludeDepth;
80 
81  /// A list of macros that should be defined in each compilation unit.
82  std::vector<std::string> defines;
83 
84  /// A list of macros that should be undefined in each compilation unit.
85  std::vector<std::string> undefines;
86 
87  /// If true, library files will inherit macro definitions from primary source
88  /// files.
89  std::optional<bool> librariesInheritMacros;
90 
91  //===--------------------------------------------------------------------===//
92  // Compilation
93  //===--------------------------------------------------------------------===//
94 
95  /// A string that indicates the default time scale to use for any design
96  /// elements that don't specify one explicitly.
97  std::optional<std::string> timeScale;
98 
99  /// If true, allow various to be referenced before they are declared.
100  std::optional<bool> allowUseBeforeDeclare;
101 
102  /// If true, ignore errors about unknown modules.
103  std::optional<bool> ignoreUnknownModules;
104 
105  /// If non-empty, specifies the list of modules that should serve as the top
106  /// modules in the design. If empty, this will be automatically determined
107  /// based on which modules are unreferenced elsewhere.
108  std::vector<std::string> topModules;
109 
110  /// A list of top-level module parameters to override, of the form
111  /// `<name>=<value>`.
112  std::vector<std::string> paramOverrides;
113 
114  //===--------------------------------------------------------------------===//
115  // Diagnostics Control
116  //===--------------------------------------------------------------------===//
117 
118  /// The maximum number of errors to print before giving up.
119  std::optional<uint32_t> errorLimit;
120 
121  /// A list of warning options that will be passed to the DiagnosticEngine.
122  std::vector<std::string> warningOptions;
123 
124  /// A list of paths in which to suppress warnings.
125  std::vector<std::string> suppressWarningsPaths;
126 
127  //===--------------------------------------------------------------------===//
128  // File lists
129  //===--------------------------------------------------------------------===//
130 
131  /// If set to true, all source files will be treated as part of a single
132  /// compilation unit, meaning all of their text will be merged together.
133  std::optional<bool> singleUnit;
134 
135  /// A list of library files to include in the compilation.
136  std::vector<std::string> libraryFiles;
137 };
138 
139 /// Parse files in a source manager as Verilog source code and populate the
140 /// given MLIR `module` with corresponding ops.
141 mlir::LogicalResult
142 importVerilog(llvm::SourceMgr &sourceMgr, mlir::MLIRContext *context,
143  mlir::TimingScope &ts, mlir::ModuleOp module,
144  const ImportVerilogOptions *options = nullptr);
145 
146 /// Run the files in a source manager through Slang's Verilog preprocessor and
147 /// emit the result to the given output stream.
148 mlir::LogicalResult
149 preprocessVerilog(llvm::SourceMgr &sourceMgr, mlir::MLIRContext *context,
150  mlir::TimingScope &ts, llvm::raw_ostream &os,
151  const ImportVerilogOptions *options = nullptr);
152 
153 /// Register the `import-verilog` MLIR translation.
155 
156 /// Return a human-readable string describing the slang frontend version linked
157 /// into CIRCT.
158 std::string getSlangVersion();
159 
160 } // namespace circt
161 
162 #endif // CIRCT_CONVERSION_IMPORTVERILOG_H
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition: DebugAnalysis.h:21
std::string getSlangVersion()
Return a human-readable string describing the slang frontend version linked into CIRCT.
mlir::LogicalResult importVerilog(llvm::SourceMgr &sourceMgr, mlir::MLIRContext *context, mlir::TimingScope &ts, mlir::ModuleOp module, const ImportVerilogOptions *options=nullptr)
Parse files in a source manager as Verilog source code and populate the given MLIR module with corres...
mlir::LogicalResult preprocessVerilog(llvm::SourceMgr &sourceMgr, mlir::MLIRContext *context, mlir::TimingScope &ts, llvm::raw_ostream &os, const ImportVerilogOptions *options=nullptr)
Run the files in a source manager through Slang's Verilog preprocessor and emit the result to the giv...
void registerFromVerilogTranslation()
Register the import-verilog MLIR translation.
Options that control how Verilog input files are parsed and processed.
Definition: ImportVerilog.h:37
std::vector< std::string > libraryFiles
A list of library files to include in the compilation.
std::optional< bool > allowUseBeforeDeclare
If true, allow various to be referenced before they are declared.
std::optional< uint32_t > maxIncludeDepth
The maximum depth of included files before an error is issued.
Definition: ImportVerilog.h:79
std::vector< std::string > warningOptions
A list of warning options that will be passed to the DiagnosticEngine.
std::vector< std::string > ignoreDirectives
A list of preprocessor directives to be ignored.
Definition: ImportVerilog.h:72
std::vector< std::string > libExts
A list of extensions that will be used to search for library files.
Definition: ImportVerilog.h:66
std::optional< bool > librariesInheritMacros
If true, library files will inherit macro definitions from primary source files.
Definition: ImportVerilog.h:89
std::vector< std::string > defines
A list of macros that should be defined in each compilation unit.
Definition: ImportVerilog.h:82
std::optional< bool > singleUnit
If set to true, all source files will be treated as part of a single compilation unit,...
std::vector< std::string > libDirs
A list of library directories in which to search for missing modules.
Definition: ImportVerilog.h:63
std::vector< std::string > suppressWarningsPaths
A list of paths in which to suppress warnings.
std::vector< std::string > includeSystemDirs
A list of system include directories in which to search for files.
Definition: ImportVerilog.h:60
std::vector< std::string > includeDirs
A list of include directories in which to search for files.
Definition: ImportVerilog.h:57
Mode
Limit importing to linting or parsing only.
Definition: ImportVerilog.h:39
@ OnlyLint
Only lint the input, without elaboration and lowering to CIRCT IR.
@ OnlyParse
Only parse and elaborate the input, without mapping to CIRCT IR.
@ Full
Perform a full import and mapping to CIRCT IR.
std::vector< std::string > undefines
A list of macros that should be undefined in each compilation unit.
Definition: ImportVerilog.h:85
std::vector< std::string > excludeExts
A list of extensions that will be used to exclude files.
Definition: ImportVerilog.h:69
std::vector< std::string > paramOverrides
A list of top-level module parameters to override, of the form <name>=<value>.
bool debugInfo
Generate debug information in the form of debug dialect ops in the IR.
Definition: ImportVerilog.h:50
std::optional< bool > ignoreUnknownModules
If true, ignore errors about unknown modules.
std::optional< std::string > timeScale
A string that indicates the default time scale to use for any design elements that don't specify one ...
Definition: ImportVerilog.h:97
std::vector< std::string > topModules
If non-empty, specifies the list of modules that should serve as the top modules in the design.
std::optional< uint32_t > errorLimit
The maximum number of errors to print before giving up.