mirror of https://github.com/llvm/circt.git
[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:
parent
f5526f992a
commit
2821d08959
|
@ -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>;
|
||||
|
|
|
@ -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>);
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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() << ">";
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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">>() -> ()
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue