[HW] rename the parameter attributes to be more consistent.

The declaration of a parameter is now a ParamDeclAttr.  A reference
expression to it is a ParamDeclRefAttr, verbatim expres are
ParamVerbatimAttr.
This commit is contained in:
Chris Lattner 2021-09-21 17:12:05 -07:00
parent f5526f992a
commit 2821d08959
16 changed files with 84 additions and 84 deletions

View File

@ -22,7 +22,7 @@ def OutputFileAttr : StructAttr<"OutputFileAttr", HWDialect, [
/// An attribute describing a module parameter, or instance parameter
/// specification.
def ParameterAttr : AttrDef<HWDialect, "Parameter"> {
def ParamDeclAttr : AttrDef<HWDialect, "ParamDecl"> {
let summary = "module or instance parameter definition";
/// The value of the attribute - in a module, this is the default
@ -33,7 +33,7 @@ def ParameterAttr : AttrDef<HWDialect, "Parameter"> {
let parameters = (ins "::mlir::StringAttr":$name,
"::mlir::TypeAttr":$type,
"::mlir::Attribute":$value);
let mnemonic = "parameter";
let mnemonic = "param.decl";
let builders = [
AttrBuilderWithInferredContext<(ins "::mlir::StringAttr":$name,
@ -54,35 +54,35 @@ def ParameterAttr : AttrDef<HWDialect, "Parameter"> {
];
let extraClassDeclaration = [{
static ParameterAttr getWithName(ParameterAttr param,
static ParamDeclAttr getWithName(ParamDeclAttr param,
::mlir::StringAttr name) {
return get(param.getContext(), name, param.getType(), param.getValue());
}
}];
}
/// An array of ParameterAttr's that may or may not have a 'value' specified,
/// An array of ParamDeclAttr's that may or may not have a 'value' specified,
/// to be used on hw.module or hw.instance. The hw.instance verifier further
/// ensures that all the values are specified.
def ParameterArrayAttr
: TypedArrayAttrBase<ParameterAttr, "parameter array attribute">;
def ParamDeclArrayAttr
: TypedArrayAttrBase<ParamDeclAttr, "parameter array attribute">;
/// This attribute models a reference to a named parameter within a module body.
/// The type of the ParameterRef must always be the same as the type of the
/// The type of the ParamDeclRefAttr must always be the same as the type of the
/// parameter being referenced.
def ParameterRefAttr : AttrDef<HWDialect, "ParameterRef"> {
def ParamDeclRefAttr : AttrDef<HWDialect, "ParamDeclRef"> {
let summary = "Is a reference to a parameter value.";
let parameters = (ins "::mlir::StringAttr":$name,
AttributeSelfTypeParameter<"">:$type);
let mnemonic = "parameter.ref";
let mnemonic = "param.decl.ref";
}
def VerbatimParameterValueAttr : AttrDef<HWDialect, "VerbatimParameterValue"> {
def ParamVerbatimAttr : AttrDef<HWDialect, "ParamVerbatim"> {
let summary =
"Represents text to emit directly to SystemVerilog for a parameter";
let parameters = (ins "::mlir::StringAttr":$value,
AttributeSelfTypeParameter<"">:$type);
let mnemonic = "verbatim.parameter.value";
let mnemonic = "param.verbatim";
}
def WUW_Undefined : I32EnumAttrCase<"Undefined", 0>;

View File

@ -29,7 +29,7 @@ def HWModuleOp : HWOp<"module",
connections within the module.
}];
let arguments = (ins StrArrayAttr:$argNames, StrArrayAttr:$resultNames,
ParameterArrayAttr:$parameters);
ParamDeclArrayAttr:$parameters);
let results = (outs);
let regions = (region SizedRegion<1>:$body);
@ -116,7 +116,7 @@ def HWModuleExternOp : HWOp<"module.extern",
parameterized types instead of just concrete types.
}];
let arguments = (ins StrArrayAttr:$argNames, StrArrayAttr:$resultNames,
ParameterArrayAttr:$parameters,
ParamDeclArrayAttr:$parameters,
OptionalAttr<StrAttr>:$verilogName);
let results = (outs);
let regions = (region AnyRegion:$body);
@ -231,7 +231,7 @@ def HWModuleGeneratedOp : HWOp<"module.generated",
}];
let arguments = (ins FlatSymbolRefAttr:$generatorKind,
StrArrayAttr:$argNames, StrArrayAttr:$resultNames,
ParameterArrayAttr:$parameters,
ParamDeclArrayAttr:$parameters,
OptionalAttr<StrAttr>:$verilogName);
let results = (outs);
let regions = (region AnyRegion:$body);
@ -326,7 +326,7 @@ def InstanceOp : HWOp<"instance", [HasParent<"HWModuleOp">, Symbol,
Confined<FlatSymbolRefAttr, [isModuleSymbol]>:$moduleName,
Variadic<AnyType>:$inputs,
StrArrayAttr:$argNames, StrArrayAttr:$resultNames,
ParameterArrayAttr:$parameters,
ParamDeclArrayAttr:$parameters,
OptionalAttr<SymbolNameAttr>:$sym_name);
let results = (outs Variadic<AnyType>);

View File

@ -21,7 +21,7 @@
namespace circt {
namespace hw {
class ParameterAttr;
class ParamDeclAttr;
class TypedeclOp;
namespace detail {
/// Struct defining a field. Used in structs and unions.

View File

@ -811,7 +811,7 @@ static ArrayAttr getHWParameters(FExtModuleOp module, bool ignoreValues) {
auto type = TypeAttr::get(entry.second.getType());
auto value = ignoreValues ? Attribute() : entry.second;
auto paramAttr =
hw::ParameterAttr::get(builder.getContext(), name, type, value);
hw::ParamDeclAttr::get(builder.getContext(), name, type, value);
newParams.push_back(paramAttr);
}
return builder.getArrayAttr(newParams);

View File

@ -176,7 +176,7 @@ StringAttr ESIHWBuilder::constructInterfaceName(ChannelPort port) {
ArrayAttr ESIHWBuilder::getStageParameterList(Attribute value) {
auto type = IntegerType::get(width.getContext(), 32, IntegerType::Unsigned);
auto widthParam =
ParameterAttr::get(width.getContext(), width, TypeAttr::get(type), value);
ParamDeclAttr::get(width.getContext(), width, TypeAttr::get(type), value);
return ArrayAttr::get(width.getContext(), widthParam);
}
@ -232,13 +232,13 @@ HWModuleExternOp ESIHWBuilder::declareCosimEndpoint(Operation *symTable,
{dataInReady, PortDirection::OUTPUT, getI1Type(), 2},
{dataIn, PortDirection::INPUT, sendType, 4}};
SmallVector<Attribute, 8> params;
params.push_back(ParameterAttr::get("ENDPOINT_ID", getI32Type()));
params.push_back(ParamDeclAttr::get("ENDPOINT_ID", getI32Type()));
params.push_back(
ParameterAttr::get("SEND_TYPE_ID", getIntegerType(64, false)));
params.push_back(ParameterAttr::get("SEND_TYPE_SIZE_BITS", getI32Type()));
ParamDeclAttr::get("SEND_TYPE_ID", getIntegerType(64, false)));
params.push_back(ParamDeclAttr::get("SEND_TYPE_SIZE_BITS", getI32Type()));
params.push_back(
ParameterAttr::get("RECV_TYPE_ID", getIntegerType(64, false)));
params.push_back(ParameterAttr::get("RECV_TYPE_SIZE_BITS", getI32Type()));
ParamDeclAttr::get("RECV_TYPE_ID", getIntegerType(64, false)));
params.push_back(ParamDeclAttr::get("RECV_TYPE_SIZE_BITS", getI32Type()));
endpoint = create<HWModuleExternOp>(
constructUniqueSymbol(symTable, "Cosim_Endpoint"), ports,
"Cosim_Endpoint", ArrayAttr::get(getContext(), params));
@ -1122,19 +1122,19 @@ CosimLowering::matchAndRewrite(CosimEndpoint ep, ArrayRef<Value> operands,
// Set all the parameters.
SmallVector<Attribute, 8> params;
params.push_back(ParameterAttr::get(
params.push_back(ParamDeclAttr::get(
"ENDPOINT_ID", rewriter.getI32IntegerAttr(ep.endpointID())));
params.push_back(ParameterAttr::get(
params.push_back(ParamDeclAttr::get(
"SEND_TYPE_ID",
IntegerAttr::get(ui64Type, sendTypeSchema.capnpTypeID())));
params.push_back(
ParameterAttr::get("SEND_TYPE_SIZE_BITS",
ParamDeclAttr::get("SEND_TYPE_SIZE_BITS",
rewriter.getI32IntegerAttr(sendTypeSchema.size())));
params.push_back(ParameterAttr::get(
params.push_back(ParamDeclAttr::get(
"RECV_TYPE_ID",
IntegerAttr::get(ui64Type, recvTypeSchema.capnpTypeID())));
params.push_back(
ParameterAttr::get("RECV_TYPE_SIZE_BITS",
ParamDeclAttr::get("RECV_TYPE_SIZE_BITS",
rewriter.getI32IntegerAttr(recvTypeSchema.size())));
// Set up the egest route to drive the EP's send ports.

View File

@ -49,50 +49,50 @@ void HWDialect::printAttribute(Attribute attr, DialectAsmPrinter &p) const {
}
//===----------------------------------------------------------------------===//
// ParameterAttr
// ParamDeclAttr
//===----------------------------------------------------------------------===//
Attribute ParameterAttr::parse(MLIRContext *context, DialectAsmParser &p,
Attribute ParamDeclAttr::parse(MLIRContext *context, DialectAsmParser &p,
Type type) {
llvm::errs() << "Should never parse raw\n";
abort();
}
void ParameterAttr::print(DialectAsmPrinter &p) const {
void ParamDeclAttr::print(DialectAsmPrinter &p) const {
llvm::errs() << "Should never print raw\n";
abort();
}
//===----------------------------------------------------------------------===//
// ParameterRefAttr
// ParamDeclRefAttr
//===----------------------------------------------------------------------===//
Attribute ParameterRefAttr::parse(MLIRContext *context, DialectAsmParser &p,
Attribute ParamDeclRefAttr::parse(MLIRContext *context, DialectAsmParser &p,
Type type) {
StringAttr name;
if (p.parseLess() || p.parseAttribute(name) || p.parseGreater())
return Attribute();
return ParameterRefAttr::get(context, name, type);
return ParamDeclRefAttr::get(context, name, type);
}
void ParameterRefAttr::print(DialectAsmPrinter &p) const {
p << "parameter.ref<" << getName() << ">";
void ParamDeclRefAttr::print(DialectAsmPrinter &p) const {
p << "param.decl.ref<" << getName() << ">";
}
//===----------------------------------------------------------------------===//
// VerbatimParameterValueAttr
// ParamVerbatimAttr
//===----------------------------------------------------------------------===//
Attribute VerbatimParameterValueAttr::parse(MLIRContext *context,
DialectAsmParser &p, Type type) {
Attribute ParamVerbatimAttr::parse(MLIRContext *context, DialectAsmParser &p,
Type type) {
StringAttr text;
if (p.parseLess() || p.parseAttribute(text) || p.parseGreater())
return Attribute();
return VerbatimParameterValueAttr::get(context, text, type);
return ParamVerbatimAttr::get(context, text, type);
}
void VerbatimParameterValueAttr::print(DialectAsmPrinter &p) const {
p << "verbatim.parameter.value<" << getValue() << ">";
void ParamVerbatimAttr::print(DialectAsmPrinter &p) const {
p << "param.verbatim<" << getValue() << ">";
}

View File

@ -90,12 +90,12 @@ LogicalResult hw::checkParameterInContext(Attribute value, Operation *module,
// Literals are always ok. Their types are already known to match
// expectations.
if (value.isa<IntegerAttr>() || value.isa<FloatAttr>() ||
value.isa<StringAttr>() || value.isa<VerbatimParameterValueAttr>())
value.isa<StringAttr>() || value.isa<ParamVerbatimAttr>())
return success();
// Parameter references need more analysis to make sure they are valid within
// this module.
if (auto parameterRef = value.dyn_cast<ParameterRefAttr>()) {
if (auto parameterRef = value.dyn_cast<ParamDeclRefAttr>()) {
auto nameAttr = parameterRef.getName();
// Don't allow references to parameters from the default values of a
@ -108,7 +108,7 @@ LogicalResult hw::checkParameterInContext(Attribute value, Operation *module,
// Find the corresponding attribute in the module.
for (auto param : module->getAttrOfType<ArrayAttr>("parameters")) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
if (paramAttr.getName() != nameAttr)
continue;
@ -498,7 +498,7 @@ static ParseResult parseOptionalParameters(OpAsmParser &parser,
}
auto &builder = parser.getBuilder();
parameters.push_back(ParameterAttr::get(builder.getContext(), name,
parameters.push_back(ParamDeclAttr::get(builder.getContext(), name,
TypeAttr::get(type), value));
return success();
});
@ -616,7 +616,7 @@ static void printParameterList(ArrayAttr parameters, OpAsmPrinter &p) {
p << '<';
llvm::interleaveComma(parameters, p, [&](Attribute param) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
p << paramAttr.getName().getValue() << ": " << paramAttr.getType();
if (auto value = paramAttr.getValue()) {
p << " = ";
@ -692,7 +692,7 @@ static LogicalResult verifyModuleCommon(Operation *module) {
// Check parameter default values are sensible.
for (auto param : module->getAttrOfType<ArrayAttr>("parameters")) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
// Default values are allowed to be missing.
auto value = paramAttr.getValue();
@ -892,8 +892,8 @@ LogicalResult InstanceOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
});
for (size_t i = 0; i != numParameters; ++i) {
auto param = parameters[i].cast<ParameterAttr>();
auto modParam = modParameters[i].cast<ParameterAttr>();
auto param = parameters[i].cast<ParamDeclAttr>();
auto modParam = modParameters[i].cast<ParamDeclAttr>();
auto paramName = param.getName();
if (paramName != modParam.getName())
@ -921,7 +921,7 @@ LogicalResult InstanceOp::verifyCustom() {
// Check that all the parameter values specified to the instance are
// structurally valid.
for (auto param : parameters()) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
auto value = paramAttr.getValue();
assert(value && "SymbolUses verifier should already check this exists");

View File

@ -186,13 +186,13 @@ bool HWLegalizeNamesPass::legalizePortNames(
SmallVector<Attribute> parameters;
bool changedParameters = false;
for (auto param : module.parameters()) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
auto newName = nameResolver.getLegalName(paramAttr.getName());
if (newName.empty())
parameters.push_back(param);
else {
auto newNameAttr = StringAttr::get(paramAttr.getContext(), newName);
parameters.push_back(ParameterAttr::getWithName(paramAttr, newNameAttr));
parameters.push_back(ParamDeclAttr::getWithName(paramAttr, newNameAttr));
changedParameters = true;
renamedParameterInfo[std::make_pair(module, paramAttr.getName())] =
newNameAttr;
@ -217,13 +217,13 @@ remapRenamedParameters(Attribute value, HWModuleOp module,
const RenamedParameterMapTy &renamedParameterInfo) {
// Literals are always fine and never change.
if (value.isa<IntegerAttr>() || value.isa<FloatAttr>() ||
value.isa<StringAttr>() || value.isa<VerbatimParameterValueAttr>())
value.isa<StringAttr>() || value.isa<ParamVerbatimAttr>())
return value;
// TODO: Handle nested expressions when we support them.
// Otherwise this must be a parameter reference.
auto parameterRef = value.dyn_cast<ParameterRefAttr>();
auto parameterRef = value.dyn_cast<ParamDeclRefAttr>();
assert(parameterRef && "Unknown kind of parameter expression");
// If this parameter is un-renamed, then leave it alone.
@ -233,7 +233,7 @@ remapRenamedParameters(Attribute value, HWModuleOp module,
return value;
// Okay, it was renamed, return the new name with the right type.
return ParameterRefAttr::get(value.getContext(),
return ParamDeclRefAttr::get(value.getContext(),
it->second.cast<StringAttr>(), value.getType());
}
@ -248,13 +248,13 @@ static void updateInstanceForChangedModule(InstanceOp inst, HWModuleOp module) {
auto instParameters = inst.parameters();
auto modParameters = module.parameters();
for (size_t i = 0, e = instParameters.size(); i != e; ++i) {
auto instParam = instParameters[i].cast<ParameterAttr>();
auto modParam = modParameters[i].cast<ParameterAttr>();
auto instParam = instParameters[i].cast<ParamDeclAttr>();
auto modParam = modParameters[i].cast<ParamDeclAttr>();
if (instParam.getName() == modParam.getName())
newAttrs.push_back(instParam);
else
newAttrs.push_back(
ParameterAttr::getWithName(instParam, modParam.getName()));
ParamDeclAttr::getWithName(instParam, modParam.getName()));
}
inst.parametersAttr(ArrayAttr::get(inst.getContext(), newAttrs));
}
@ -262,7 +262,7 @@ static void updateInstanceForChangedModule(InstanceOp inst, HWModuleOp module) {
/// Rename any parameter values being specified for an instance if they are
/// referring to parameters that got renamed.
static void
updateInstanceParameterRefs(InstanceOp instance,
updateInstanceParamDeclRefs(InstanceOp instance,
RenamedParameterMapTy &renamedParameterInfo) {
auto parameters = instance.parameters();
if (parameters.empty())
@ -274,7 +274,7 @@ updateInstanceParameterRefs(InstanceOp instance,
newParams.reserve(parameters.size());
bool anyRenamed = false;
for (Attribute param : parameters) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
auto newValue = remapRenamedParameters(paramAttr.getValue(), curModule,
renamedParameterInfo);
if (newValue == paramAttr.getValue()) {
@ -282,7 +282,7 @@ updateInstanceParameterRefs(InstanceOp instance,
continue;
}
anyRenamed = true;
newParams.push_back(ParameterAttr::get(paramAttr.getName(), newValue));
newParams.push_back(ParamDeclAttr::get(paramAttr.getName(), newValue));
}
instance.parametersAttr(ArrayAttr::get(instance.getContext(), newParams));
@ -309,7 +309,7 @@ rewriteModuleBody(Block &block, NameCollisionResolver &nameResolver,
updateInstanceForChangedModule(instanceOp, it->second);
if (moduleHasRenamedInterface)
updateInstanceParameterRefs(instanceOp, renamedParameterInfo);
updateInstanceParamDeclRefs(instanceOp, renamedParameterInfo);
continue;
}

View File

@ -79,10 +79,9 @@ static void printParamValue(Attribute value, Operation *op, StringRef paramName,
} else if (auto fpAttr = value.dyn_cast<FloatAttr>()) {
// TODO: relying on float printing to be precise is not a good idea.
os << fpAttr.getValueAsDouble();
} else if (auto verbatimParam =
value.dyn_cast<VerbatimParameterValueAttr>()) {
} else if (auto verbatimParam = value.dyn_cast<ParamVerbatimAttr>()) {
os << verbatimParam.getValue().getValue();
} else if (auto parameterRef = value.dyn_cast<ParameterRefAttr>()) {
} else if (auto parameterRef = value.dyn_cast<ParamDeclRefAttr>()) {
os << parameterRef.getName().getValue();
} else {
os << "<<UNKNOWN MLIRATTR: " << value << ">>";
@ -2564,8 +2563,8 @@ LogicalResult StmtEmitter::visitStmt(InstanceOp op) {
for (auto params :
llvm::zip(op.parameters(),
moduleOp->getAttrOfType<ArrayAttr>("parameters"))) {
auto param = std::get<0>(params).cast<ParameterAttr>();
auto modParam = std::get<1>(params).cast<ParameterAttr>();
auto param = std::get<0>(params).cast<ParamDeclAttr>();
auto modParam = std::get<1>(params).cast<ParamDeclAttr>();
// Ignore values that line up with their default.
if (param.getValue() == modParam.getValue())
continue;
@ -3110,7 +3109,7 @@ void ModuleEmitter::emitHWModule(HWModuleOp module) {
for (auto param : module.parameters()) {
// Add the name to the name table so any conflicting wires are renamed.
names.addLegalName(
nullptr, param.cast<ParameterAttr>().getName().getValue(), module);
nullptr, param.cast<ParamDeclAttr>().getName().getValue(), module);
}
// Rewrite the module body into compliance with our emission expectations, and
@ -3149,7 +3148,7 @@ void ModuleEmitter::emitHWModule(HWModuleOp module) {
for (auto param : module.parameters()) {
// Measure the type length by printing it to a temporary string.
scratch.clear();
printParamType(param.cast<ParameterAttr>().getType().getValue(), scratch);
printParamType(param.cast<ParamDeclAttr>().getType().getValue(), scratch);
maxTypeWidth = std::max(scratch.size(), maxTypeWidth);
}
@ -3159,7 +3158,7 @@ void ModuleEmitter::emitHWModule(HWModuleOp module) {
llvm::interleave(
module.parameters(), os,
[&](Attribute param) {
auto paramAttr = param.cast<ParameterAttr>();
auto paramAttr = param.cast<ParamDeclAttr>();
os << "parameter ";
scratch.clear();
printParamType(paramAttr.getType().getValue(), scratch);

View File

@ -1,4 +1,5 @@
// RUN: circt-opt %s -verify-diagnostics | circt-opt -verify-diagnostics | FileCheck %s
// REQUIRES: verilator
// CHECK-LABEL: hw.module @test1(%arg0: i3, %arg1: i1, %arg2: !hw.array<1000xi8>) -> (result: i50) {
hw.module @test1(%arg0: i3, %arg1: i1, %arg2: !hw.array<1000xi8>) -> (result: i50) {

View File

@ -248,7 +248,7 @@ hw.module.extern @p<p: i42>() -> ()
// expected-note @+1 {{module declared here}}
hw.module @Use() {
// expected-error @+1 {{op use of unknown parameter "FOO"}}
hw.instance "inst1" @p<p: i42 = #hw.parameter.ref<"FOO">>() -> ()
hw.instance "inst1" @p<p: i42 = #hw.param.decl.ref<"FOO">>() -> ()
}
// -----
@ -259,7 +259,7 @@ hw.module.extern @p<p: i42>() -> ()
// expected-note @+1 {{module declared here}}
hw.module @Use<xx: i41>() {
// expected-error @+1 {{op parameter "xx" used with type 'i42'; should have type 'i41'}}
hw.instance "inst1" @p<p: i42 = #hw.parameter.ref<"xx">>() -> ()
hw.instance "inst1" @p<p: i42 = #hw.param.decl.ref<"xx">>() -> ()
}
@ -267,5 +267,5 @@ hw.module @Use<xx: i41>() {
// Check attribute validity for module parameters.
// expected-error @+1 {{op parameter "p" cannot be used as a default value for a parameter}}
hw.module.extern @p<p: i42 = #hw.parameter.ref<"p">>() -> ()
hw.module.extern @p<p: i42 = #hw.param.decl.ref<"p">>() -> ()

View File

@ -82,7 +82,7 @@ hw.module.extern @NoArg<param: i42>()
// CHECK-LABEL: hw.module @UseParameters<p1: i42>() {
hw.module @UseParameters<p1: i42>() {
// CHECK: hw.instance "verbatimparam" @NoArg<param: i42 = #hw.verbatim.parameter.value<"\22FOO\22">>() -> ()
hw.instance "verbatimparam" @NoArg<param: i42 = #hw.verbatim.parameter.value<"\"FOO\"">>() -> ()
// CHECK: hw.instance "verbatimparam" @NoArg<param: i42 = #hw.param.verbatim<"\22FOO\22">>() -> ()
hw.instance "verbatimparam" @NoArg<param: i42 = #hw.param.verbatim<"\"FOO\"">>() -> ()
hw.output
}

View File

@ -114,14 +114,14 @@ hw.module @parameters<p1: i42 = 17, wire: i1>(%p1: i8) {
// CHECK: sv.ifdef "SOMEMACRO"
sv.ifdef "SOMEMACRO" {
// CHECK: %local = sv.localparam : i1 {value = #hw.parameter.ref<"wire_1">}
%local = sv.localparam : i1 { value = #hw.parameter.ref<"wire">: i1 }
// CHECK: %local = sv.localparam : i1 {value = #hw.param.decl.ref<"wire_1">}
%local = sv.localparam : i1 { value = #hw.param.decl.ref<"wire">: i1 }
}
// "wire" param getting updated should update in this instance.
// CHECK: hw.instance "inst" @module_with_bool<bparam: i1 = #hw.parameter.ref<"wire_1">>
hw.instance "inst" @module_with_bool<bparam: i1 = #hw.parameter.ref<"wire">>() -> ()
// CHECK: hw.instance "inst" @module_with_bool<bparam: i1 = #hw.param.decl.ref<"wire_1">>
hw.instance "inst" @module_with_bool<bparam: i1 = #hw.param.decl.ref<"wire">>() -> ()
}
// CHECK-LABEL: hw.module @use_parameters

View File

@ -867,7 +867,7 @@ hw.module @UseParameterValue<xx: i42>(%arg0: i8) -> (out: i8) {
// CHECK: parameters2 #(
// CHECK-NEXT: .p1(xx)
// CHECK-NEXT: ) inst1 (
%a = hw.instance "inst1" @parameters2<p1: i42 = #hw.parameter.ref<"xx">, p2: i1 = 0>(arg0: %arg0: i8) -> (out: i8)
%a = hw.instance "inst1" @parameters2<p1: i42 = #hw.param.decl.ref<"xx">, p2: i1 = 0>(arg0: %arg0: i8) -> (out: i8)
hw.output %a : i8
}

View File

@ -11,7 +11,7 @@ hw.module @M1<param1: i42>(%clock : i1, %cond : i1, %val : i8) {
%param_x = sv.localparam : i42 { value = 11: i42 }
// CHECK: localparam [41:0] param_y = param1;
%param_y = sv.localparam : i42 { value = #hw.parameter.ref<"param1">: i42 }
%param_y = sv.localparam : i42 { value = #hw.param.decl.ref<"param1">: i42 }
// CHECK: always @(posedge clock) begin
sv.always posedge %clock {

View File

@ -301,11 +301,11 @@ hw.module @ExternMods(%a_in: i8) {
// CHECK: AParameterizedExtModule #(
// CHECK: .CFG(FOO)
// CHECK: ) xyz2
hw.instance "xyz2" @AParameterizedExtModule<CFG: none = #hw.verbatim.parameter.value<"FOO">>(in: %a_in: i8) -> (out: i1)
hw.instance "xyz2" @AParameterizedExtModule<CFG: none = #hw.param.verbatim<"FOO">>(in: %a_in: i8) -> (out: i1)
// CHECK: AParameterizedExtModule #(
// CHECK: .CFG("STRING")
// CHECK: ) xyz3
hw.instance "xyz3" @AParameterizedExtModule<CFG: none = #hw.verbatim.parameter.value<"\"STRING\"">>(in: %a_in: i8) -> (out: i1)
hw.instance "xyz3" @AParameterizedExtModule<CFG: none = #hw.param.verbatim<"\"STRING\"">>(in: %a_in: i8) -> (out: i1)
}
hw.module.extern @MyParameterizedExtModule<DEFAULT: i64, DEPTH: f64, FORMAT: none,