mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-08-22 05:47:31 +02:00
Check for primitive port mismatches and other error cleanup
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
./ivltests/br_gh1175a.v:1: error: The UDP input port count (1) does not match the number of input table entries (6) in primitive "id_0".
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
./ivltests/br_gh1175b.v:1: error: The UDP input port count (1) does not match the number of input table entries (6) in primitive "id_0".
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
./ivltests/br_gh1175c.v:3: syntax error
|
||||||
|
./ivltests/br_gh1175c.v:3: errors in UDP table
|
||||||
|
./ivltests/br_gh1175c.v:1: error: Invalid table for UDP primitive id_0.
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
./ivltests/br_gh1175d.v:3: syntax error
|
||||||
|
./ivltests/br_gh1175d.v:3: errors in UDP table
|
||||||
|
./ivltests/br_gh1175d.v:1: error: Invalid table for UDP primitive id_0.
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
./ivltests/br_gh1175e.v:3: syntax error
|
||||||
|
./ivltests/br_gh1175e.v:3: errors in UDP table
|
||||||
|
./ivltests/br_gh1175e.v:1: error: Invalid table for UDP primitive id_0.
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
./ivltests/br_gh1175f.v:7: error: Primitive id_0 was already declared here: ./ivltests/br_gh1175f.v:1
|
||||||
|
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
primitive id_0(output id_2, input id_1);
|
||||||
|
table
|
||||||
|
? 1 ? 0 0 0 : 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
primitive id_0(output reg id_2, input id_1);
|
||||||
|
table
|
||||||
|
? 1 ? 0 0 0 : 0 : 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
primitive id_0(output id_2, input id_1);
|
||||||
|
table
|
||||||
|
0 : 0 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
primitive id_0(output reg id_2, input id_1);
|
||||||
|
table
|
||||||
|
0 : 0 0 : 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
primitive id_0(output reg id_2, input id_1);
|
||||||
|
table
|
||||||
|
0 : 0 : 0 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
primitive id_0(output reg id_2, input id_1);
|
||||||
|
table
|
||||||
|
0 : 0 : 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
|
|
||||||
|
primitive id_0(output reg id_2, input id_1);
|
||||||
|
table
|
||||||
|
1 : 0 : 0;
|
||||||
|
endtable
|
||||||
|
endprimitive
|
||||||
@@ -353,6 +353,12 @@ br_gh788 normal,-gno-io-range-error,-Wno-anachronisms ivltests gold=br_gh788.go
|
|||||||
br_gh793 normal ivltests
|
br_gh793 normal ivltests
|
||||||
br_gh827 normal ivltests gold=br_gh827.gold
|
br_gh827 normal ivltests gold=br_gh827.gold
|
||||||
br_gh889 normal,-gspecify ivltests gold=br_gh889.gold
|
br_gh889 normal,-gspecify ivltests gold=br_gh889.gold
|
||||||
|
br_gh1175a CE ivltests gold=br_gh1175a.gold
|
||||||
|
br_gh1175b CE ivltests gold=br_gh1175b.gold
|
||||||
|
br_gh1175c CE ivltests gold=br_gh1175c.gold
|
||||||
|
br_gh1175d CE ivltests gold=br_gh1175d.gold
|
||||||
|
br_gh1175e CE ivltests gold=br_gh1175e.gold
|
||||||
|
br_gh1175f CE ivltests gold=br_gh1175f.gold
|
||||||
br_gh1178a CE ivltests gold=br_gh1178a.gold
|
br_gh1178a CE ivltests gold=br_gh1178a.gold
|
||||||
br_gh1178b normal ivltests
|
br_gh1178b normal ivltests
|
||||||
br_gh1178c normal ivltests
|
br_gh1178c normal ivltests
|
||||||
|
|||||||
@@ -6703,7 +6703,8 @@ statement_item /* This is roughly statement_item in the LRM */
|
|||||||
current_block_stack.push(tmp);
|
current_block_stack.push(tmp);
|
||||||
}
|
}
|
||||||
block_item_decls_opt
|
block_item_decls_opt
|
||||||
{ if (!$2) {
|
{
|
||||||
|
if (!$2) {
|
||||||
if ($4) {
|
if ($4) {
|
||||||
pform_requires_sv(@4, "Variable declaration in unnamed block");
|
pform_requires_sv(@4, "Variable declaration in unnamed block");
|
||||||
} else {
|
} else {
|
||||||
@@ -7133,7 +7134,7 @@ udp_body
|
|||||||
}
|
}
|
||||||
| K_table error K_endtable
|
| K_table error K_endtable
|
||||||
{ lex_end_table();
|
{ lex_end_table();
|
||||||
yyerror(@2, "Errors in UDP table");
|
yyerror(@2, "errors in UDP table");
|
||||||
yyerrok;
|
yyerrok;
|
||||||
$$ = 0;
|
$$ = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1798,7 +1798,7 @@ static void process_udp_table(PUdp*udp, list<string>*table,
|
|||||||
placed in the PUdp object.
|
placed in the PUdp object.
|
||||||
|
|
||||||
The table strings are made up by the parser to be two or
|
The table strings are made up by the parser to be two or
|
||||||
three substrings separated by ';', i.e.:
|
three substrings separated by ':', i.e.:
|
||||||
|
|
||||||
0101:1:1 (synchronous device entry)
|
0101:1:1 (synchronous device entry)
|
||||||
0101:0 (combinational device entry)
|
0101:0 (combinational device entry)
|
||||||
@@ -1814,40 +1814,36 @@ static void process_udp_table(PUdp*udp, list<string>*table,
|
|||||||
output.resize(table->size());
|
output.resize(table->size());
|
||||||
|
|
||||||
{ unsigned idx = 0;
|
{ unsigned idx = 0;
|
||||||
for (list<string>::iterator cur = table->begin()
|
for (list<string>::iterator cur = table->begin() ;
|
||||||
; cur != table->end() ; ++ cur , idx += 1) {
|
cur != table->end() ; ++cur , idx += 1) {
|
||||||
string tmp = *cur;
|
string tmp = *cur;
|
||||||
|
|
||||||
/* Pull the input values from the string. */
|
/* Pull the input values from the string. */
|
||||||
assert(tmp.find(':') == (udp->ports.size() - 1));
|
if (tmp.find(':') != (udp->ports.size()-1)) {
|
||||||
|
cerr << loc << ": error: "
|
||||||
|
<< "The UDP input port count (" << (udp->ports.size()-1)
|
||||||
|
<< ") does not match the number of input table entries ("
|
||||||
|
<< tmp.find(':') << ") in primitive \""
|
||||||
|
<< udp->name_ << "\"." << endl;
|
||||||
|
error_count += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
input[idx] = tmp.substr(0, udp->ports.size()-1);
|
input[idx] = tmp.substr(0, udp->ports.size()-1);
|
||||||
tmp = tmp.substr(udp->ports.size()-1);
|
tmp = tmp.substr(udp->ports.size()-1);
|
||||||
|
|
||||||
assert(tmp[0] == ':');
|
|
||||||
|
|
||||||
/* If this is a synchronous device, get the current
|
/* If this is a synchronous device, get the current
|
||||||
output string. */
|
output string. */
|
||||||
if (synchronous_flag) {
|
if (synchronous_flag) {
|
||||||
if (tmp.size() != 4) {
|
assert(tmp[0] == ':');
|
||||||
cerr << loc << ": error: "
|
|
||||||
<< "Invalid table format for"
|
|
||||||
<< " sequential primitive." << endl;
|
|
||||||
error_count += 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
assert(tmp.size() == 4);
|
assert(tmp.size() == 4);
|
||||||
current[idx] = tmp[1];
|
current[idx] = tmp[1];
|
||||||
tmp = tmp.substr(2);
|
tmp = tmp.substr(2);
|
||||||
|
|
||||||
} else if (tmp.size() != 2) {
|
|
||||||
cerr << loc << ": error: "
|
|
||||||
<< "Invalid table format for"
|
|
||||||
<< " combinational primitive." << endl;
|
|
||||||
error_count += 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Finally, extract the desired output. */
|
/* Finally, extract the desired output. */
|
||||||
|
assert(tmp[0] == ':');
|
||||||
assert(tmp.size() == 2);
|
assert(tmp.size() == 2);
|
||||||
output[idx] = tmp[1];
|
output[idx] = tmp[1];
|
||||||
}
|
}
|
||||||
@@ -2101,7 +2097,11 @@ void pform_make_udp(const struct vlltype&loc, perm_string name,
|
|||||||
|
|
||||||
// Put the primitive into the primitives table
|
// Put the primitive into the primitives table
|
||||||
if (pform_primitives[name]) {
|
if (pform_primitives[name]) {
|
||||||
VLerror("error: UDP primitive already exists.");
|
ostringstream msg;
|
||||||
|
msg << "error: Primitive " << name << " was already declared here: "
|
||||||
|
<< pform_primitives[name]->get_fileline() << endl;
|
||||||
|
// Some compilers warn if there is just a single C string.
|
||||||
|
VLerror(loc, msg.str().c_str(), "");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
PUdp*udp = new PUdp(name, pins.size());
|
PUdp*udp = new PUdp(name, pins.size());
|
||||||
@@ -2115,11 +2115,18 @@ void pform_make_udp(const struct vlltype&loc, perm_string name,
|
|||||||
udp->ports[idx] = pins[idx]->basename();
|
udp->ports[idx] = pins[idx]->basename();
|
||||||
|
|
||||||
ivl_assert(loc, udp);
|
ivl_assert(loc, udp);
|
||||||
ivl_assert(loc, table);
|
if (table) {
|
||||||
process_udp_table(udp, table, loc);
|
process_udp_table(udp, table, loc);
|
||||||
udp->initial = init;
|
udp->initial = init;
|
||||||
|
|
||||||
pform_primitives[name] = udp;
|
pform_primitives[name] = udp;
|
||||||
|
} else {
|
||||||
|
ostringstream msg;
|
||||||
|
msg << "error: Invalid table for UDP primitive " << name
|
||||||
|
<< "." << endl;
|
||||||
|
// Some compilers warn if there is just a single C string.
|
||||||
|
VLerror(loc, msg.str().c_str(), "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delete parms;
|
delete parms;
|
||||||
|
|||||||
Reference in New Issue
Block a user