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];
 
   65      extmoduleOp = HWModuleExternOp::create(
 
   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 = InstanceOp::create(
 
   81        builder, op.getLoc(), extmoduleOp,
 
   82        builder.getStringAttr(
"symbolic_value"), ArrayRef<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())
 
   93    op.replaceAllUsesWith(value);
 
   97  return failure(result.wasInterrupted());
 
  101void LowerSymbolicValuesPass::lowerToAnySeqWire() {
 
  102  getOperation().walk([&](SymbolicValueOp op) {
 
  105    OpBuilder builder(op);
 
  107    sv::addSVAttributes(wireOp,
 
  108                        sv::SVAttributeAttr::get(&getContext(), 
"anyseq"));
 
  112    op.replaceAllUsesWith(value);
 
create(data_type, name=None, sym_name=None)
 
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
 
This holds the name, type, direction of a module's ports.