diff --git a/parse.y b/parse.y index 50d5e62b0..34eedc316 100644 --- a/parse.y +++ b/parse.y @@ -1187,7 +1187,7 @@ data_declaration /* IEEE1800-2005: A.2.1.3 */ pform_makewire(@2, 0, str_strength, $3, NetNet::IMPLICIT_REG, data_type, $1); } | attribute_list_opt K_event event_variable_list ';' - { if ($3) pform_make_events($3, @2.text, @2.first_line); + { if ($3) pform_make_events(@2, $3); } | attribute_list_opt package_import_declaration ; @@ -2624,7 +2624,7 @@ block_item_decl } | K_event event_variable_list ';' - { if ($2) pform_make_events($2, @1.text, @1.first_line); + { if ($2) pform_make_events(@1, $2); } | parameter_declaration @@ -4421,8 +4421,7 @@ list_of_port_declarations | list_of_port_declarations ',' IDENTIFIER { Module::port_t*ptmp; perm_string name = lex_strings.make($3); - ptmp = pform_module_port_reference(name, @3.text, - @3.first_line); + ptmp = pform_module_port_reference(@3, name); std::vector*tmp = $1; tmp->push_back(ptmp); @@ -4453,7 +4452,7 @@ port_declaration perm_string name = lex_strings.make($5); data_type_t*use_type = $4; if ($6) use_type = new uarray_type_t(use_type, $6); - ptmp = pform_module_port_reference(name, @2.text, @2.first_line); + ptmp = pform_module_port_reference(@2, name); pform_module_define_port(@2, name, NetNet::PINPUT, $3, use_type, $1); port_declaration_context.port_type = NetNet::PINPUT; port_declaration_context.port_net_type = $3; @@ -4465,8 +4464,7 @@ port_declaration K_input K_wreal IDENTIFIER { Module::port_t*ptmp; perm_string name = lex_strings.make($4); - ptmp = pform_module_port_reference(name, @2.text, - @2.first_line); + ptmp = pform_module_port_reference(@2, name); real_type_t*real_type = new real_type_t(real_type_t::REAL); FILE_NAME(real_type, @3); pform_module_define_port(@2, name, NetNet::PINPUT, @@ -4482,7 +4480,7 @@ port_declaration Module::port_t*ptmp; perm_string name = lex_strings.make($5); data_type_t*use_type = $4; - ptmp = pform_module_port_reference(name, @2.text, @2.first_line); + ptmp = pform_module_port_reference(@2, name); ptmp->default_value = $7; pform_module_define_port(@2, name, NetNet::PINPUT, $3, use_type, $1); port_declaration_context.port_type = NetNet::PINPUT; @@ -4494,7 +4492,7 @@ port_declaration | attribute_list_opt K_inout net_type_opt data_type_or_implicit IDENTIFIER dimensions_opt { Module::port_t*ptmp; perm_string name = lex_strings.make($5); - ptmp = pform_module_port_reference(name, @2.text, @2.first_line); + ptmp = pform_module_port_reference(@2, name); pform_module_define_port(@2, name, NetNet::PINOUT, $3, $4, $1); port_declaration_context.port_type = NetNet::PINOUT; port_declaration_context.port_net_type = $3; @@ -4510,8 +4508,7 @@ port_declaration K_inout K_wreal IDENTIFIER { Module::port_t*ptmp; perm_string name = lex_strings.make($4); - ptmp = pform_module_port_reference(name, @2.text, - @2.first_line); + ptmp = pform_module_port_reference(@2, name); real_type_t*real_type = new real_type_t(real_type_t::REAL); FILE_NAME(real_type, @3); pform_module_define_port(@2, name, NetNet::PINOUT, @@ -4543,7 +4540,7 @@ port_declaration use_type = NetNet::IMPLICIT_REG; } } - ptmp = pform_module_port_reference(name, @2.text, @2.first_line); + ptmp = pform_module_port_reference(@2, name); pform_module_define_port(@2, name, NetNet::POUTPUT, use_type, use_dtype, $1); port_declaration_context.port_type = NetNet::POUTPUT; port_declaration_context.port_net_type = use_type; @@ -4555,8 +4552,7 @@ port_declaration K_output K_wreal IDENTIFIER { Module::port_t*ptmp; perm_string name = lex_strings.make($4); - ptmp = pform_module_port_reference(name, @2.text, - @2.first_line); + ptmp = pform_module_port_reference(@2, name); real_type_t*real_type = new real_type_t(real_type_t::REAL); FILE_NAME(real_type, @3); pform_module_define_port(@2, name, NetNet::POUTPUT, @@ -4574,7 +4570,7 @@ port_declaration if (use_type == NetNet::IMPLICIT) { use_type = NetNet::IMPLICIT_REG; } - ptmp = pform_module_port_reference(name, @2.text, @2.first_line); + ptmp = pform_module_port_reference(@2, name); pform_module_define_port(@2, name, NetNet::POUTPUT, use_type, $4, $1); port_declaration_context.port_type = NetNet::PINOUT; port_declaration_context.port_net_type = use_type; @@ -5122,7 +5118,7 @@ module_item cont_assign_list. */ | K_assign drive_strength_opt delay3_opt cont_assign_list ';' - { pform_make_pgassign_list($4, $3, $2, @1.text, @1.first_line); } + { pform_make_pgassign_list(@1, $4, $3, $2); } /* Always and initial items are behavioral processes. */ @@ -5786,7 +5782,7 @@ port_reference : IDENTIFIER { Module::port_t*ptmp; perm_string name = lex_strings.make($1); - ptmp = pform_module_port_reference(name, @1.text, @1.first_line); + ptmp = pform_module_port_reference(@1, name); delete[]$1; $$ = ptmp; } @@ -6608,7 +6604,6 @@ statement_item /* This is roughly statement_item in the LRM */ | lpvalue '=' K_repeat '(' expression ')' event_control expression ';' { PAssign*tmp = new PAssign($1,$5,$7,$8); FILE_NAME(tmp,@1); - tmp->set_lineno(@1.first_line); $$ = tmp; } | lpvalue K_LE event_control expression ';' @@ -7082,9 +7077,7 @@ udp_primitive K_endprimitive label_opt { perm_string tmp2 = lex_strings.make($2); - pform_make_udp(tmp2, $4, $7, $9, $8, - @2.text, @2.first_line); - + pform_make_udp(@2, tmp2, $4, $7, $9, $8); check_end_label(@11, "primitive", $2, $11); delete[]$2; } @@ -7100,9 +7093,7 @@ udp_primitive { perm_string tmp2 = lex_strings.make($2); perm_string tmp6 = lex_strings.make($6); - pform_make_udp(tmp2, $5, tmp6, $7, $9, $12, - @2.text, @2.first_line); - + pform_make_udp(@2, tmp2, $5, tmp6, $7, $9, $12); check_end_label(@14, "primitive", $2, $14); delete[]$2; delete[]$6; diff --git a/pform.cc b/pform.cc index 08dbb8a70..374040291 100644 --- a/pform.cc +++ b/pform.cc @@ -1415,13 +1415,12 @@ void pform_end_parameter_port_list() * reference. This is a name without a .X(...), so the internal name * should be generated to be the same as the X. */ -Module::port_t* pform_module_port_reference(perm_string name, - const char*file, - unsigned lineno) +Module::port_t* pform_module_port_reference(const struct vlltype&loc, + perm_string name) { Module::port_t*ptmp = new Module::port_t; PEIdent*tmp = new PEIdent(name); - FILE_NAME(tmp, file, lineno); + FILE_NAME(tmp, loc); ptmp->name = name; ptmp->expr.push_back(tmp); ptmp->default_value = 0; @@ -1836,7 +1835,7 @@ template <> inline svector::svector(unsigned size) } static void process_udp_table(PUdp*udp, list*table, - const char*file, unsigned lineno) + const struct vlltype&loc) { const bool synchronous_flag = udp->sequential; @@ -1872,7 +1871,7 @@ static void process_udp_table(PUdp*udp, list*table, output string. */ if (synchronous_flag) { if (tmp.size() != 4) { - cerr << file<<":"<*table, tmp = tmp.substr(2); } else if (tmp.size() != 2) { - cerr << file<<":"<*table, udp->toutput = output; } -void pform_make_udp(perm_string name, list*parms, - vector*decl, list*table, - Statement*init_expr, - const char*file, unsigned lineno) +void pform_make_udp(const struct vlltype&loc, perm_string name, + list*parms, vector*decl, + list*table, Statement*init_expr) { unsigned local_errors = 0; assert(!parms->empty()); @@ -1968,10 +1966,10 @@ void pform_make_udp(perm_string name, list*parms, assert(pins.count() > 0); do { if (pins[0] == 0) { - cerr << file<<":"<*parms, break; } if (pins[0]->get_port_type() != NetNet::POUTPUT) { - cerr << file<<":"<*parms, for (unsigned idx = 1 ; idx < pins.count() ; idx += 1) { if (pins[idx] == 0) { - cerr << file<<":"<*parms, continue; } if (pins[idx]->get_port_type() != NetNet::PINPUT) { - cerr << file<<":"<*parms, } if (pins[idx]->get_wire_type() == NetNet::REG) { - cerr << file<<":"<*parms, } else { PUdp*udp = new PUdp(name, parms->size()); - FILE_NAME(udp, file, lineno); + FILE_NAME(udp, loc); // Detect sequential udp. if (pins[0]->get_wire_type() == NetNet::REG) @@ -2082,7 +2080,7 @@ void pform_make_udp(perm_string name, list*parms, for (unsigned idx = 0 ; idx < pins.count() ; idx += 1) udp->ports[idx] = pins[idx]->basename(); - process_udp_table(udp, table, file, lineno); + process_udp_table(udp, table, loc); udp->initial = init; pform_primitives[name] = udp; @@ -2096,10 +2094,10 @@ void pform_make_udp(perm_string name, list*parms, delete init_expr; } -void pform_make_udp(perm_string name, bool synchronous_flag, - perm_string out_name, PExpr*init_expr, - list*parms, list*table, - const char*file, unsigned lineno) +void pform_make_udp(const struct vlltype&loc, perm_string name, + bool synchronous_flag, perm_string out_name, + PExpr*init_expr, list*parms, + list*table) { svector pins(parms->size() + 1); @@ -2108,7 +2106,7 @@ void pform_make_udp(perm_string name, bool synchronous_flag, pins[0] = new PWire(out_name, synchronous_flag? NetNet::REG : NetNet::WIRE, NetNet::POUTPUT, IVL_VT_LOGIC); - FILE_NAME(pins[0], file, lineno); + FILE_NAME(pins[0], loc); /* Make the PWire objects for the input ports. */ { list::iterator cur; @@ -2119,7 +2117,7 @@ void pform_make_udp(perm_string name, bool synchronous_flag, assert(idx < pins.count()); pins[idx] = new PWire(*cur, NetNet::WIRE, NetNet::PINPUT, IVL_VT_LOGIC); - FILE_NAME(pins[idx], file, lineno); + FILE_NAME(pins[idx], loc); } assert(idx == pins.count()); } @@ -2153,7 +2151,7 @@ void pform_make_udp(perm_string name, bool synchronous_flag, } else { PUdp*udp = new PUdp(name, pins.count()); - FILE_NAME(udp, file, lineno); + FILE_NAME(udp, loc); // Detect sequential udp. udp->sequential = synchronous_flag; @@ -2164,7 +2162,7 @@ void pform_make_udp(perm_string name, bool synchronous_flag, assert(udp); assert(table); - process_udp_table(udp, table, file, lineno); + process_udp_table(udp, table, loc); udp->initial = init; pform_primitives[name] = udp; @@ -2243,21 +2241,21 @@ static void pform_set_net_range(list*names, * This is invoked to make a named event. This is the declaration of * the event, and not necessarily the use of it. */ -static void pform_make_event(perm_string name, const char*fn, unsigned ln) +static void pform_make_event(const struct vlltype&loc, perm_string name) { PEvent*event = new PEvent(name); - FILE_NAME(event, fn, ln); + FILE_NAME(event, loc); add_local_symbol(lexical_scope, name, event); lexical_scope->events[name] = event; } -void pform_make_events(list*names, const char*fn, unsigned ln) +void pform_make_events(const struct vlltype&loc, list*names) { list::iterator cur; for (cur = names->begin() ; cur != names->end() ; ++ cur ) { perm_string txt = *cur; - pform_make_event(txt, fn, ln); + pform_make_event(loc, txt); } delete names; @@ -2539,18 +2537,17 @@ static PGAssign* pform_make_pgassign(PExpr*lval, PExpr*rval, return cur; } -void pform_make_pgassign_list(list*alist, +void pform_make_pgassign_list(const struct vlltype&loc, + list*alist, list*del, - struct str_pair_t str, - const char* fn, - unsigned lineno) + struct str_pair_t str) { assert(alist->size() % 2 == 0); while (! alist->empty()) { PExpr*lval = alist->front(); alist->pop_front(); PExpr*rval = alist->front(); alist->pop_front(); PGAssign*tmp = pform_make_pgassign(lval, rval, del, str); - FILE_NAME(tmp, fn, lineno); + FILE_NAME(tmp, loc); } } @@ -2773,7 +2770,7 @@ static PWire* pform_get_or_make_wire(const vlltype&li, perm_string name, << "."; VLerror(msg.str().c_str()); } - FILE_NAME(cur, li.text, li.first_line); + FILE_NAME(cur, li); } return cur; } @@ -2785,7 +2782,7 @@ static PWire* pform_get_or_make_wire(const vlltype&li, perm_string name, // remain in the local symbol map. cur = new PWire(name, type, ptype, dtype); - FILE_NAME(cur, li.text, li.first_line); + FILE_NAME(cur, li); pform_put_wire_in_scope(name, cur); @@ -2865,9 +2862,9 @@ void pform_makewire(const struct vlltype&li, pform_make_var_init(li, first->name, expr); } else { PEIdent*lval = new PEIdent(first->name); - FILE_NAME(lval, li.text, li.first_line); + FILE_NAME(lval, li); PGAssign*ass = pform_make_pgassign(lval, expr, delay, str); - FILE_NAME(ass, li.text, li.first_line); + FILE_NAME(ass, li); } } delete first; @@ -3345,7 +3342,7 @@ extern PSpecPath* pform_make_specify_path(const struct vlltype&li, bool full_flag, list*dst) { PSpecPath*path = new PSpecPath(src->size(), dst->size(), pol, full_flag); - FILE_NAME(path, li.text, li.first_line); + FILE_NAME(path, li); unsigned idx; list::const_iterator cur; @@ -3405,13 +3402,13 @@ extern void pform_module_specify_path(PSpecPath*obj) } -static void pform_set_port_type(perm_string name, NetNet::PortType pt, - const char*file, unsigned lineno) +static void pform_set_port_type(const struct vlltype&li, + perm_string name, NetNet::PortType pt) { PWire*cur = pform_get_wire_in_scope(name); if (cur == 0) { cur = new PWire(name, NetNet::IMPLICIT, NetNet::PIMPLICIT, IVL_VT_NO_TYPE); - FILE_NAME(cur, file, lineno); + FILE_NAME(cur, li); pform_put_wire_in_scope(name, cur); } @@ -3422,14 +3419,14 @@ static void pform_set_port_type(perm_string name, NetNet::PortType pt, break; case NetNet::NOT_A_PORT: - cerr << file << ":" << lineno << ": error: " + cerr << li << ": error: " << "port " << name << " is not in the port list." << endl; error_count += 1; break; default: - cerr << file << ":" << lineno << ": error: " + cerr << li << ": error: " << "port " << name << " already has a port declaration." << endl; error_count += 1; @@ -3460,14 +3457,14 @@ void pform_set_port_type(const struct vlltype&li, for (list::iterator cur = ports->begin() ; cur != ports->end() ; ++ cur ) { - pform_set_port_type(cur->name, pt, li.text, li.first_line); + pform_set_port_type(li, cur->name, pt); pform_set_net_range(cur->name, NetNet::NONE, range, signed_flag, IVL_VT_NO_TYPE, SR_PORT, attr); if (cur->udims) { - cerr << li.text << ":" << li.first_line << ": warning: " + cerr << li << ": warning: " << "Array dimensions in incomplete port declarations " << "are currently ignored." << endl; - cerr << li.text << ":" << li.first_line << ": : " + cerr << li << ": : " << "The dimensions specified in the net or variable " << "declaration will be used." << endl; delete cur->udims; @@ -3478,7 +3475,7 @@ void pform_set_port_type(const struct vlltype&li, } } if (have_init_expr) { - cerr << li.text << ":" << li.first_line << ": error: " + cerr << li << ": error: " << "Incomplete port declarations cannot be initialized." << endl; error_count += 1; @@ -3663,8 +3660,7 @@ PProcess* pform_make_behavior(ivl_process_type_t type, Statement*st, // always_latch statements. if ((type == IVL_PR_ALWAYS_COMB) || (type == IVL_PR_ALWAYS_LATCH)) { PEventStatement *tmp = new PEventStatement(true); - tmp->set_file(st->get_file()); - tmp->set_lineno(st->get_lineno()); + tmp->set_line(*st); tmp->set_statement(st); st = tmp; } diff --git a/pform.h b/pform.h index 2fa5851e3..30a8be7a6 100644 --- a/pform.h +++ b/pform.h @@ -183,9 +183,8 @@ extern void pform_module_define_port(const struct vlltype&li, data_type_t*vtype, std::list*attr); -extern Module::port_t* pform_module_port_reference(perm_string name, - const char*file, - unsigned lineno); +extern Module::port_t* pform_module_port_reference(const struct vlltype&loc, + perm_string name); extern void pform_endmodule(const char*, bool inside_celldefine, Module::UCDriveType uc_drive_def); @@ -204,17 +203,16 @@ extern void pform_set_constructor_return(PFunction*net); extern void pform_end_class_declaration(const struct vlltype&loc); extern bool pform_in_class(); -extern void pform_make_udp(perm_string name, std::list*parms, +extern void pform_make_udp(const struct vlltype&loc, perm_string name, + std::list*parms, std::vector*decl, std::list*table, - Statement*init, - const char*file, unsigned lineno); + Statement*init); -extern void pform_make_udp(perm_string name, +extern void pform_make_udp(const struct vlltype&loc, perm_string name, bool sync_flag, perm_string out_name, PExpr*sync_init, std::list*parms, - std::list*table, - const char*file, unsigned lineno); + std::list*table); /* * Package related functions. */ @@ -462,8 +460,8 @@ extern void pform_mc_translate_on(bool flag); extern std::vector* pform_make_udp_input_ports(std::list*); -extern void pform_make_events(std::list*names, - const char*file, unsigned lineno); +extern void pform_make_events(const struct vlltype&loc, + std::list*names); /* * The makegate function creates a new gate (which need not have a * name) and connects it to the specified wires. @@ -482,10 +480,10 @@ extern void pform_make_modgates(const struct vlltype&loc, std::list*attr); /* Make a continuous assignment node, with optional bit- or part- select. */ -extern void pform_make_pgassign_list(std::list*alist, +extern void pform_make_pgassign_list(const struct vlltype&loc, + std::list*alist, std::list*del, - struct str_pair_t str, - const char* fn, unsigned lineno); + struct str_pair_t str); extern std::vector*pform_make_task_ports(const struct vlltype&loc, NetNet::PortType pt,