diff --git a/lexor.lex b/lexor.lex index f2a6952f6..1672d9a3e 100644 --- a/lexor.lex +++ b/lexor.lex @@ -4,7 +4,7 @@ %{ /* - * Copyright (c) 1998-2007 Stephen Williams (steve@icarus.com) + * Copyright (c) 1998-2008 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -48,6 +48,11 @@ */ extern YYLTYPE yylloc; +static char* strdupnew(char const *str) +{ + return str ? strcpy(new char [strlen(str)+1], str) : 0; +} + static const char* set_file_name(char*text) { perm_string path = filename_strings.make(text); @@ -205,7 +210,7 @@ W [ \t\b\f\r]+ int rc = lexor_keyword_code(yytext, yyleng); switch (rc) { case IDENTIFIER: - yylval.text = strdup(yytext); + yylval.text = strdupnew(yytext); if (strncmp(yylval.text,"PATHPULSE$", 10) == 0) rc = PATHPULSE_IDENTIFIER; break; @@ -214,7 +219,7 @@ W [ \t\b\f\r]+ case K_logic: case K_wone: if (! gn_cadence_types_enabled()) { - yylval.text = strdup(yytext); + yylval.text = strdupnew(yytext); rc = IDENTIFIER; } else { yylval.text = 0; @@ -235,7 +240,7 @@ W [ \t\b\f\r]+ \\[^ \t\b\f\r\n]+ { - yylval.text = strdup(yytext+1); + yylval.text = strdupnew(yytext+1); return IDENTIFIER; } \$([a-zA-Z0-9$_]+) { @@ -255,7 +260,7 @@ W [ \t\b\f\r]+ return K_Ssetup; if (strcmp(yytext,"$width") == 0) return K_Swidth; - yylval.text = strdup(yytext); + yylval.text = strdupnew(yytext); return SYSTEM_IDENTIFIER; } @@ -978,5 +983,5 @@ void reset_lexor() yylloc.first_line = 1; /* Announce the first file name. */ - yylloc.text = set_file_name(strdup(vl_file.c_str())); + yylloc.text = set_file_name(strdupnew(vl_file.c_str())); } diff --git a/netlist.cc b/netlist.cc index 4946288a3..a9aa26a21 100644 --- a/netlist.cc +++ b/netlist.cc @@ -398,8 +398,8 @@ const Link& NetDelaySrc::condit_pin() const NetNet::NetNet(NetScope*s, perm_string n, Type t, unsigned npins) : NetObj(s, n, 1), sig_next_(0), sig_prev_(0), type_(t), port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE), - signed_(false), msb_(npins-1), lsb_(0), dimensions_(0), s0_(0), e0_(0), - local_flag_(false), eref_count_(0), lref_count_(0) + signed_(false), isint_(false), msb_(npins-1), lsb_(0), dimensions_(0), + s0_(0), e0_(0), local_flag_(false), eref_count_(0), lref_count_(0) { assert(s); assert(npins>0); @@ -438,7 +438,7 @@ NetNet::NetNet(NetScope*s, perm_string n, Type t, : NetObj(s, n, 1), sig_next_(0), sig_prev_(0), type_(t), port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE), signed_(false), - msb_(ms), lsb_(ls), dimensions_(0), s0_(0), e0_(0), + isint_(false), msb_(ms), lsb_(ls), dimensions_(0), s0_(0), e0_(0), local_flag_(false), eref_count_(0), lref_count_(0) { assert(s); @@ -484,8 +484,8 @@ static unsigned calculate_count(long s, long e) NetNet::NetNet(NetScope*s, perm_string n, Type t, long ms, long ls, long array_s, long array_e) : NetObj(s, n, calculate_count(array_s, array_e)), - sig_next_(0), sig_prev_(0), type_(t), - port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE), signed_(false), + sig_next_(0), sig_prev_(0), type_(t), port_type_(NOT_A_PORT), + data_type_(IVL_VT_NO_TYPE), signed_(false), isint_(false), msb_(ms), lsb_(ls), dimensions_(1), s0_(array_s), e0_(array_e), local_flag_(false), eref_count_(0), lref_count_(0) { diff --git a/parse.y b/parse.y index a7e7779d8..b3a1a3377 100644 --- a/parse.y +++ b/parse.y @@ -81,14 +81,14 @@ static list* list_from_identifier(char*id) { list*tmp = new list; tmp->push_back(lex_strings.make(id)); - delete id; + delete[]id; return tmp; } static list* list_from_identifier(list*tmp, char*id) { tmp->push_back(lex_strings.make(id)); - delete id; + delete[]id; return tmp; } @@ -325,7 +325,7 @@ attribute { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($1); tmp->parm = 0; - delete $1; + delete[]$1; $$ = tmp; } | IDENTIFIER '=' expression @@ -339,7 +339,7 @@ attribute named_pexpr_t*tmp2 = new named_pexpr_t; tmp2->name = lex_strings.make($1); tmp2->parm = tmp; - delete $1; + delete[]$1; $$ = tmp2; } ; @@ -611,7 +611,7 @@ delay_value_simple { PEIdent*tmp = new PEIdent(lex_strings.make($1)); FILE_NAME(tmp, @1); $$ = tmp; - delete $1; + delete[]$1; } ; @@ -621,7 +621,7 @@ description | KK_attribute '(' IDENTIFIER ',' STRING ',' STRING ')' { perm_string tmp3 = lex_strings.make($3); pform_set_type_attrib(tmp3, $5, $7); - delete $3; + delete[]$3; delete $5; } ; @@ -1034,7 +1034,7 @@ expr_primary PECallFunction*tmp = new PECallFunction(tn); FILE_NAME(tmp, @1); $$ = tmp; - delete $1; + delete[]$1; } /* The hierarchy_identifier rule matches simple identifiers as well as @@ -1061,6 +1061,7 @@ expr_primary { perm_string tn = lex_strings.make($1); PECallFunction*tmp = new PECallFunction(tn, *$3); FILE_NAME(tmp, @1); + delete[]$1; $$ = tmp; } @@ -1192,7 +1193,7 @@ gate_instance tmp->parms = $3; tmp->file = @1.text; tmp->lineno = @1.first_line; - delete $1; + delete[]$1; $$ = tmp; } @@ -1205,7 +1206,7 @@ gate_instance tmp->range[1] = (*rng)[1]; tmp->file = @1.text; tmp->lineno = @1.first_line; - delete $1; + delete[]$1; delete rng; $$ = tmp; } @@ -1230,7 +1231,7 @@ gate_instance tmp->range[1] = (*rng)[1]; tmp->file = @1.text; tmp->lineno = @1.first_line; - delete $1; + delete[]$1; delete rng; $$ = tmp; } @@ -1244,7 +1245,7 @@ gate_instance tmp->parms_by_name = $3; tmp->file = @1.text; tmp->lineno = @1.first_line; - delete $1; + delete[]$1; $$ = tmp; } @@ -1258,7 +1259,7 @@ gate_instance tmp->range[1] = (*rng)[1]; tmp->file = @1.text; tmp->lineno = @1.first_line; - delete $1; + delete[]$1; delete rng; $$ = tmp; } @@ -1318,12 +1319,12 @@ hierarchy_identifier : IDENTIFIER { $$ = new pform_name_t; $$->push_back(name_component_t(lex_strings.make($1))); - delete $1; + delete[]$1; } | hierarchy_identifier '.' IDENTIFIER { pform_name_t * tmp = $1; tmp->push_back(name_component_t(lex_strings.make($3))); - delete $3; + delete[]$3; $$ = tmp; } | hierarchy_identifier '[' expression ']' @@ -1439,7 +1440,7 @@ list_of_port_declarations port_declaration_context.sign_flag, port_declaration_context.range, 0); delete $1; - delete $3; + delete[]$3; $$ = tmp; } | list_of_port_declarations ',' @@ -1468,7 +1469,7 @@ port_declaration port_declaration_context.sign_flag = $4; port_declaration_context.range = $5; delete $1; - delete $6; + delete[]$6; $$ = ptmp; } | attribute_list_opt @@ -1484,7 +1485,7 @@ port_declaration port_declaration_context.sign_flag = $4; port_declaration_context.range = $5; delete $1; - delete $6; + delete[]$6; $$ = ptmp; } | attribute_list_opt @@ -1500,7 +1501,7 @@ port_declaration port_declaration_context.sign_flag = $4; port_declaration_context.range = $5; delete $1; - delete $6; + delete[]$6; $$ = ptmp; } | attribute_list_opt @@ -1516,7 +1517,7 @@ port_declaration port_declaration_context.sign_flag = $4; port_declaration_context.range = $5; delete $1; - delete $6; + delete[]$6; $$ = ptmp; } | attribute_list_opt @@ -1538,7 +1539,7 @@ port_declaration pform_make_reginit(@6, name, $8); delete $1; - delete $6; + delete[]$6; $$ = ptmp; } ; @@ -1607,7 +1608,7 @@ module : attribute_list_opt module_start IDENTIFIER module_item_list_opt K_endmodule { pform_endmodule($3); - delete $3; + delete[]$3; } ; @@ -1804,13 +1805,14 @@ module_item IDENTIFIER parameter_value_opt gate_instance_list ';' { perm_string tmp1 = lex_strings.make($2); pform_make_modgates(tmp1, $3, $4); - delete $2; + delete[]$2; if ($1) delete $1; } | attribute_list_opt IDENTIFIER parameter_value_opt error ';' { yyerror(@2, "error: Invalid module instantiation"); + delete[]$2; if ($1) delete $1; } @@ -1854,7 +1856,7 @@ module_item current_task->set_statement($6); pform_pop_scope(); current_task = 0; - delete $2; + delete[]$2; } | K_task IDENTIFIER @@ -1870,7 +1872,7 @@ module_item current_task->set_statement($9); pform_pop_scope(); current_task = 0; - delete $2; + delete[]$2; } /* The function declaration rule matches the function declaration @@ -1890,7 +1892,7 @@ module_item current_function->set_return($2); pform_pop_scope(); current_function = 0; - delete $3; + delete[]$3; } /* A generate region can contain further module items. Actually, it @@ -1981,7 +1983,7 @@ module_item { perm_string tmp3 = lex_strings.make($3); perm_string tmp5 = lex_strings.make($5); pform_set_attrib(tmp3, tmp5, $7); - delete $3; + delete[]$3; delete $5; } | KK_attribute '(' error ')' ';' @@ -2041,7 +2043,7 @@ net_decl_assign tmp->next = tmp; tmp->name = lex_strings.make($1); tmp->expr = $3; - delete $1; + delete[]$1; $$ = tmp; } ; @@ -2124,7 +2126,7 @@ parameter_assign active_signed, active_range, tmp); } - delete $1; + delete[]$1; } ; @@ -2146,7 +2148,7 @@ localparam_assign active_signed, active_range, tmp); } - delete $1; + delete[]$1; } ; @@ -2224,14 +2226,14 @@ parameter_value_byname { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); tmp->parm = $4; - free($2); + delete[]$2; $$ = tmp; } | '.' IDENTIFIER '(' ')' { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); tmp->parm = 0; - free($2); + delete[]$2; $$ = tmp; } ; @@ -2276,7 +2278,7 @@ port | '.' IDENTIFIER '(' port_reference ')' { Module::port_t*tmp = $4; tmp->name = lex_strings.make($2); - delete $2; + delete[]$2; $$ = tmp; } @@ -2296,7 +2298,7 @@ port | '.' IDENTIFIER '(' '{' port_reference_list '}' ')' { Module::port_t*tmp = $5; tmp->name = lex_strings.make($2); - delete $2; + delete[]$2; $$ = tmp; } ; @@ -2323,7 +2325,7 @@ port_reference { Module::port_t*ptmp; perm_string name = lex_strings.make($1); ptmp = pform_module_port_reference(name, @1.text, @1.first_line); - delete $1; + delete[]$1; $$ = ptmp; } @@ -2355,7 +2357,7 @@ port_reference ptmp->expr = svector(1); ptmp->expr[0] = wtmp; - delete $1; + delete[]$1; $$ = ptmp; } @@ -2382,7 +2384,7 @@ port_reference ptmp->name = perm_string(); ptmp->expr = svector(1); ptmp->expr[0] = tmp; - delete $1; + delete[]$1; $$ = ptmp; } @@ -2394,7 +2396,7 @@ port_reference ptmp->name = lex_strings.make($1); ptmp->expr = svector(1); ptmp->expr[0] = wtmp; - delete $1; + delete[]$1; $$ = ptmp; } ; @@ -2420,7 +2422,7 @@ port_name { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); tmp->parm = $4; - delete $2; + delete[]$2; $$ = tmp; } | '.' IDENTIFIER '(' error ')' @@ -2428,14 +2430,14 @@ port_name named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); tmp->parm = 0; - delete $2; + delete[]$2; $$ = tmp; } | '.' IDENTIFIER '(' ')' { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); tmp->parm = 0; - delete $2; + delete[]$2; $$ = tmp; } ; @@ -2811,7 +2813,7 @@ specparam : IDENTIFIER '=' expression { PExpr*tmp = $3; pform_set_specparam(lex_strings.make($1), tmp); - delete $1; + delete[]$1; } | IDENTIFIER '=' expression ':' expression ':' expression { PExpr*tmp = 0; @@ -2849,14 +2851,14 @@ specparam min_typ_max_warn -= 1; } pform_set_specparam(lex_strings.make($1), tmp); - delete $1; + delete[]$1; } | PATHPULSE_IDENTIFIER '=' expression - { delete $1; + { delete[]$1; delete $3; } | PATHPULSE_IDENTIFIER '=' '(' expression ',' expression ')' - { delete $1; + { delete[]$1; delete $4; delete $6; } @@ -2925,7 +2927,7 @@ spec_notifier | spec_notifier ',' hierarchy_identifier { delete $3; } | IDENTIFIER - { delete $1; } + { delete[]$1; } ; @@ -2988,7 +2990,7 @@ statement PBlock*tmp = current_block_stack.top(); current_block_stack.pop(); tmp->set_statement(*$6); - delete $3; + delete[]$3; delete $6; $$ = tmp; } @@ -3000,6 +3002,7 @@ statement | K_begin ':' IDENTIFIER K_end { PBlock*tmp = new PBlock(PBlock::BL_SEQ); FILE_NAME(tmp, @1); + delete[]$3; $$ = tmp; } | K_begin error K_end @@ -3022,7 +3025,7 @@ statement PBlock*tmp = current_block_stack.top(); current_block_stack.pop(); tmp->set_statement(*$6); - delete $3; + delete[]$3; delete $6; $$ = tmp; } @@ -3034,7 +3037,7 @@ statement | K_fork ':' IDENTIFIER K_join { PBlock*tmp = new PBlock(PBlock::BL_PAR); FILE_NAME(tmp, @1); - delete $3; + delete[]$3; $$ = tmp; } @@ -3235,7 +3238,7 @@ statement | SYSTEM_IDENTIFIER '(' expression_list_with_nuls ')' ';' { PCallTask*tmp = new PCallTask(lex_strings.make($1), *$3); FILE_NAME(tmp,@1); - delete $1; + delete[]$1; delete $3; $$ = tmp; } @@ -3243,7 +3246,7 @@ statement { svectorpt (0); PCallTask*tmp = new PCallTask(lex_strings.make($1), pt); FILE_NAME(tmp,@1); - delete $1; + delete[]$1; $$ = tmp; } | hierarchy_identifier '(' expression_list_proper ')' ';' @@ -3576,13 +3579,13 @@ udp_comb_entry_list : udp_comb_entry { list*tmp = new list; tmp->push_back($1); - delete $1; + delete[]$1; $$ = tmp; } | udp_comb_entry_list udp_comb_entry { list*tmp = $1; tmp->push_back($2); - delete $2; + delete[]$2; $$ = tmp; } ; @@ -3591,13 +3594,13 @@ udp_sequ_entry_list : udp_sequ_entry { list*tmp = new list; tmp->push_back($1); - delete $1; + delete[]$1; $$ = tmp; } | udp_sequ_entry_list udp_sequ_entry { list*tmp = $1; tmp->push_back($2); - delete $2; + delete[]$2; $$ = tmp; } ; @@ -3622,7 +3625,7 @@ udp_initial PEIdent*itmp = new PEIdent(lex_strings.make($2)); PAssign*atmp = new PAssign(itmp, etmp); FILE_NAME(atmp, @2); - delete $2; + delete[]$2; $$ = atmp; } ; @@ -3695,7 +3698,7 @@ udp_port_decl svector*tmp = new svector(1); (*tmp)[0] = pp; $$ = tmp; - delete $2; + delete[]$2; } | K_reg IDENTIFIER ';' { perm_string pname = lex_strings.make($2); @@ -3703,7 +3706,7 @@ udp_port_decl svector*tmp = new svector(1); (*tmp)[0] = pp; $$ = tmp; - delete $2; + delete[]$2; } | K_reg K_output IDENTIFIER ';' { perm_string pname = lex_strings.make($3); @@ -3711,7 +3714,7 @@ udp_port_decl svector*tmp = new svector(1); (*tmp)[0] = pp; $$ = tmp; - delete $3; + delete[]$3; } ; @@ -3730,13 +3733,13 @@ udp_port_list : IDENTIFIER { list*tmp = new list; tmp->push_back(lex_strings.make($1)); - delete $1; + delete[]$1; $$ = tmp; } | udp_port_list ',' IDENTIFIER { list*tmp = $1; tmp->push_back(lex_strings.make($3)); - delete $3; + delete[]$3; $$ = tmp; } ; diff --git a/t-dll.cc b/t-dll.cc index eab30dc66..f56318188 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -1246,6 +1246,8 @@ void dll_target::udp(const NetUDP*net) u->sequ = net->is_sequential(); if (u->sequ) u->init = net->get_initial(); + else + u->init = 'x'; u->name = net->udp_name(); string inp; char out;