| 50 | } |
| 51 | } |
| 52 | void VerModuleParser::visitModule_declaration( |
| 53 | sv2017Parser::Module_declarationContext *ctx, |
| 54 | vector<unique_ptr<iHdlObj>> &res) { |
| 55 | // module_declaration: |
| 56 | // KW_EXTERN module_header_common ( list_of_port_declarations )? SEMI |
| 57 | // | module_header_common (list_of_port_declarations | (LPAREN DOT MUL RPAREN) )? SEMI |
| 58 | // ( timeunits_declaration )? ( module_item )* |
| 59 | // KW_ENDMODULE ( COLON identifier | {_input->LA(1) != COLON}? ) |
| 60 | // ; |
| 61 | auto mhc = ctx->module_header_common(); |
| 62 | auto ent = create_object<HdlModuleDec>(ctx); |
| 63 | |
| 64 | ModuleCtx m_ctx(*ent); |
| 65 | visitModule_header_common(mhc, *ent); |
| 66 | |
| 67 | auto lpd = ctx->list_of_port_declarations(); |
| 68 | if (lpd) { |
| 69 | VerPortParser pp(this, m_ctx.non_ANSI_port_groups); |
| 70 | auto ps = pp.visitList_of_port_declarations(lpd); |
| 71 | for (auto &p : *ps) { |
| 72 | ent->ports.push_back(move(p)); |
| 73 | } |
| 74 | } else { |
| 75 | if (ctx->MUL()) { |
| 76 | auto p = create_object<HdlIdDef>(ctx, ".*", HdlValueSymbol::all(), |
| 77 | nullptr); |
| 78 | ent->ports.push_back(move(p)); |
| 79 | } |
| 80 | } |
| 81 | if (ctx->KW_EXTERN()) { |
| 82 | for (auto &o : m_ctx.ent.generics) { |
| 83 | if (!o->type) { |
| 84 | o->type = HdlValueSymbol::type_auto(); |
| 85 | } |
| 86 | } |
| 87 | for (auto &o : m_ctx.ent.ports) { |
| 88 | if (!o->type) { |
| 89 | o->type = HdlValueSymbol::type_auto(); |
| 90 | } |
| 91 | } |
| 92 | res.push_back(move(ent)); |
| 93 | return; |
| 94 | } |
| 95 | |
| 96 | auto arch = create_object<HdlModuleDef>(ctx); |
| 97 | m_ctx.arch = arch.get(); |
| 98 | auto tid = ctx->timeunits_declaration(); |
| 99 | if (tid) { |
| 100 | NotImplementedLogger::print( |
| 101 | "ModuleParser.visitModule_declaration.timeunits_declaration", |
| 102 | tid); |
| 103 | } |
| 104 | for (auto mi : ctx->module_item()) |
| 105 | visitModule_item(mi, arch->objs, m_ctx); |
| 106 | |
| 107 | arch->module_name = make_unique<HdlValueId>(m_ctx.ent.name); |
| 108 | arch->dec = move(ent); |
| 109 |
no test coverage detected