CIRCT
20.0.0git
|
#include "ExportVerilogInternals.h"
#include "circt/Conversion/ExportVerilog.h"
#include "circt/Dialect/Comb/CombOps.h"
#include "circt/Dialect/Debug/DebugDialect.h"
#include "circt/Dialect/LTL/LTLDialect.h"
#include "circt/Dialect/Verif/VerifDialect.h"
#include "circt/Support/LoweringOptions.h"
#include "mlir/IR/ImplicitLocOpBuilder.h"
#include "mlir/Interfaces/CallInterfaces.h"
#include "mlir/Pass/Pass.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/TypeSwitch.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "circt/Conversion/Passes.h.inc"
Go to the source code of this file.
Classes | |
struct | EmittedExpressionState |
class | EmittedExpressionStateManager |
This class handles information about AST structures of each expressions. More... | |
struct | WireLowering |
Namespaces | |
circt | |
The InstanceGraph op interface, see InstanceGraphInterface.td for more details. | |
Macros | |
#define | DEBUG_TYPE "prepare-for-emission" |
#define | GEN_PASS_DEF_PREPAREFOREMISSION |
Functions | |
static bool | shouldSpillWire (Operation &op, const LoweringOptions &options) |
static StringAttr | getArgName (Operation *op, size_t idx) |
static void | spillWiresForInstanceInputs (HWInstanceLike op) |
static void | replacePortWithWire (ImplicitLocOpBuilder &builder, Operation *op, Value result, StringRef name) |
static StringAttr | getResName (Operation *op, size_t idx) |
static void | lowerInstanceResults (HWInstanceLike op) |
static void | lowerFunctionCallResults (Operation *op) |
static void | lowerUsersToTemporaryWire (Operation &op, bool emitWireAtBlockBegin=false) |
Emit an explicit wire or logic to assign operation's result. More... | |
static void | lowerAlwaysInlineOperation (Operation *op, const LoweringOptions &options) |
static std::pair< Block *, Block::iterator > | findLogicOpInsertionPoint (Operation *op) |
static Value | lowerFullyAssociativeOp (Operation &op, OperandRange operands, SmallVector< Operation * > &newOps) |
Lower a variadic fully-associative operation into an expression tree. More... | |
static Operation * | rewriteAddWithNegativeConstant (comb::AddOp add, hw::ConstantOp rhsCst) |
Transform "a + -cst" ==> "a - cst" for prettier output. More... | |
static Operation * | lowerStructExplodeOp (hw::StructExplodeOp op) |
static Operation * | findParentInNonProceduralRegion (Operation *op) |
Given an operation in a procedural region, scan up the region tree to find the first operation in a graph region (typically an always or initial op). More... | |
static bool | rewriteSideEffectingExpr (Operation *op) |
This function is invoked on side effecting Verilog expressions when we're in 'disallowLocalVariables' mode for old Verilog clients. More... | |
static bool | hoistNonSideEffectExpr (Operation *op) |
This function is called for non-side-effecting Verilog expressions when we're in 'disallowLocalVariables' mode for old Verilog clients. More... | |
static bool | isMovableDeclaration (Operation *op) |
Check whether an op is a declaration that can be moved. More... | |
static bool | reuseExistingInOut (Operation *op, const LoweringOptions &options) |
If exactly one use of this op is an assign, replace the other uses with a read from the assigned wire or reg. More... | |
static void | prettifyAfterLegalization (Block &block, EmittedExpressionStateManager &expressionStateManager) |
After the legalization, we are able to know accurate verilog AST structures. More... | |
static void | buildWireLowerings (Block &block, SmallVectorImpl< WireLowering > &wireLowerings) |
Determine the insertion location of declaration and assignment ops for hw::WireOp s in a block. More... | |
static void | applyWireLowerings (Block &block, ArrayRef< WireLowering > wireLowerings) |
Materialize the SV wire declaration and assignment operations in the locations previously determined by a call to buildWireLowerings . More... | |
static LogicalResult | legalizeHWModule (Block &block, const LoweringOptions &options) |
For each module we emit, do a prepass over the structure, pre-lowering and otherwise rewriting operations we don't want to emit. More... | |
static void | fixUpEmptyModules (hw::HWEmittableModuleLike module) |
#define DEBUG_TYPE "prepare-for-emission" |
Definition at line 36 of file PrepareForEmission.cpp.
#define GEN_PASS_DEF_PREPAREFOREMISSION |
Definition at line 39 of file PrepareForEmission.cpp.
|
static |
Materialize the SV wire declaration and assignment operations in the locations previously determined by a call to buildWireLowerings
.
This replaces all hw::WireOp
s with their appropriate SV counterpart.
Definition at line 846 of file PrepareForEmission.cpp.
References sv.WireOp::create(), and sv.AssignOp::create().
Referenced by legalizeHWModule().
|
static |
Determine the insertion location of declaration and assignment ops for hw::WireOp
s in a block.
This function tries to place the declaration point as late as possible, right before the very first use of the wire. It also tries to place the assign point as early as possible, right after the assigned value becomes available.
Definition at line 817 of file PrepareForEmission.cpp.
Referenced by legalizeHWModule().
|
static |
Definition at line 376 of file PrepareForEmission.cpp.
Referenced by legalizeHWModule().
|
static |
Given an operation in a procedural region, scan up the region tree to find the first operation in a graph region (typically an always or initial op).
By looking for a graph region, we will stop at graph-region #ifdef's that may enclose this operation.
Definition at line 463 of file PrepareForEmission.cpp.
References assert().
Referenced by hoistNonSideEffectExpr(), legalizeHWModule(), and rewriteSideEffectingExpr().
|
static |
Definition at line 1314 of file PrepareForEmission.cpp.
References hw.ConstantOp::create(), circt::calyx::direction::get(), and circt::sv::setSVAttributes().
Referenced by circt::ExportVerilog::prepareHWModule().
|
static |
Definition at line 76 of file PrepareForEmission.cpp.
Referenced by spillWiresForInstanceInputs().
|
static |
Definition at line 143 of file PrepareForEmission.cpp.
Referenced by lowerInstanceResults().
|
static |
This function is called for non-side-effecting Verilog expressions when we're in 'disallowLocalVariables' mode for old Verilog clients.
It hoists non-constant expressions out to the top level so they don't turn into local variable declarations.
Definition at line 513 of file PrepareForEmission.cpp.
References findParentInNonProceduralRegion(), and circt::ExportVerilog::isExpressionAlwaysInline().
Referenced by legalizeHWModule().
|
static |
Check whether an op is a declaration that can be moved.
Definition at line 566 of file PrepareForEmission.cpp.
Referenced by legalizeHWModule().
|
static |
For each module we emit, do a prepass over the structure, pre-lowering and otherwise rewriting operations we don't want to emit.
Definition at line 898 of file PrepareForEmission.cpp.
References circt::sv::addSVAttributes(), applyWireLowerings(), assert(), buildWireLowerings(), sv.WireOp::create(), sv.AssignOp::create(), circt::LoweringOptions::disallowExpressionInliningInPorts, circt::LoweringOptions::disallowLocalVariables, circt::LoweringOptions::disallowPackedStructAssignments, findLogicOpInsertionPoint(), findParentInNonProceduralRegion(), circt::calyx::direction::get(), hoistNonSideEffectExpr(), circt::ExportVerilog::isConstantExpression(), circt::ExportVerilog::isExpressionAlwaysInline(), isMovableDeclaration(), circt::ExportVerilog::isVerilogExpression(), lowerAlwaysInlineOperation(), lowerFullyAssociativeOp(), lowerFunctionCallResults(), lowerInstanceResults(), lowerStructExplodeOp(), lowerUsersToTemporaryWire(), circt::LoweringOptions::mitigateVivadoArrayIndexConstPropBug, reuseExistingInOut(), rewriteAddWithNegativeConstant(), rewriteSideEffectingExpr(), shouldSpillWire(), and spillWiresForInstanceInputs().
Referenced by circt::ExportVerilog::prepareHWModule().
|
static |
Definition at line 310 of file PrepareForEmission.cpp.
References assert(), circt::ExportVerilog::isExpressionAlwaysInline(), lowerUsersToTemporaryWire(), and shouldSpillWire().
Referenced by legalizeHWModule(), and reuseExistingInOut().
|
static |
Lower a variadic fully-associative operation into an expression tree.
This enables long-line splitting to work with them. NOLINTNEXTLINE(misc-no-recursion)
Definition at line 386 of file PrepareForEmission.cpp.
References assert().
Referenced by legalizeHWModule().
|
static |
Definition at line 198 of file PrepareForEmission.cpp.
References assert(), getBodyBlock(), and replacePortWithWire().
Referenced by legalizeHWModule().
|
static |
Definition at line 150 of file PrepareForEmission.cpp.
References Python.support::connect(), sv.WireOp::create(), getBodyBlock(), getResName(), and circt::ExportVerilog::isZeroBitType().
Referenced by legalizeHWModule().
|
static |
Definition at line 442 of file PrepareForEmission.cpp.
Referenced by legalizeHWModule().
|
static |
Emit an explicit wire or logic to assign operation's result.
This function is used to create a temporary to legalize a verilog expression or to resolve use-before-def in a graph region. If emitWireAtBlockBegin
is true, a temporary wire will be created at the beginning of the block. Otherwise, a wire is created just after op's position so that we can inline the assignment into its wire declaration.
Definition at line 230 of file PrepareForEmission.cpp.
References Python.support::connect(), sv.WireOp::create(), sv.ReadInOutOp::create(), and circt::ExportVerilog::inferStructuralNameForTemporary().
Referenced by legalizeHWModule(), lowerAlwaysInlineOperation(), and prettifyAfterLegalization().
|
static |
After the legalization, we are able to know accurate verilog AST structures.
So this function walks and prettifies verilog IR with a heuristic method specified by options.wireSpillingHeuristic
based on the structures.
Definition at line 782 of file PrepareForEmission.cpp.
References circt::ExportVerilog::isVerilogExpression(), lowerUsersToTemporaryWire(), and EmittedExpressionStateManager::shouldSpillWireBasedOnState().
Referenced by circt::ExportVerilog::prepareHWModule().
|
static |
Definition at line 114 of file PrepareForEmission.cpp.
References Python.support::connect(), and sv.WireOp::create().
Referenced by lowerFunctionCallResults().
|
static |
If exactly one use of this op is an assign, replace the other uses with a read from the assigned wire or reg.
This assumes the preconditions for doing so are met: op must be an expression in a non-procedural region.
Definition at line 679 of file PrepareForEmission.cpp.
References circt::ExportVerilog::isExpressionAlwaysInline(), and lowerAlwaysInlineOperation().
Referenced by legalizeHWModule().
|
static |
Transform "a + -cst" ==> "a - cst" for prettier output.
This returns the first operation emitted.
Definition at line 425 of file PrepareForEmission.cpp.
References hw.ConstantOp::create().
Referenced by legalizeHWModule().
|
static |
This function is invoked on side effecting Verilog expressions when we're in 'disallowLocalVariables' mode for old Verilog clients.
This ensures that any side effecting expressions are only used by a single BPAssign to a sv.reg or sv.logic operation. This ensures that the verilog emitter doesn't have to worry about spilling them.
This returns true if the op was rewritten, false otherwise.
Definition at line 479 of file PrepareForEmission.cpp.
References assert(), sv.ReadInOutOp::create(), findParentInNonProceduralRegion(), and seq::reg().
Referenced by legalizeHWModule().
|
static |
Definition at line 68 of file PrepareForEmission.cpp.
References circt::ExportVerilog::isExpressionEmittedInline(), and circt::ExportVerilog::isVerilogExpression().
Referenced by legalizeHWModule(), and lowerAlwaysInlineOperation().
|
static |
Definition at line 83 of file PrepareForEmission.cpp.
References Python.support::connect(), sv.WireOp::create(), getArgName(), getBodyBlock(), and circt::ExportVerilog::isSimpleReadOrPort().
Referenced by legalizeHWModule().