diff --git a/LineInfo.h b/LineInfo.h index 81c07b834..2f83cd867 100644 --- a/LineInfo.h +++ b/LineInfo.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: LineInfo.h,v 1.1 1999/01/25 05:45:56 steve Exp $" +#ident "$Id: LineInfo.h,v 1.2 1999/02/01 00:26:48 steve Exp $" #endif # include @@ -34,6 +34,11 @@ class LineInfo { return file_ + ":" + buf; } + void set_line(const LineInfo&that) + { file_ = that.file_; + lineno_ = that.lineno_; + } + void set_file(const string&f) { file_ = f; } void set_lineno(unsigned n) { lineno_ = n; } @@ -44,6 +49,13 @@ class LineInfo { /* * $Log: LineInfo.h,v $ + * Revision 1.2 1999/02/01 00:26:48 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.1 1999/01/25 05:45:56 steve * Add the LineInfo class to carry the source file * location of things. PGate, Statement and PProcess. diff --git a/design_dump.cc b/design_dump.cc index 0a02a6bd1..729d22427 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: design_dump.cc,v 1.9 1998/12/20 02:05:41 steve Exp $" +#ident "$Id: design_dump.cc,v 1.10 1999/02/01 00:26:48 steve Exp $" #endif /* @@ -260,10 +260,10 @@ void NetProcTop::dump(ostream&o, unsigned ind) const { switch (type_) { case NetProcTop::KINITIAL: - o << "initial" << endl; + o << "initial /* " << get_line() << " */" << endl; break; case NetProcTop::KALWAYS: - o << "always" << endl; + o << "always /* " << get_line() << " */" << endl; break; } @@ -338,9 +338,13 @@ void NetPEvent::dump(ostream&o, unsigned ind) const o << "wait (" << name() << ")"; break; } - o << endl; - statement_->dump(o, ind+2); + if (statement_) { + o << endl; + statement_->dump(o, ind+2); + } else { + o << " /* noop */;" << endl; + } } @@ -464,6 +468,13 @@ void Design::dump(ostream&o) const /* * $Log: design_dump.cc,v $ + * Revision 1.10 1999/02/01 00:26:48 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.9 1998/12/20 02:05:41 steve * Function to calculate wire initial value. * diff --git a/elaborate.cc b/elaborate.cc index 631fea71c..e2057ce9b 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: elaborate.cc,v 1.11 1999/01/25 05:45:56 steve Exp $" +#ident "$Id: elaborate.cc,v 1.12 1999/02/01 00:26:49 steve Exp $" #endif /* @@ -226,6 +226,7 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const "of parameters. Expecting " << rmod->ports.size() << ", got " << pin_count() << "." << endl; + des->errors += 1; return; } @@ -246,6 +247,17 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, const string&path) const rmod->ports[idx]->name); assert(prt); + // Check that the parts have matching pin counts. If + // not, they are different widths. + if (prt->pin_count() != sig->pin_count()) { + cerr << get_line() << ": Port " << + rmod->ports[idx]->name << " of " << type_ << + " expects " << prt->pin_count() << " pins, got " << + sig->pin_count() << " from " << sig->name() << endl; + des->errors += 1; + continue; + } + assert(prt->pin_count() == sig->pin_count()); switch (prt->port_type()) { // INPUT and OUTPUT ports are directional. Handle @@ -672,14 +684,21 @@ NetProc* PDelayStatement::elaborate(Design*des, const string&path) const /* * An event statement gets elaborated as a gate net that drives a * special node, the NetPEvent. The NetPEvent is also a NetProc class - * becuase execution flows through it. Thus, the NetPEvent connects + * because execution flows through it. Thus, the NetPEvent connects * the structural and the behavioral. + * + * Note that it is possible for the statement_ pointer to be 0. This + * happens when the source has something like "@(E) ;". Note the null + * statement. */ NetProc* PEventStatement::elaborate(Design*des, const string&path) const { - NetProc*enet = statement_->elaborate(des, path); - if (enet == 0) - return 0; + NetProc*enet = 0; + if (statement_) { + enet = statement_->elaborate(des, path); + if (enet == 0) + return 0; + } NetPEvent*ev = new NetPEvent(des->local_symbol(path), type_, enet); @@ -794,6 +813,7 @@ bool Module::elaborate(Design*des, const string&path) const break; } + top->set_line(*(*st)); des->add_process(top); } @@ -831,6 +851,13 @@ Design* elaborate(const map&modules, /* * $Log: elaborate.cc,v $ + * Revision 1.12 1999/02/01 00:26:49 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.11 1999/01/25 05:45:56 steve * Add the LineInfo class to carry the source file * location of things. PGate, Statement and PProcess. diff --git a/emit.cc b/emit.cc index b0aff2630..a196255b8 100644 --- a/emit.cc +++ b/emit.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: emit.cc,v 1.4 1998/12/01 00:42:14 steve Exp $" +#ident "$Id: emit.cc,v 1.5 1999/02/01 00:26:49 steve Exp $" #endif /* @@ -67,6 +67,7 @@ void NetBUFZ::emit_node(ostream&o, struct target_t*tgt) const void NetProcTop::emit(ostream&o, struct target_t*tgt) const { + assert(statement_); tgt->start_process(o, this); statement_->emit_proc(o, tgt); @@ -101,7 +102,7 @@ void NetPDelay::emit_proc(ostream&o, struct target_t*tgt) const void NetPDelay::emit_proc_recurse(ostream&o, struct target_t*tgt) const { - statement_->emit_proc(o, tgt); + if (statement_) statement_->emit_proc(o, tgt); } void NetPEvent::emit_proc(ostream&o, struct target_t*tgt) const @@ -111,7 +112,7 @@ void NetPEvent::emit_proc(ostream&o, struct target_t*tgt) const void NetPEvent::emit_proc_recurse(ostream&o, struct target_t*tgt) const { - statement_->emit_proc(o, tgt); + if (statement_) statement_->emit_proc(o, tgt); } void NetTask::emit_proc(ostream&o, struct target_t*tgt) const @@ -223,6 +224,13 @@ void emit(ostream&o, const Design*des, const char*type) /* * $Log: emit.cc,v $ + * Revision 1.5 1999/02/01 00:26:49 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.4 1998/12/01 00:42:14 steve * Elaborate UDP devices, * Support UDP type attributes, and diff --git a/main.cc b/main.cc index fd4b69d18..a35528315 100644 --- a/main.cc +++ b/main.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: main.cc,v 1.12 1999/01/24 01:35:36 steve Exp $" +#ident "$Id: main.cc,v 1.13 1999/02/01 00:26:49 steve Exp $" #endif # include @@ -188,6 +188,10 @@ int main(int argc, char*argv[]) cerr << "Unable to elaborate design." << endl; return 1; } + if (des->errors) { + cerr << des->errors << " error(s) elaborating design." << endl; + return des->errors; + } des->set_flags(flags); @@ -224,6 +228,13 @@ int main(int argc, char*argv[]) /* * $Log: main.cc,v $ + * Revision 1.13 1999/02/01 00:26:49 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.12 1999/01/24 01:35:36 steve * Support null target for generating no output. * diff --git a/netlist.h b/netlist.h index e208ddc1f..d7b9f0da5 100644 --- a/netlist.h +++ b/netlist.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: netlist.h,v 1.15 1998/12/20 02:05:41 steve Exp $" +#ident "$Id: netlist.h,v 1.16 1999/02/01 00:26:49 steve Exp $" #endif /* @@ -31,6 +31,7 @@ # include # include # include "verinum.h" +# include "LineInfo.h" class NetNode; class NetProc; @@ -662,7 +663,7 @@ class NetWhile : public NetProc { /* The is the top of any process. It carries the type (initial or always) and a pointer to the statement, probably a block, that makes up the process. */ -class NetProcTop { +class NetProcTop : public LineInfo { public: enum Type { KINITIAL, KALWAYS }; @@ -819,7 +820,7 @@ class NetESignal : public NetExpr { class Design { public: - Design() : signals_(0), nodes_(0), procs_(0), lcounter_(0) { } + Design() : errors(0), signals_(0), nodes_(0), procs_(0), lcounter_(0) { } /* The flags are a generic way of accepting command line parameters/flags and passing them to the processing steps @@ -856,6 +857,9 @@ class Design { void clear_signal_marks(); NetNet*find_signal(bool (*test)(const NetNet*)); + // This is incremented by elaboration when an error is + // detected. It prevents code being emitted. + unsigned errors; public: string local_symbol(const string&path); @@ -921,6 +925,13 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.16 1999/02/01 00:26:49 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.15 1998/12/20 02:05:41 steve * Function to calculate wire initial value. * diff --git a/pform_dump.cc b/pform_dump.cc index ab01106fa..16b5a3d3b 100644 --- a/pform_dump.cc +++ b/pform_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: pform_dump.cc,v 1.7 1998/12/01 00:42:14 steve Exp $" +#ident "$Id: pform_dump.cc,v 1.8 1999/02/01 00:26:49 steve Exp $" #endif /* @@ -99,16 +99,16 @@ void PWire::dump(ostream&out) const switch (port_type) { case NetNet::PIMPLICIT: - out << "(implicit input) "; + out << " (implicit input)"; break; case NetNet::PINPUT: - out << "(input) "; + out << " (input)"; break; case NetNet::POUTPUT: - out << "(output) "; + out << " (output)"; break; case NetNet::PINOUT: - out << "(input output) "; + out << " (input output)"; break; case NetNet::NOT_A_PORT: break; @@ -116,10 +116,10 @@ void PWire::dump(ostream&out) const if (lsb || msb) { assert(lsb && msb); - out << "[" << *msb << ":" << *lsb << "] "; + out << " [" << *msb << ":" << *lsb << "]"; } - out << name << ";" << endl; + out << " " << name << ";" << endl; for (map::const_iterator idx = attributes.begin() ; idx != attributes.end() ; idx ++) { @@ -182,13 +182,15 @@ void Statement::dump(ostream&out, unsigned ind) const so just print the C++ typeid and let the user figure it out. */ out << setw(ind) << ""; - out << "/* " << typeid(*this) .name() << " */ ;" << endl; + out << "/* " << get_line() << ": " << typeid(*this).name() + << " */ ;" << endl; } void PAssign::dump(ostream&out, unsigned ind) const { out << setw(ind) << ""; - out << to_name_ << " = " << *expr_ << ";" << endl; + out << to_name_ << " = " << *expr_ << ";"; + out << " /* " << get_line() << " */" << endl; } void PBlock::dump(ostream&out, unsigned ind) const @@ -254,9 +256,14 @@ void PEventStatement::dump(ostream&out, unsigned ind) const out << "positive "; break; } - out << *expr_ << ")" << endl; + out << *expr_ << ")"; - statement_->dump(out, ind+2); + if (statement_) { + out << endl; + statement_->dump(out, ind+2); + } else { + out << " ;" << endl; + } } void PForStatement::dump(ostream&out, unsigned ind) const @@ -277,13 +284,15 @@ void PProcess::dump(ostream&out, unsigned ind) const { switch (type_) { case PProcess::PR_INITIAL: - out << setw(ind) << "" << "initial" << endl; + out << setw(ind) << "" << "initial"; break; case PProcess::PR_ALWAYS: - out << setw(ind) << "" << "always" << endl; + out << setw(ind) << "" << "always"; break; } + out << " /* " << get_line() << " */" << endl; + statement_->dump(out, ind+2); } @@ -364,6 +373,13 @@ void PUdp::dump(ostream&out) const /* * $Log: pform_dump.cc,v $ + * Revision 1.8 1999/02/01 00:26:49 steve + * Carry some line info to the netlist, + * Dump line numbers for processes. + * Elaborate prints errors about port vector + * width mismatch + * Emit better handles null statements. + * * Revision 1.7 1998/12/01 00:42:14 steve * Elaborate UDP devices, * Support UDP type attributes, and