17 SymbolTableCollection &symbolTable,
18 mlir::FlatSymbolRefAttr moduleName) {
19 auto referencedModule =
20 symbolTable.lookupNearestSymbolFrom<FModuleLike>(instanceOp, moduleName);
21 if (!referencedModule) {
22 return instanceOp->emitOpError(
"invalid symbol reference");
26 if (isa<ClassOp /* ClassLike */>(referencedModule))
27 return instanceOp->emitOpError(
"must instantiate a module not a class")
28 .attachNote(referencedModule.getLoc())
29 <<
"class declared here";
32 auto emitNote = [&](InFlightDiagnostic &&diag) -> InFlightDiagnostic && {
33 diag.attachNote(referencedModule->getLoc())
34 <<
"original module declared here";
35 return std::move(diag);
40 size_t numResults = instanceOp->getNumResults();
41 size_t numExpected = referencedModule.getNumPorts();
42 if (numResults != numExpected) {
43 return emitNote(instanceOp->emitOpError()
44 <<
"has a wrong number of results; expected " << numExpected
45 <<
" but got " << numResults);
48 instanceOp->getAttrOfType<mlir::DenseBoolArrayAttr>(
"portDirections");
49 if (
static_cast<size_t>(portDirections.size()) != numExpected)
51 instanceOp->emitOpError(
"the number of port directions should be "
52 "equal to the number of results"));
54 auto portNames = instanceOp->getAttrOfType<ArrayAttr>(
"portNames");
55 if (portNames.size() != numExpected)
57 instanceOp->emitOpError(
"the number of port names should be "
58 "equal to the number of results"));
60 auto portAnnotations =
61 instanceOp->getAttrOfType<ArrayAttr>(
"portAnnotations");
62 if (portAnnotations.size() != numExpected)
64 instanceOp->emitOpError(
"the number of result annotations should be "
65 "equal to the number of results"));
67 auto domainInfo = instanceOp->getAttrOfType<ArrayAttr>(
"domainInfo");
68 if (domainInfo.size() != numExpected)
70 instanceOp->emitOpError()
71 <<
"has a wrong number of port domain info attributes; expected "
72 << numExpected <<
", got " << domainInfo.size());
75 if (portNames != referencedModule.getPortNamesAttr()) {
77 auto moduleNames = referencedModule.getPortNamesAttr();
79 if (portNames.size() != moduleNames.size()) {
80 return emitNote(instanceOp->emitOpError()
81 <<
"has a wrong number of directions; expected "
82 << moduleNames.size() <<
" but got " << portNames.size());
85 for (
size_t i = 0; i != numResults; ++i) {
86 if (portNames[i] != moduleNames[i]) {
87 return emitNote(instanceOp->emitOpError()
88 <<
"name for port " << i <<
" must be "
89 << moduleNames[i] <<
", but got " << portNames[i]);
92 llvm_unreachable(
"should have found something wrong");
96 for (
size_t i = 0; i != numResults; i++) {
97 auto resultType = instanceOp->getResult(i).getType();
98 auto expectedType = referencedModule.getPortType(i);
99 if (resultType != expectedType) {
100 return emitNote(instanceOp->emitOpError()
101 <<
"result type for " << portNames[i] <<
" must be "
102 << expectedType <<
", but got " << resultType);
107 if (portDirections != referencedModule.getPortDirectionsAttr()) {
109 auto moduleDirectionAttr = referencedModule.getPortDirectionsAttr();
111 auto expectedWidth = moduleDirectionAttr.size();
112 auto actualWidth = portDirections.size();
113 if (expectedWidth != actualWidth) {
114 return emitNote(instanceOp->emitOpError()
115 <<
"has a wrong number of directions; expected "
116 << expectedWidth <<
" but got " << actualWidth);
119 auto instanceDirs = portDirections;
120 for (
size_t i = 0; i != numResults; ++i) {
121 if (instanceDirs[i] != moduleDirectionAttr[i]) {
122 return emitNote(instanceOp->emitOpError()
123 <<
"direction for " << portNames[i] <<
" must be \""
129 llvm_unreachable(
"should have found something wrong");
133 for (
size_t i = 0; i < numResults; ++i) {
134 auto portDomainInfo = domainInfo[i];
135 auto modulePortDomainInfo = referencedModule.getDomainInfoAttrForPort(i);
136 if (portDomainInfo != modulePortDomainInfo)
137 return emitNote(instanceOp->emitOpError()
138 <<
"domain info for " << portNames[i] <<
" must be "
139 << modulePortDomainInfo <<
", but got "
144 auto instanceLayers = instanceOp->getAttrOfType<ArrayAttr>(
"layers");
145 auto moduleLayers = referencedModule.getLayersAttr();
146 if (instanceLayers != moduleLayers)
147 return emitNote(instanceOp->emitOpError()
148 <<
"layers must be " << moduleLayers <<
", but got "