MCPcopy Create free account
hub / github.com/chipsalliance/Surelog / compileInstantiation

Method compileInstantiation

src/DesignCompile/CompileHelper.cpp:2590–2658  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2588}
2589
2590std::pair<std::vector<UHDM::module_array*>, std::vector<UHDM::ref_module*>>
2591CompileHelper::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);

Callers 2

collectModuleObjects_Method · 0.80

Calls 8

StrCatFunction · 0.85
populateCoreMembersMethod · 0.80
sl_collectMethod · 0.45
getNameMethod · 0.45
getLibraryMethod · 0.45
SymNameMethod · 0.45
ChildMethod · 0.45
SiblingMethod · 0.45

Tested by

no test coverage detected