From e38fa006ba8063a2d11d3d9d2355bb073569e3db Mon Sep 17 00:00:00 2001 From: Andrew Young Date: Wed, 8 Sep 2021 10:04:28 -0700 Subject: [PATCH] [HW] Implement SymbolUserOpInterface for HW's IntanceOp (#1747) This speeds up verification by using a prebuilt symbol table to look up the referenced module instead of a linear walk of the IR. A similar change was recently made to the FIRRTL InstanceOp in 438ffeb0. --- include/circt/Dialect/HW/HWStructure.td | 3 +-- lib/Dialect/HW/HWOps.cpp | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/include/circt/Dialect/HW/HWStructure.td b/include/circt/Dialect/HW/HWStructure.td index 25e601caca..f4037e969c 100644 --- a/include/circt/Dialect/HW/HWStructure.td +++ b/include/circt/Dialect/HW/HWStructure.td @@ -278,6 +278,7 @@ def HWModuleGeneratedOp : HWOp<"module.generated", } def InstanceOp : HWOp<"instance", [HasParent<"HWModuleOp">, Symbol, + DeclareOpInterfaceMethods, DeclareOpInterfaceMethods]> { let summary = "Create an instance of a module"; let description = [{ @@ -326,8 +327,6 @@ def InstanceOp : HWOp<"instance", [HasParent<"HWModuleOp">, Symbol, $instanceName (`sym` $sym_name^)? $moduleName `(` $inputs `)` attr-dict `:` functional-type($inputs, results) }]; - - let verifier = "return ::verifyInstanceOp(*this);"; } def OutputOp : HWOp<"output", [Terminator, HasParent<"HWModuleOp">, diff --git a/lib/Dialect/HW/HWOps.cpp b/lib/Dialect/HW/HWOps.cpp index d127d4ba35..08ee77f2a1 100644 --- a/lib/Dialect/HW/HWOps.cpp +++ b/lib/Dialect/HW/HWOps.cpp @@ -725,18 +725,18 @@ static LogicalResult verifyInstanceOpTypes(InstanceOp op, return success(); } -static LogicalResult verifyInstanceOp(InstanceOp op) { - auto referencedModule = op.getReferencedModule(); +LogicalResult InstanceOp::verifySymbolUses(SymbolTableCollection &symbolTable) { + auto *referencedModule = + symbolTable.lookupNearestSymbolFrom(*this, moduleNameAttr()); if (referencedModule == nullptr) - return op.emitError("Cannot find module definition '") - << op.moduleName() << "'"; + return emitError("Cannot find module definition '") << moduleName() << "'"; - // If the referenced module is internal, check that input and result types are - // consistent with the referenced module. if (!isa(referencedModule)) return success(); - return verifyInstanceOpTypes(op, referencedModule); + // If the referenced module is internal, check that input and result types are + // consistent with the referenced module. + return verifyInstanceOpTypes(*this, referencedModule); } StringAttr InstanceOp::getResultName(size_t idx,