15 #include "mlir/IR/BuiltinOps.h"
17 using namespace circt;
26 parse(options, errorHandler);
33 static std::optional<LoweringOptions::LocationInfoStyle>
35 return llvm::StringSwitch<std::optional<LoweringOptions::LocationInfoStyle>>(
40 .Default(std::nullopt);
43 static std::optional<LoweringOptions::WireSpillingHeuristic>
45 return llvm::StringSwitch<
46 std::optional<LoweringOptions::WireSpillingHeuristic>>(option)
47 .Case(
"spillLargeTermsWithNamehints",
49 .Default(std::nullopt);
53 while (!text.empty()) {
55 auto split = text.split(
",");
56 auto option = split.first.trim();
60 }
else if (option ==
"noAlwaysComb") {
62 }
else if (option ==
"exprInEventControl") {
64 }
else if (option ==
"disallowPackedArrays") {
66 }
else if (option ==
"disallowPackedStructAssignments") {
68 }
else if (option ==
"disallowLocalVariables") {
70 }
else if (option ==
"verifLabels") {
72 }
else if (option.consume_front(
"emittedLineLength=")) {
74 errorHandler(
"expected integer source width");
77 }
else if (option ==
"explicitBitcast") {
79 }
else if (option ==
"emitReplicatedOpsToHeader") {
81 }
else if (option.consume_front(
"maximumNumberOfTermsPerExpression=")) {
83 errorHandler(
"expected integer source width");
86 }
else if (option.consume_front(
"locationInfoStyle=")) {
90 errorHandler(
"expected 'plain', 'wrapInAtSquareBracket', or 'none'");
92 }
else if (option ==
"disallowPortDeclSharing") {
94 }
else if (option ==
"printDebugInfo") {
96 }
else if (option ==
"disallowExpressionInliningInPorts") {
98 }
else if (option ==
"disallowMuxInlining") {
100 }
else if (option ==
"mitigateVivadoArrayIndexConstPropBug") {
102 }
else if (option.consume_front(
"wireSpillingHeuristic=")) {
106 errorHandler(
"expected ''spillLargeTermsWithNamehints'");
108 }
else if (option.consume_front(
"wireSpillingNamehintTermLimit=")) {
111 "expected integer for number of namehint heurstic term limit");
114 }
else if (option ==
"emitWireInPorts") {
116 }
else if (option ==
"emitBindComments") {
118 }
else if (option ==
"omitVersionComment") {
120 }
else if (option ==
"caseInsensitiveKeywords") {
122 }
else if (option ==
"emitVerilogLocations") {
124 }
else if (option ==
"fixUpEmptyModules") {
127 errorHandler(llvm::Twine(
"unknown style option \'") + option +
"\'");
134 std::string options =
"";
137 options +=
"noAlwaysComb,";
139 options +=
"exprInEventControl,";
141 options +=
"disallowPackedArrays,";
143 options +=
"disallowPackedStructAssignments,";
145 options +=
"disallowLocalVariables,";
147 options +=
"verifLabels,";
149 options +=
"explicitBitcast,";
151 options +=
"emitReplicatedOpsToHeader,";
153 options +=
"locationInfoStyle=wrapInAtSquareBracket,";
155 options +=
"locationInfoStyle=none,";
157 options +=
"disallowPortDeclSharing,";
159 options +=
"printDebugInfo,";
161 WireSpillingHeuristic::SpillLargeTermsWithNamehints))
162 options +=
"wireSpillingHeuristic=spillLargeTermsWithNamehints,";
164 options +=
"disallowExpressionInliningInPorts,";
166 options +=
"disallowMuxInlining,";
168 options +=
"mitigateVivadoArrayIndexConstPropBug,";
173 options +=
"maximumNumberOfTermsPerExpression=" +
176 options +=
"emitWireInPorts,";
178 options +=
"emitBindComments,";
180 options +=
"omitVersionComment,";
182 options +=
"caseInsensitiveKeywords,";
184 options +=
"emitVerilogLocations,";
186 options +=
"fixUpEmptyModules,";
189 if (!options.empty()) {
190 assert(options.back() ==
',' &&
"all options should add a trailing comma");
197 return module->getAttrOfType<StringAttr>(
"circt.loweringOptions");
201 module->setAttr(
"circt.loweringOptions",
207 parse(styleAttr.getValue(), [&](Twine error) { module.emitError(error); });
assert(baseType &&"element must be base type")
static std::optional< LoweringOptions::WireSpillingHeuristic > parseWireSpillingHeuristic(StringRef option)
static std::optional< LoweringOptions::LocationInfoStyle > parseLocationInfoStyle(StringRef option)
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Options which control the emission from CIRCT to Verilog.
bool isWireSpillingHeuristicEnabled(WireSpillingHeuristic heurisic) const
bool noAlwaysComb
If true, emits sv.alwayscomb as Verilog always @(*) statements.
bool mitigateVivadoArrayIndexConstPropBug
If true, every expression used as an array index is driven by a wire, and the wire is marked as (* ke...
bool disallowLocalVariables
If true, do not emit SystemVerilog locally scoped "automatic" or logic declarations - emit top level ...
bool omitVersionComment
If true, do not emit a version comment at the top of each verilog file.
bool enforceVerifLabels
If true, verification statements like assert, assume, and cover will always be emitted with a label.
bool disallowExpressionInliningInPorts
If true, every expression passed to an instance port is driven by a wire.
bool printDebugInfo
Print debug info.
llvm::function_ref< void(llvm::Twine)> ErrorHandlerT
Error callback type used to indicate errors parsing the options string.
unsigned emittedLineLength
unsigned maximumNumberOfTermsPerExpression
@ SpillLargeTermsWithNamehints
void setAsAttribute(mlir::ModuleOp module)
Write the verilog emitter options to a module's attributes.
enum circt::LoweringOptions::LocationInfoStyle locationInfoStyle
unsigned wireSpillingNamehintTermLimit
bool disallowPortDeclSharing
If true, every port is declared separately (each includes direction and type (e.g....
@ DEFAULT_NAMEHINT_TERM_LIMIT
bool disallowPackedArrays
If true, eliminate packed arrays for tools that don't support them (e.g.
bool explicitBitcast
Add an explicit bitcast for avoiding bitwidth mismatch LINT errors.
bool disallowMuxInlining
If true, every mux expression is spilled to a wire.
bool fixUpEmptyModules
If true, add a dummy wire to empty modules to prevent tools from regarding the module as blackbox.
bool disallowPackedStructAssignments
If true, eliminate packed struct assignments in favor of a wire + assignments to the individual field...
void parse(llvm::StringRef options, ErrorHandlerT callback)
Read in options from a string, overriding only the set options in the string.
static mlir::StringAttr getAttributeFrom(mlir::ModuleOp module)
Return the value of the circt.loweringOptions in the specified module if present, or a null attribute...
bool caseInsensitiveKeywords
If true, then unique names that collide with keywords case insensitively.
unsigned wireSpillingHeuristicSet
void parseFromAttribute(mlir::ModuleOp module)
Load any emitter options from the module.
bool emitWireInPorts
If true, emit wire in port lists rather than nothing.
bool emitReplicatedOpsToHeader
If true, replicated ops are emitted to a header file.
std::string toString() const
Returns a string representation of the options.
LoweringOptions()=default
Create a LoweringOptions with the default values.
bool allowExprInEventControl
If true, expressions are allowed in the sensitivity list of always statements, otherwise they are for...
bool emitVerilogLocations
If true, then update the the mlir to include output verilog locations.
bool emitBindComments
If true, emit a comment wherever an instance wasn't printed, because it's emitted elsewhere as a bind...