Merge pull request #618 from larsclausen/signal-decl-consolidation
Consolidate signal declaration
This commit is contained in:
commit
cc0a8c8dd2
|
|
@ -0,0 +1,29 @@
|
||||||
|
// Check that the class new initializer can be used for all sorts for variable
|
||||||
|
// declarations
|
||||||
|
|
||||||
|
package P;
|
||||||
|
class C;
|
||||||
|
endclass
|
||||||
|
C c = new;
|
||||||
|
endpackage
|
||||||
|
|
||||||
|
module test;
|
||||||
|
|
||||||
|
class C;
|
||||||
|
task check;
|
||||||
|
$display("PASSED");
|
||||||
|
endtask
|
||||||
|
endclass
|
||||||
|
|
||||||
|
class D;
|
||||||
|
C c = new;
|
||||||
|
endclass
|
||||||
|
|
||||||
|
C c = new;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
static C c = new;
|
||||||
|
c.check();
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
@ -436,6 +436,7 @@ sv_class22 normal,-g2009 ivltests
|
||||||
sv_class23 normal,-g2009 ivltests
|
sv_class23 normal,-g2009 ivltests
|
||||||
sv_class24 normal,-g2009 ivltests
|
sv_class24 normal,-g2009 ivltests
|
||||||
sv_class_extends_scoped normal,-g2009 ivltests
|
sv_class_extends_scoped normal,-g2009 ivltests
|
||||||
|
sv_class_new_init normal,-g2009 ivltests
|
||||||
sv_darray1 normal,-g2009 ivltests
|
sv_darray1 normal,-g2009 ivltests
|
||||||
sv_darray2 normal,-g2009 ivltests
|
sv_darray2 normal,-g2009 ivltests
|
||||||
sv_darray3 normal,-g2009 ivltests
|
sv_darray3 normal,-g2009 ivltests
|
||||||
|
|
|
||||||
|
|
@ -364,6 +364,7 @@ sv_class22 CE,-g2009 ivltests
|
||||||
sv_class23 CE,-g2009 ivltests
|
sv_class23 CE,-g2009 ivltests
|
||||||
sv_class24 CE,-g2009 ivltests
|
sv_class24 CE,-g2009 ivltests
|
||||||
sv_class_extends_scoped CE,-g2009 ivltests
|
sv_class_extends_scoped CE,-g2009 ivltests
|
||||||
|
sv_class_new_init CE,-g2009 ivltests
|
||||||
sv_end_label CE,-g2009 ivltests # Also generate
|
sv_end_label CE,-g2009 ivltests # Also generate
|
||||||
sv_foreach2 CE,-g2009,-pallowsigned=1 ivltests
|
sv_foreach2 CE,-g2009,-pallowsigned=1 ivltests
|
||||||
sv_foreach3 CE,-g2009 ivltests
|
sv_foreach3 CE,-g2009 ivltests
|
||||||
|
|
|
||||||
175
parse.y
175
parse.y
|
|
@ -439,7 +439,6 @@ static void current_function_set_statement(const YYLTYPE&loc, std::vector<Statem
|
||||||
Statement*statement;
|
Statement*statement;
|
||||||
std::vector<Statement*>*statement_list;
|
std::vector<Statement*>*statement_list;
|
||||||
|
|
||||||
net_decl_assign_t*net_decl_assign;
|
|
||||||
enum_type_t*enum_type;
|
enum_type_t*enum_type;
|
||||||
|
|
||||||
decl_assignment_t*decl_assignment;
|
decl_assignment_t*decl_assignment;
|
||||||
|
|
@ -604,13 +603,14 @@ static void current_function_set_statement(const YYLTYPE&loc, std::vector<Statem
|
||||||
%type <statement> udp_initial udp_init_opt
|
%type <statement> udp_initial udp_init_opt
|
||||||
%type <expr> udp_initial_expr_opt
|
%type <expr> udp_initial_expr_opt
|
||||||
|
|
||||||
%type <text> register_variable net_variable event_variable label_opt class_declaration_endlabel_opt
|
%type <text> net_variable event_variable label_opt class_declaration_endlabel_opt
|
||||||
%type <text> block_identifier_opt
|
%type <text> block_identifier_opt
|
||||||
%type <perm_strings> register_variable_list net_variable_list event_variable_list
|
%type <perm_strings> net_variable_list event_variable_list
|
||||||
%type <perm_strings> list_of_identifiers loop_variables
|
%type <perm_strings> list_of_identifiers loop_variables
|
||||||
%type <port_list> list_of_port_identifiers list_of_variable_port_identifiers
|
%type <port_list> list_of_port_identifiers list_of_variable_port_identifiers
|
||||||
|
|
||||||
%type <net_decl_assign> net_decl_assign net_decl_assigns
|
%type <decl_assignments> net_decl_assigns
|
||||||
|
%type <decl_assignment> net_decl_assign
|
||||||
|
|
||||||
%type <mport> port port_opt port_reference port_reference_list
|
%type <mport> port port_opt port_reference port_reference_list
|
||||||
%type <mport> port_declaration
|
%type <mport> port_declaration
|
||||||
|
|
@ -645,6 +645,7 @@ static void current_function_set_statement(const YYLTYPE&loc, std::vector<Statem
|
||||||
%type <expr> assignment_pattern expression expr_mintypmax
|
%type <expr> assignment_pattern expression expr_mintypmax
|
||||||
%type <expr> expr_primary_or_typename expr_primary
|
%type <expr> expr_primary_or_typename expr_primary
|
||||||
%type <expr> class_new dynamic_array_new let_default_opt
|
%type <expr> class_new dynamic_array_new let_default_opt
|
||||||
|
%type <expr> var_decl_initializer_opt
|
||||||
%type <expr> inc_or_dec_expression inside_expression lpvalue
|
%type <expr> inc_or_dec_expression inside_expression lpvalue
|
||||||
%type <expr> branch_probe_expression streaming_concatenation
|
%type <expr> branch_probe_expression streaming_concatenation
|
||||||
%type <expr> delay_value delay_value_simple
|
%type <expr> delay_value delay_value_simple
|
||||||
|
|
@ -1182,7 +1183,7 @@ data_declaration /* IEEE1800-2005: A.2.1.3 */
|
||||||
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
|
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
|
||||||
FILE_NAME(data_type, @2);
|
FILE_NAME(data_type, @2);
|
||||||
}
|
}
|
||||||
pform_makewire(@2, 0, str_strength, $3, NetNet::IMPLICIT_REG, data_type);
|
pform_makewire(@2, 0, str_strength, $3, NetNet::IMPLICIT_REG, data_type, $1);
|
||||||
}
|
}
|
||||||
| attribute_list_opt K_event event_variable_list ';'
|
| attribute_list_opt K_event event_variable_list ';'
|
||||||
{ if ($3) pform_make_events($3, @2.text, @2.first_line);
|
{ if ($3) pform_make_events($3, @2.text, @2.first_line);
|
||||||
|
|
@ -1660,7 +1661,7 @@ loop_statement /* IEEE1800-2005: A.6.8 */
|
||||||
decl_assignment_t*tmp_assign = new decl_assignment_t;
|
decl_assignment_t*tmp_assign = new decl_assignment_t;
|
||||||
tmp_assign->name = lex_strings.make($4);
|
tmp_assign->name = lex_strings.make($4);
|
||||||
assign_list.push_back(tmp_assign);
|
assign_list.push_back(tmp_assign);
|
||||||
pform_makewire(@4, 0, str_strength, &assign_list, NetNet::REG, $3);
|
pform_make_var(@4, &assign_list, $3);
|
||||||
}
|
}
|
||||||
statement_or_null
|
statement_or_null
|
||||||
{ pform_name_t tmp_hident;
|
{ pform_name_t tmp_hident;
|
||||||
|
|
@ -1767,7 +1768,6 @@ loop_statement /* IEEE1800-2005: A.6.8 */
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
/* TODO: Replace register_variable_list with list_of_variable_decl_assignments. */
|
|
||||||
list_of_variable_decl_assignments /* IEEE1800-2005 A.2.3 */
|
list_of_variable_decl_assignments /* IEEE1800-2005 A.2.3 */
|
||||||
: variable_decl_assignment
|
: variable_decl_assignment
|
||||||
{ std::list<decl_assignment_t*>*tmp = new std::list<decl_assignment_t*>;
|
{ std::list<decl_assignment_t*>*tmp = new std::list<decl_assignment_t*>;
|
||||||
|
|
@ -1781,37 +1781,29 @@ list_of_variable_decl_assignments /* IEEE1800-2005 A.2.3 */
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
var_decl_initializer_opt
|
||||||
|
: '=' expression { $$ = $2; }
|
||||||
|
| '=' class_new { $$ = $2; }
|
||||||
|
| '=' dynamic_array_new { $$ = $2; }
|
||||||
|
| { $$ = 0; }
|
||||||
|
;
|
||||||
|
|
||||||
variable_decl_assignment /* IEEE1800-2005 A.2.3 */
|
variable_decl_assignment /* IEEE1800-2005 A.2.3 */
|
||||||
: IDENTIFIER dimensions_opt
|
: IDENTIFIER dimensions_opt var_decl_initializer_opt
|
||||||
{ decl_assignment_t*tmp = new decl_assignment_t;
|
{ if ($3 && pform_peek_scope()->var_init_needs_explicit_lifetime()
|
||||||
|
&& (var_lifetime == LexicalScope::INHERITED)) {
|
||||||
|
cerr << @1 << ": warning: Static variable initialization requires "
|
||||||
|
"explicit lifetime in this context." << endl;
|
||||||
|
warn_count += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
decl_assignment_t*tmp = new decl_assignment_t;
|
||||||
tmp->name = lex_strings.make($1);
|
tmp->name = lex_strings.make($1);
|
||||||
if ($2) {
|
if ($2) {
|
||||||
tmp->index = *$2;
|
tmp->index = *$2;
|
||||||
delete $2;
|
delete $2;
|
||||||
}
|
}
|
||||||
delete[]$1;
|
tmp->expr.reset($3);
|
||||||
$$ = tmp;
|
|
||||||
}
|
|
||||||
| IDENTIFIER '=' expression
|
|
||||||
{ decl_assignment_t*tmp = new decl_assignment_t;
|
|
||||||
tmp->name = lex_strings.make($1);
|
|
||||||
tmp->expr .reset($3);
|
|
||||||
delete[]$1;
|
|
||||||
$$ = tmp;
|
|
||||||
}
|
|
||||||
| IDENTIFIER '=' class_new
|
|
||||||
{ decl_assignment_t*tmp = new decl_assignment_t;
|
|
||||||
tmp->name = lex_strings.make($1);
|
|
||||||
tmp->expr .reset($3);
|
|
||||||
delete[]$1;
|
|
||||||
$$ = tmp;
|
|
||||||
}
|
|
||||||
| IDENTIFIER dimensions '=' dynamic_array_new
|
|
||||||
{ decl_assignment_t*tmp = new decl_assignment_t;
|
|
||||||
tmp->name = lex_strings.make($1);
|
|
||||||
tmp->index = *$2;
|
|
||||||
tmp->expr .reset($4);
|
|
||||||
delete $2;
|
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -2682,21 +2674,22 @@ block_item_decl
|
||||||
/* variable declarations. Note that data_type can be 0 if we are
|
/* variable declarations. Note that data_type can be 0 if we are
|
||||||
recovering from an error. */
|
recovering from an error. */
|
||||||
|
|
||||||
: data_type register_variable_list ';'
|
: data_type list_of_variable_decl_assignments ';'
|
||||||
{ if ($1) pform_set_data_type(@1, $1, $2, NetNet::REG, attributes_in_context);
|
{ if ($1) pform_make_var(@1, $2, $1, attributes_in_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
| variable_lifetime data_type register_variable_list ';'
|
| variable_lifetime data_type list_of_variable_decl_assignments ';'
|
||||||
{ if ($2) pform_set_data_type(@2, $2, $3, NetNet::REG, attributes_in_context);
|
{ if ($2) pform_make_var(@2, $3, $2, attributes_in_context);
|
||||||
var_lifetime = LexicalScope::INHERITED;
|
var_lifetime = LexicalScope::INHERITED;
|
||||||
}
|
}
|
||||||
|
|
||||||
| K_reg data_type register_variable_list ';'
|
/* The extra `reg` is not valid (System)Verilog, this is a iverilog extension. */
|
||||||
{ if ($2) pform_set_data_type(@2, $2, $3, NetNet::REG, attributes_in_context);
|
| K_reg data_type list_of_variable_decl_assignments ';'
|
||||||
|
{ if ($2) pform_make_var(@2, $3, $2, attributes_in_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
| variable_lifetime K_reg data_type register_variable_list ';'
|
| variable_lifetime K_reg data_type list_of_variable_decl_assignments ';'
|
||||||
{ if ($3) pform_set_data_type(@3, $3, $4, NetNet::REG, attributes_in_context);
|
{ if ($3) pform_make_var(@3, $4, $3, attributes_in_context);
|
||||||
var_lifetime = LexicalScope::INHERITED;
|
var_lifetime = LexicalScope::INHERITED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4999,12 +4992,8 @@ module_item
|
||||||
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
|
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
|
||||||
FILE_NAME(data_type, @2);
|
FILE_NAME(data_type, @2);
|
||||||
}
|
}
|
||||||
pform_makewire(@2, $4, str_strength, $5, $2, data_type);
|
pform_makewire(@2, $4, str_strength, $5, $2, data_type, $1);
|
||||||
if ($1) {
|
delete $1;
|
||||||
yywarn(@2, "Attributes are not supported on net declaration "
|
|
||||||
"assignments and will be discarded.");
|
|
||||||
delete $1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This form doesn't have the range, but does have strengths. This
|
/* This form doesn't have the range, but does have strengths. This
|
||||||
|
|
@ -5016,22 +5005,14 @@ module_item
|
||||||
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
|
data_type = new vector_type_t(IVL_VT_LOGIC, false, 0);
|
||||||
FILE_NAME(data_type, @2);
|
FILE_NAME(data_type, @2);
|
||||||
}
|
}
|
||||||
pform_makewire(@2, 0, $4, $5, $2, data_type);
|
pform_makewire(@2, 0, $4, $5, $2, data_type, $1);
|
||||||
if ($1) {
|
delete $1;
|
||||||
yywarn(@2, "Attributes are not supported on net declaration "
|
|
||||||
"assignments and will be discarded.");
|
|
||||||
delete $1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
| attribute_list_opt K_wreal net_decl_assigns ';'
|
| attribute_list_opt K_wreal net_decl_assigns ';'
|
||||||
{ real_type_t*data_type = new real_type_t(real_type_t::REAL);
|
{ real_type_t*data_type = new real_type_t(real_type_t::REAL);
|
||||||
pform_makewire(@2, 0, str_strength, $3, NetNet::WIRE, data_type);
|
pform_makewire(@2, 0, str_strength, $3, NetNet::WIRE, data_type, $1);
|
||||||
if ($1) {
|
delete $1;
|
||||||
yywarn(@2, "Attributes are not supported on net declaration "
|
|
||||||
"assignments and will be discarded.");
|
|
||||||
delete $1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
| K_trireg charge_strength_opt dimensions_opt delay3_opt list_of_identifiers ';'
|
| K_trireg charge_strength_opt dimensions_opt delay3_opt list_of_identifiers ';'
|
||||||
|
|
@ -5539,10 +5520,9 @@ generate_block
|
||||||
|
|
||||||
net_decl_assign
|
net_decl_assign
|
||||||
: IDENTIFIER '=' expression
|
: IDENTIFIER '=' expression
|
||||||
{ net_decl_assign_t*tmp = new net_decl_assign_t;
|
{ decl_assignment_t*tmp = new decl_assignment_t;
|
||||||
tmp->next = tmp;
|
|
||||||
tmp->name = lex_strings.make($1);
|
tmp->name = lex_strings.make($1);
|
||||||
tmp->expr = $3;
|
tmp->expr.reset($3);
|
||||||
delete[]$1;
|
delete[]$1;
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
|
@ -5550,14 +5530,15 @@ net_decl_assign
|
||||||
|
|
||||||
net_decl_assigns
|
net_decl_assigns
|
||||||
: net_decl_assigns ',' net_decl_assign
|
: net_decl_assigns ',' net_decl_assign
|
||||||
{ net_decl_assign_t*tmp = $1;
|
{ std::list<decl_assignment_t*>*tmp = $1;
|
||||||
$3->next = tmp->next;
|
tmp->push_back($3);
|
||||||
tmp->next = $3;
|
$$ = tmp;
|
||||||
$$ = tmp;
|
}
|
||||||
}
|
|
||||||
| net_decl_assign
|
| net_decl_assign
|
||||||
{ $$ = $1;
|
{ std::list<decl_assignment_t*>*tmp = new std::list<decl_assignment_t*>;
|
||||||
}
|
tmp->push_back($1);
|
||||||
|
$$ = tmp;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
net_type
|
net_type
|
||||||
|
|
@ -5996,64 +5977,6 @@ dimensions
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
/* The register_variable rule is matched only when I am parsing
|
|
||||||
variables in a "reg" definition. I therefore know that I am
|
|
||||||
creating registers and I do not need to let the containing rule
|
|
||||||
handle it. The register variable list simply packs them together
|
|
||||||
so that bit ranges can be assigned. */
|
|
||||||
register_variable
|
|
||||||
: IDENTIFIER dimensions_opt
|
|
||||||
{ perm_string name = lex_strings.make($1);
|
|
||||||
pform_makewire(@1, name, NetNet::REG,
|
|
||||||
NetNet::NOT_A_PORT, IVL_VT_NO_TYPE, 0);
|
|
||||||
pform_set_reg_idx(name, $2);
|
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
| IDENTIFIER dimensions_opt '=' expression
|
|
||||||
{ if (pform_peek_scope()->var_init_needs_explicit_lifetime()
|
|
||||||
&& (var_lifetime == LexicalScope::INHERITED)) {
|
|
||||||
cerr << @3 << ": warning: Static variable initialization requires "
|
|
||||||
"explicit lifetime in this context." << endl;
|
|
||||||
warn_count += 1;
|
|
||||||
}
|
|
||||||
perm_string name = lex_strings.make($1);
|
|
||||||
pform_makewire(@1, name, NetNet::REG,
|
|
||||||
NetNet::NOT_A_PORT, IVL_VT_NO_TYPE, 0);
|
|
||||||
pform_set_reg_idx(name, $2);
|
|
||||||
pform_make_var_init(@1, name, $4);
|
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
| IDENTIFIER dimensions_opt '=' dynamic_array_new
|
|
||||||
{ if (pform_peek_scope()->var_init_needs_explicit_lifetime()
|
|
||||||
&& (var_lifetime == LexicalScope::INHERITED)) {
|
|
||||||
cerr << @3 << ": warning: Static variable initialization requires "
|
|
||||||
"explicit lifetime in this context." << endl;
|
|
||||||
warn_count += 1;
|
|
||||||
}
|
|
||||||
perm_string name = lex_strings.make($1);
|
|
||||||
pform_makewire(@1, name, NetNet::REG,
|
|
||||||
NetNet::NOT_A_PORT, IVL_VT_NO_TYPE, 0);
|
|
||||||
pform_set_reg_idx(name, $2);
|
|
||||||
pform_make_var_init(@1, name, $4);
|
|
||||||
$$ = $1;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
register_variable_list
|
|
||||||
: register_variable
|
|
||||||
{ std::list<perm_string>*tmp = new std::list<perm_string>;
|
|
||||||
tmp->push_back(lex_strings.make($1));
|
|
||||||
$$ = tmp;
|
|
||||||
delete[]$1;
|
|
||||||
}
|
|
||||||
| register_variable_list ',' register_variable
|
|
||||||
{ std::list<perm_string>*tmp = $1;
|
|
||||||
tmp->push_back(lex_strings.make($3));
|
|
||||||
$$ = tmp;
|
|
||||||
delete[]$3;
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
net_variable
|
net_variable
|
||||||
: IDENTIFIER dimensions_opt
|
: IDENTIFIER dimensions_opt
|
||||||
{ perm_string name = lex_strings.make($1);
|
{ perm_string name = lex_strings.make($1);
|
||||||
|
|
|
||||||
96
pform.cc
96
pform.cc
|
|
@ -998,11 +998,18 @@ PCallTask* pform_make_call_task(const struct vlltype&loc,
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pform_make_foreach_declarations(const struct vlltype&loc,
|
void pform_make_var(const struct vlltype&loc,
|
||||||
std::list<perm_string>*loop_vars)
|
std::list<decl_assignment_t*>*assign_list,
|
||||||
|
data_type_t*data_type, std::list<named_pexpr_t>*attr)
|
||||||
{
|
{
|
||||||
static const struct str_pair_t str = { IVL_DR_STRONG, IVL_DR_STRONG };
|
static const struct str_pair_t str = { IVL_DR_STRONG, IVL_DR_STRONG };
|
||||||
|
|
||||||
|
pform_makewire(loc, 0, str, assign_list, NetNet::REG, data_type, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void pform_make_foreach_declarations(const struct vlltype&loc,
|
||||||
|
std::list<perm_string>*loop_vars)
|
||||||
|
{
|
||||||
list<decl_assignment_t*>assign_list;
|
list<decl_assignment_t*>assign_list;
|
||||||
for (list<perm_string>::const_iterator cur = loop_vars->begin()
|
for (list<perm_string>::const_iterator cur = loop_vars->begin()
|
||||||
; cur != loop_vars->end() ; ++ cur) {
|
; cur != loop_vars->end() ; ++ cur) {
|
||||||
|
|
@ -1011,7 +1018,7 @@ void pform_make_foreach_declarations(const struct vlltype&loc,
|
||||||
assign_list.push_back(tmp_assign);
|
assign_list.push_back(tmp_assign);
|
||||||
}
|
}
|
||||||
|
|
||||||
pform_makewire(loc, 0, str, &assign_list, NetNet::REG, &size_type);
|
pform_make_var(loc, &assign_list, &size_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
PForeach* pform_make_foreach(const struct vlltype&loc,
|
PForeach* pform_make_foreach(const struct vlltype&loc,
|
||||||
|
|
@ -2835,90 +2842,13 @@ void pform_makewire(const vlltype&li, perm_string name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This form takes a list of names and some type information, and
|
|
||||||
* generates a bunch of variables/nets. We use the basic
|
|
||||||
* pform_makewire above.
|
|
||||||
*/
|
|
||||||
void pform_makewire(const vlltype&li,
|
|
||||||
list<pform_range_t>*range,
|
|
||||||
bool signed_flag,
|
|
||||||
list<perm_string>*names,
|
|
||||||
NetNet::Type type,
|
|
||||||
NetNet::PortType pt,
|
|
||||||
ivl_variable_type_t dt,
|
|
||||||
list<named_pexpr_t>*attr,
|
|
||||||
PWSRType rt)
|
|
||||||
{
|
|
||||||
for (list<perm_string>::iterator cur = names->begin()
|
|
||||||
; cur != names->end() ; ++ cur ) {
|
|
||||||
perm_string txt = *cur;
|
|
||||||
pform_makewire(li, txt, type, pt, dt, attr);
|
|
||||||
/* This has already been done for real variables. */
|
|
||||||
if (dt != IVL_VT_REAL) {
|
|
||||||
pform_set_net_range(txt, type, range, signed_flag, dt, rt, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete names;
|
|
||||||
delete range;
|
|
||||||
delete attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This form makes nets with delays and continuous assignments.
|
|
||||||
*/
|
|
||||||
void pform_makewire(const vlltype&li,
|
|
||||||
list<PExpr*>*delay,
|
|
||||||
str_pair_t str,
|
|
||||||
net_decl_assign_t*decls,
|
|
||||||
NetNet::Type type,
|
|
||||||
data_type_t*data_type)
|
|
||||||
{
|
|
||||||
// The decls pointer is a circularly linked list.
|
|
||||||
net_decl_assign_t*first = decls->next;
|
|
||||||
|
|
||||||
list<perm_string>*names = new list<perm_string>;
|
|
||||||
|
|
||||||
// Go through the circularly linked list non-destructively.
|
|
||||||
do {
|
|
||||||
pform_makewire(li, first->name, type, NetNet::NOT_A_PORT, IVL_VT_NO_TYPE, 0);
|
|
||||||
names->push_back(first->name);
|
|
||||||
first = first->next;
|
|
||||||
} while (first != decls->next);
|
|
||||||
|
|
||||||
// The pform_set_data_type function will delete the names list.
|
|
||||||
pform_set_data_type(li, data_type, names, type, 0);
|
|
||||||
|
|
||||||
// This time, go through the list, deleting cells as I'm done.
|
|
||||||
first = decls->next;
|
|
||||||
decls->next = 0;
|
|
||||||
while (first) {
|
|
||||||
net_decl_assign_t*next = first->next;
|
|
||||||
PWire*cur = pform_get_wire_in_scope(first->name);
|
|
||||||
if (cur != 0) {
|
|
||||||
PEIdent*lval = new PEIdent(first->name);
|
|
||||||
FILE_NAME(lval, li.text, li.first_line);
|
|
||||||
PGAssign*ass = pform_make_pgassign(lval, first->expr,
|
|
||||||
delay, str);
|
|
||||||
FILE_NAME(ass, li.text, li.first_line);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete first;
|
|
||||||
first = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This should eventually replace the form above that takes a
|
|
||||||
* net_decl_assign_t argument.
|
|
||||||
*/
|
|
||||||
void pform_makewire(const struct vlltype&li,
|
void pform_makewire(const struct vlltype&li,
|
||||||
std::list<PExpr*>*delay,
|
std::list<PExpr*>*delay,
|
||||||
str_pair_t str,
|
str_pair_t str,
|
||||||
std::list<decl_assignment_t*>*assign_list,
|
std::list<decl_assignment_t*>*assign_list,
|
||||||
NetNet::Type type,
|
NetNet::Type type,
|
||||||
data_type_t*data_type)
|
data_type_t*data_type,
|
||||||
|
list<named_pexpr_t>*attr)
|
||||||
{
|
{
|
||||||
if (is_compilation_unit(lexical_scope) && !gn_system_verilog()) {
|
if (is_compilation_unit(lexical_scope) && !gn_system_verilog()) {
|
||||||
VLerror(li, "error: variable declarations must be contained within a module.");
|
VLerror(li, "error: variable declarations must be contained within a module.");
|
||||||
|
|
@ -2935,7 +2865,7 @@ void pform_makewire(const struct vlltype&li,
|
||||||
names->push_back(curp->name);
|
names->push_back(curp->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
pform_set_data_type(li, data_type, names, type, 0);
|
pform_set_data_type(li, data_type, names, type, attr);
|
||||||
|
|
||||||
while (! assign_list->empty()) {
|
while (! assign_list->empty()) {
|
||||||
decl_assignment_t*first = assign_list->front();
|
decl_assignment_t*first = assign_list->front();
|
||||||
|
|
|
||||||
36
pform.h
36
pform.h
|
|
@ -96,12 +96,6 @@ struct parmvalue_t {
|
||||||
struct str_pair_t { ivl_drive_t str0, str1; };
|
struct str_pair_t { ivl_drive_t str0, str1; };
|
||||||
|
|
||||||
|
|
||||||
struct net_decl_assign_t {
|
|
||||||
perm_string name;
|
|
||||||
PExpr*expr;
|
|
||||||
struct net_decl_assign_t*next;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The lgate is gate instantiation information. */
|
/* The lgate is gate instantiation information. */
|
||||||
struct lgate {
|
struct lgate {
|
||||||
explicit inline lgate(int =0)
|
explicit inline lgate(int =0)
|
||||||
|
|
@ -361,38 +355,20 @@ extern void pform_makewire(const struct vlltype&li, perm_string name,
|
||||||
ivl_variable_type_t,
|
ivl_variable_type_t,
|
||||||
std::list<named_pexpr_t>*attr);
|
std::list<named_pexpr_t>*attr);
|
||||||
|
|
||||||
/* This form handles simple declarations */
|
|
||||||
extern void pform_makewire(const struct vlltype&li,
|
|
||||||
std::list<pform_range_t>*range,
|
|
||||||
bool signed_flag,
|
|
||||||
std::list<perm_string>*names,
|
|
||||||
NetNet::Type type,
|
|
||||||
NetNet::PortType,
|
|
||||||
ivl_variable_type_t,
|
|
||||||
std::list<named_pexpr_t>*attr,
|
|
||||||
PWSRType rt = SR_NET);
|
|
||||||
|
|
||||||
/* This form handles assignment declarations. */
|
/* This form handles assignment declarations. */
|
||||||
extern void pform_makewire(const struct vlltype&li,
|
|
||||||
std::list<PExpr*>*delay,
|
|
||||||
str_pair_t str,
|
|
||||||
net_decl_assign_t*assign_list,
|
|
||||||
NetNet::Type type,
|
|
||||||
data_type_t*data_type);
|
|
||||||
|
|
||||||
extern void pform_makewire(const struct vlltype&li,
|
extern void pform_makewire(const struct vlltype&li,
|
||||||
std::list<PExpr*>*delay,
|
std::list<PExpr*>*delay,
|
||||||
str_pair_t str,
|
str_pair_t str,
|
||||||
std::list<decl_assignment_t*>*assign_list,
|
std::list<decl_assignment_t*>*assign_list,
|
||||||
NetNet::Type type,
|
NetNet::Type type,
|
||||||
data_type_t*data_type);
|
data_type_t*data_type,
|
||||||
|
std::list<named_pexpr_t>*attr = 0);
|
||||||
|
|
||||||
/* This form handles nets declared as structures. (See pform_struct_type.cc) */
|
extern void pform_make_var(const struct vlltype&loc,
|
||||||
extern void pform_makewire(const struct vlltype&li,
|
std::list<decl_assignment_t*>*assign_list,
|
||||||
struct_type_t*struct_type,
|
data_type_t*data_type,
|
||||||
NetNet::PortType,
|
std::list<named_pexpr_t>*attr = 0);
|
||||||
std::list<perm_string>*names,
|
|
||||||
std::list<named_pexpr_t>*attr);
|
|
||||||
|
|
||||||
extern void pform_make_var_init(const struct vlltype&li,
|
extern void pform_make_var_init(const struct vlltype&li,
|
||||||
perm_string name, PExpr*expr);
|
perm_string name, PExpr*expr);
|
||||||
|
|
|
||||||
|
|
@ -91,32 +91,3 @@ void pform_set_struct_type(const struct vlltype&li, struct_type_t*struct_type, l
|
||||||
pform_set_struct_type(li, struct_type, *cur, net_type, attr);
|
pform_set_struct_type(li, struct_type, *cur, net_type, attr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pform_makewire(const struct vlltype&li,
|
|
||||||
struct_type_t*struct_type,
|
|
||||||
NetNet::PortType ptype,
|
|
||||||
perm_string name,
|
|
||||||
list<named_pexpr_t>*)
|
|
||||||
{
|
|
||||||
ivl_variable_type_t base_type = struct_type->figure_packed_base_type();
|
|
||||||
|
|
||||||
PWire*cur = pform_get_make_wire_in_scope(li, name, NetNet::WIRE, ptype, base_type);
|
|
||||||
assert(cur);
|
|
||||||
FILE_NAME(cur, li);
|
|
||||||
cur->set_data_type(struct_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pform_makewire(const struct vlltype&li,
|
|
||||||
struct_type_t*struct_type,
|
|
||||||
NetNet::PortType ptype,
|
|
||||||
list<perm_string>*names,
|
|
||||||
list<named_pexpr_t>*attr)
|
|
||||||
{
|
|
||||||
for (list<perm_string>::iterator cur = names->begin()
|
|
||||||
; cur != names->end() ; ++ cur ) {
|
|
||||||
perm_string txt = *cur;
|
|
||||||
pform_makewire(li, struct_type, ptype, txt, attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete names;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue