Error messages for missing UDP port declarations.
This commit is contained in:
parent
9f3e64e11a
commit
467ecf5b33
5
parse.y
5
parse.y
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: parse.y,v 1.130 2001/10/14 02:03:51 steve Exp $"
|
#ident "$Id: parse.y,v 1.131 2001/10/21 01:55:24 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -2567,7 +2567,8 @@ udp_primitive
|
||||||
udp_init_opt
|
udp_init_opt
|
||||||
udp_body
|
udp_body
|
||||||
K_endprimitive
|
K_endprimitive
|
||||||
{ pform_make_udp($2, $4, $7, $9, $8);
|
{ pform_make_udp($2, $4, $7, $9, $8,
|
||||||
|
@2.text, @2.first_line);
|
||||||
delete[]$2;
|
delete[]$2;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
|
||||||
86
pform.cc
86
pform.cc
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: pform.cc,v 1.81 2001/10/21 00:42:48 steve Exp $"
|
#ident "$Id: pform.cc,v 1.82 2001/10/21 01:55:24 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -188,8 +188,10 @@ PExpr* pform_select_mtm_expr(PExpr*min, PExpr*typ, PExpr*max)
|
||||||
|
|
||||||
void pform_make_udp(const char*name, list<string>*parms,
|
void pform_make_udp(const char*name, list<string>*parms,
|
||||||
svector<PWire*>*decl, list<string>*table,
|
svector<PWire*>*decl, list<string>*table,
|
||||||
Statement*init_expr)
|
Statement*init_expr,
|
||||||
|
const char*file, unsigned lineno)
|
||||||
{
|
{
|
||||||
|
unsigned local_errors = 0;
|
||||||
assert(parms->size() > 0);
|
assert(parms->size() > 0);
|
||||||
|
|
||||||
/* Put the declarations into a map, so that I can check them
|
/* Put the declarations into a map, so that I can check them
|
||||||
|
|
@ -220,28 +222,92 @@ void pform_make_udp(const char*name, list<string>*parms,
|
||||||
|
|
||||||
|
|
||||||
/* Put the parameters into a vector of wire descriptions. Look
|
/* Put the parameters into a vector of wire descriptions. Look
|
||||||
in the map for the definitions of the name. */
|
in the map for the definitions of the name. In this loop,
|
||||||
|
the parms list in the list of ports in the port list of the
|
||||||
|
UDP declaration, and the defs map maps that name to a
|
||||||
|
PWire* created by an input or output declaration. */
|
||||||
svector<PWire*> pins (parms->size());
|
svector<PWire*> pins (parms->size());
|
||||||
|
svector<string> pin_names (parms->size());
|
||||||
{ list<string>::iterator cur;
|
{ list<string>::iterator cur;
|
||||||
unsigned idx;
|
unsigned idx;
|
||||||
for (cur = parms->begin(), idx = 0
|
for (cur = parms->begin(), idx = 0
|
||||||
; cur != parms->end()
|
; cur != parms->end()
|
||||||
; idx++, cur++) {
|
; idx++, cur++) {
|
||||||
pins[idx] = defs[*cur];
|
pins[idx] = defs[*cur];
|
||||||
|
pin_names[idx] = *cur;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that the output is an output and the inputs are
|
/* Check that the output is an output and the inputs are
|
||||||
inputs. I can also make sure that only the single output is
|
inputs. I can also make sure that only the single output is
|
||||||
declared a register, if anything. */
|
declared a register, if anything. The possible errors are:
|
||||||
|
|
||||||
|
-- an input port (not the first) is missing an input
|
||||||
|
declaration.
|
||||||
|
|
||||||
|
-- An input port is declared output.
|
||||||
|
|
||||||
|
*/
|
||||||
assert(pins.count() > 0);
|
assert(pins.count() > 0);
|
||||||
assert(pins[0]);
|
do {
|
||||||
assert(pins[0]->get_port_type() == NetNet::POUTPUT);
|
if (pins[0] == 0) {
|
||||||
|
cerr << file<<":"<<lineno << ": error: "
|
||||||
|
<< "Output port of primitive " << name
|
||||||
|
<< " missing output declaration." << endl;
|
||||||
|
cerr << file<<":"<<lineno << ": : "
|
||||||
|
<< "Try: output " << pin_names[0] << ";"
|
||||||
|
<< endl;
|
||||||
|
error_count += 1;
|
||||||
|
local_errors += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pins[0]->get_port_type() != NetNet::POUTPUT) {
|
||||||
|
cerr << file<<":"<<lineno << ": error: "
|
||||||
|
<< "The first port of a primitive"
|
||||||
|
<< " must be an output." << endl;
|
||||||
|
cerr << file<<":"<<lineno << ": : "
|
||||||
|
<< "Try: output " << pin_names[0] << ";"
|
||||||
|
<< endl;
|
||||||
|
error_count += 1;
|
||||||
|
local_errors += 1;
|
||||||
|
break;;
|
||||||
|
}
|
||||||
|
} while (0);
|
||||||
|
|
||||||
for (unsigned idx = 1 ; idx < pins.count() ; idx += 1) {
|
for (unsigned idx = 1 ; idx < pins.count() ; idx += 1) {
|
||||||
assert(pins[idx]);
|
if (pins[idx] == 0) {
|
||||||
assert(pins[idx]->get_port_type() == NetNet::PINPUT);
|
cerr << file<<":"<<lineno << ": error: "
|
||||||
|
<< "Port " << (idx+1)
|
||||||
|
<< " of primitive " << name << " missing"
|
||||||
|
<< " input declaration." << endl;
|
||||||
|
cerr << file<<":"<<lineno << ": : "
|
||||||
|
<< "Try: input " << pin_names[idx] << ";"
|
||||||
|
<< endl;
|
||||||
|
error_count += 1;
|
||||||
|
local_errors += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (pins[idx]->get_port_type() != NetNet::PINPUT) {
|
||||||
|
cerr << file<<":"<<lineno << ": error: "
|
||||||
|
<< "Port " << (idx+1)
|
||||||
|
<< " of primitive " << name << " in an input port"
|
||||||
|
<< " with an output declaration." << endl;
|
||||||
|
cerr << file<<":"<<lineno << ": : "
|
||||||
|
<< "Try: input " << pin_names[idx] << ";"
|
||||||
|
<< endl;
|
||||||
|
error_count += 1;
|
||||||
|
local_errors += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
assert(pins[idx]->get_wire_type() != NetNet::REG);
|
assert(pins[idx]->get_wire_type() != NetNet::REG);
|
||||||
}
|
}
|
||||||
|
if (local_errors > 0) {
|
||||||
|
delete parms;
|
||||||
|
delete decl;
|
||||||
|
delete table;
|
||||||
|
delete init_expr;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Interpret and check the table entry strings, to make sure
|
/* Interpret and check the table entry strings, to make sure
|
||||||
they correspond to the inputs, output and output type. Make
|
they correspond to the inputs, output and output type. Make
|
||||||
|
|
@ -319,6 +385,7 @@ void pform_make_udp(const char*name, list<string>*parms,
|
||||||
pform_primitives[name] = udp;
|
pform_primitives[name] = udp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Delete the excess tables and lists from the parser. */
|
/* Delete the excess tables and lists from the parser. */
|
||||||
delete parms;
|
delete parms;
|
||||||
delete decl;
|
delete decl;
|
||||||
|
|
@ -1030,6 +1097,9 @@ int pform_parse(const char*path, FILE*file)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.cc,v $
|
* $Log: pform.cc,v $
|
||||||
|
* Revision 1.82 2001/10/21 01:55:24 steve
|
||||||
|
* Error messages for missing UDP port declarations.
|
||||||
|
*
|
||||||
* Revision 1.81 2001/10/21 00:42:48 steve
|
* Revision 1.81 2001/10/21 00:42:48 steve
|
||||||
* Module types in pform are char* instead of string.
|
* Module types in pform are char* instead of string.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
8
pform.h
8
pform.h
|
|
@ -19,7 +19,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT) && !defined(macintosh)
|
#if !defined(WINNT) && !defined(macintosh)
|
||||||
#ident "$Id: pform.h,v 1.48 2001/10/21 00:42:48 steve Exp $"
|
#ident "$Id: pform.h,v 1.49 2001/10/21 01:55:25 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -115,7 +115,8 @@ extern void pform_endmodule(const char*);
|
||||||
|
|
||||||
extern void pform_make_udp(const char*name, list<string>*parms,
|
extern void pform_make_udp(const char*name, list<string>*parms,
|
||||||
svector<PWire*>*decl, list<string>*table,
|
svector<PWire*>*decl, list<string>*table,
|
||||||
Statement*init);
|
Statement*init,
|
||||||
|
const char*file, unsigned lineno);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enter/exit name scopes.
|
* Enter/exit name scopes.
|
||||||
|
|
@ -200,6 +201,9 @@ extern void pform_dump(ostream&out, Module*mod);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pform.h,v $
|
* $Log: pform.h,v $
|
||||||
|
* Revision 1.49 2001/10/21 01:55:25 steve
|
||||||
|
* Error messages for missing UDP port declarations.
|
||||||
|
*
|
||||||
* Revision 1.48 2001/10/21 00:42:48 steve
|
* Revision 1.48 2001/10/21 00:42:48 steve
|
||||||
* Module types in pform are char* instead of string.
|
* Module types in pform are char* instead of string.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue