20#define GEN_PASS_DEF_LOWERSYMBOLICVALUESPASS
21#include "circt/Dialect/Verif/Passes.h.inc"
26struct LowerSymbolicValuesPass
27 : verif::impl::LowerSymbolicValuesPassBase<LowerSymbolicValuesPass> {
28 using LowerSymbolicValuesPassBase::LowerSymbolicValuesPassBase;
29 void runOnOperation()
override;
30 LogicalResult lowerToExtModule();
31 void lowerToAnySeqWire();
35void LowerSymbolicValuesPass::runOnOperation() {
37 case SymbolicValueLowering::ExtModule:
38 if (failed(lowerToExtModule()))
41 case SymbolicValueLowering::Yosys:
50LogicalResult LowerSymbolicValuesPass::lowerToExtModule() {
51 auto &symbolTable = getAnalysis<SymbolTable>();
52 DenseMap<Type, HWModuleExternOp> extmoduleOps;
53 auto result = getOperation().walk([&](SymbolicValueOp op) -> WalkResult {
55 auto numBits = hw::getBitWidth(op.getType());
57 return op.emitError() <<
"symbolic value bit width unknown";
61 auto builder = OpBuilder::atBlockEnd(getOperation().getBody());
62 auto flatType = builder.getIntegerType(numBits);
63 auto &extmoduleOp = extmoduleOps[flatType];
67 builder.getStringAttr(Twine(
"circt.symbolic_value.") +
70 "circt_symbolic_value",
71 builder.getArrayAttr(ParamDeclAttr::get(
72 builder.getContext(), builder.getStringAttr(
"WIDTH"),
73 builder.getI32Type(), Attribute())));
74 symbolTable.insert(extmoduleOp);
79 builder.setInsertionPoint(op);
80 auto instOp = builder.create<InstanceOp>(
81 op.getLoc(), extmoduleOp, builder.getStringAttr(
"symbolic_value"),
83 builder.getArrayAttr(ParamDeclAttr::get(
84 builder.getContext(), builder.getStringAttr(
"WIDTH"),
85 builder.getI32Type(), builder.getI32IntegerAttr(numBits))));
86 Value value = instOp.getResult(0);
89 if (op.getType() != value.getType())
90 value = builder.create<
BitcastOp>(op.getLoc(), op.getType(), value);
93 op.replaceAllUsesWith(value);
97 return failure(result.wasInterrupted());
101void LowerSymbolicValuesPass::lowerToAnySeqWire() {
102 getOperation().walk([&](SymbolicValueOp op) {
105 OpBuilder builder(op);
106 auto wireOp = builder.create<
sv::WireOp>(op.getLoc(), op.getType());
107 sv::addSVAttributes(wireOp,
108 sv::SVAttributeAttr::get(&getContext(),
"anyseq"));
112 op.replaceAllUsesWith(value);
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
This holds the name, type, direction of a module's ports.