| 2588 | } |
| 2589 | |
| 2590 | std::pair<std::vector<UHDM::module_array*>, std::vector<UHDM::ref_module*>> |
| 2591 | CompileHelper::compileInstantiation(ModuleDefinition* mod, |
| 2592 | const FileContent* fC, |
| 2593 | CompileDesign* compileDesign, NodeId id, |
| 2594 | ValuedComponentI* instance) { |
| 2595 | std::pair<std::vector<UHDM::module_array*>, std::vector<UHDM::ref_module*>> |
| 2596 | results; |
| 2597 | UHDM::Serializer& s = compileDesign->getSerializer(); |
| 2598 | NodeId moduleName = fC->sl_collect(id, VObjectType::slStringConst); |
| 2599 | const std::string_view libName = fC->getLibrary()->getName(); |
| 2600 | const std::string_view mname = fC->SymName(moduleName); |
| 2601 | std::string modName = StrCat(libName, "@", mname); |
| 2602 | |
| 2603 | NodeId typespecId = fC->Child(id); |
| 2604 | NodeId hierInstId = fC->sl_collect(id, VObjectType::paHierarchical_instance); |
| 2605 | while (hierInstId) { |
| 2606 | NodeId instId = fC->sl_collect(hierInstId, VObjectType::paName_of_instance); |
| 2607 | NodeId identifierId; |
| 2608 | std::string instName; |
| 2609 | if (instId) { |
| 2610 | identifierId = fC->Child(instId); |
| 2611 | instName = fC->SymName(identifierId); |
| 2612 | } |
| 2613 | |
| 2614 | NodeId unpackedDimId = fC->Sibling(identifierId); |
| 2615 | if (unpackedDimId) { |
| 2616 | int32_t unpackedSize = 0; |
| 2617 | if (std::vector<UHDM::range*>* unpackedDimensions = |
| 2618 | compileRanges(mod, fC, unpackedDimId, compileDesign, Reduce::No, |
| 2619 | nullptr, instance, unpackedSize, false)) { |
| 2620 | UHDM::module_array* mod_array = s.MakeModule_array(); |
| 2621 | mod_array->Ranges(unpackedDimensions); |
| 2622 | mod_array->VpiName(instName); |
| 2623 | mod_array->VpiFullName(modName); |
| 2624 | fC->populateCoreMembers(identifierId, identifierId, mod_array); |
| 2625 | for (auto r : *unpackedDimensions) r->VpiParent(mod_array); |
| 2626 | |
| 2627 | module_typespec* tps = s.MakeModule_typespec(); |
| 2628 | tps->VpiName(fC->SymName(typespecId)); |
| 2629 | fC->populateCoreMembers(typespecId, typespecId, tps); |
| 2630 | if (mod_array->Elem_typespec() == nullptr) { |
| 2631 | ref_typespec* tpsRef = s.MakeRef_typespec(); |
| 2632 | tpsRef->VpiParent(mod_array); |
| 2633 | mod_array->Elem_typespec(tpsRef); |
| 2634 | } |
| 2635 | mod_array->Elem_typespec()->Actual_typespec(tps); |
| 2636 | tps->VpiParent(mod_array); |
| 2637 | VectorOfport* ports = s.MakePortVec(); |
| 2638 | mod_array->Ports(ports); |
| 2639 | compileHighConn(mod, fC, compileDesign, instId, ports); |
| 2640 | for (auto p : *ports) p->VpiParent(mod_array); |
| 2641 | results.first.push_back(mod_array); |
| 2642 | } |
| 2643 | } else { |
| 2644 | // Simple instance |
| 2645 | UHDM::ref_module* m = s.MakeRef_module(); |
| 2646 | m->VpiName(instName); |
| 2647 | m->VpiDefName(modName); |
no test coverage detected