From 6852a62e5a4cf0b4a5255d190d8df61a4152d235 Mon Sep 17 00:00:00 2001 From: steve Date: Mon, 12 Jul 1999 00:59:36 +0000 Subject: [PATCH] procedural blocking assignment delays. --- Statement.cc | 19 ++++++++++++++----- Statement.h | 14 ++++++++++---- elaborate.cc | 47 +++++++++++++++++++++++++++++++++++++++++++++-- parse.y | 7 ++++--- pform_dump.cc | 13 ++++++++++--- 5 files changed, 83 insertions(+), 17 deletions(-) diff --git a/Statement.cc b/Statement.cc index f9e8b6be6..815858d7c 100644 --- a/Statement.cc +++ b/Statement.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: Statement.cc,v 1.11 1999/06/24 04:24:18 steve Exp $" +#ident "$Id: Statement.cc,v 1.12 1999/07/12 00:59:36 steve Exp $" #endif # include "Statement.h" @@ -27,19 +27,25 @@ Statement::~Statement() { } -PAssign_::PAssign_(PExpr*lval, PExpr*ex) -: lval_(lval), rval_(ex) +PAssign_::PAssign_(PExpr*lval, PExpr*de, PExpr*ex) +: lval_(lval), delay_(de), rval_(ex) { } PAssign_::~PAssign_() { delete lval_; + delete delay_; delete rval_; } PAssign::PAssign(PExpr*lval, PExpr*ex) -: PAssign_(lval, ex) +: PAssign_(lval, 0, ex) +{ +} + +PAssign::PAssign(PExpr*lval, PExpr*d, PExpr*ex) +: PAssign_(lval, d, ex) { } @@ -48,7 +54,7 @@ PAssign::~PAssign() } PAssignNB::PAssignNB(PExpr*lval, PExpr*ex) -: PAssign_(lval, ex) +: PAssign_(lval, 0, ex) { } @@ -137,6 +143,9 @@ PWhile::~PWhile() /* * $Log: Statement.cc,v $ + * Revision 1.12 1999/07/12 00:59:36 steve + * procedural blocking assignment delays. + * * Revision 1.11 1999/06/24 04:24:18 steve * Handle expression widths for EEE and NEE operators, * add named blocks and scope handling, diff --git a/Statement.h b/Statement.h index 4a4bc81b2..12f44341a 100644 --- a/Statement.h +++ b/Statement.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: Statement.h,v 1.14 1999/07/03 02:12:51 steve Exp $" +#ident "$Id: Statement.h,v 1.15 1999/07/12 00:59:36 steve Exp $" #endif # include @@ -77,11 +77,12 @@ class Statement : public LineInfo { */ class PAssign_ : public Statement { public: - explicit PAssign_(PExpr*lval, PExpr*ex); + explicit PAssign_(PExpr*lval, PExpr*de, PExpr*ex); virtual ~PAssign_() =0; - const PExpr* lval() const { return lval_; } - const PExpr* rval() const { return rval_; } + const PExpr* lval() const { return lval_; } + const PExpr* delay() const { return delay_; } + const PExpr* rval() const { return rval_; } protected: NetNet*elaborate_lval(Design*, const string&path, @@ -90,6 +91,7 @@ class PAssign_ : public Statement { private: PExpr* lval_; + PExpr* delay_; PExpr* rval_; }; @@ -97,6 +99,7 @@ class PAssign : public PAssign_ { public: explicit PAssign(PExpr*lval, PExpr*ex); + explicit PAssign(PExpr*lval, PExpr*de, PExpr*ex); ~PAssign(); virtual void dump(ostream&out, unsigned ind) const; @@ -330,6 +333,9 @@ class PWhile : public Statement { /* * $Log: Statement.h,v $ + * Revision 1.15 1999/07/12 00:59:36 steve + * procedural blocking assignment delays. + * * Revision 1.14 1999/07/03 02:12:51 steve * Elaborate user defined tasks. * diff --git a/elaborate.cc b/elaborate.cc index a9bcecf3a..7dcdef8dc 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.52 1999/07/10 03:00:05 steve Exp $" +#ident "$Id: elaborate.cc,v 1.53 1999/07/12 00:59:36 steve Exp $" #endif /* @@ -1136,13 +1136,20 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const } while(0); + + /* elaborate the lval. This detects any part selects and mux + expressions that might exist. */ unsigned lsb, msb; NetExpr*mux; NetNet*reg = elaborate_lval(des, path, msb, lsb, mux); if (reg == 0) return 0; - assert(rval()); + /* If there is a delay expression, elaborate it. */ + verinum*dex = delay() ? delay()->eval_const(des, path) : 0; + + /* Elaborate the r-value expression. */ + assert(rval()); NetExpr*rv = rval()->elaborate_expr(des, path); if (rv == 0) { cerr << get_line() << ": failed to elaborate expression." @@ -1152,6 +1159,33 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const assert(rv); NetAssign*cur; + + /* Rewrite delayed assignments as assignments that are + delayed. This only works if the l-value has no mux + expression. */ + if (dex && (mux == 0)) { + string tp = des->local_symbol(path); + unsigned wid = msb - lsb + 1; + cur = new NetAssign(tp, des, wid, rv); + for (unsigned idx = 0 ; idx < wid ; idx += 1) + connect(cur->pin(idx), reg->pin(idx+lsb)); + + cur->set_line(*this); + des->add_node(cur); + NetPDelay*dep = new NetPDelay(dex->as_ulong(), cur); + + delete dex; + return dep; + } + + if (dex) { + delete dex; + cerr << delay()->get_line() << ": Sorry, delay expression " + "(or l-value) too complicated." << endl; + des->errors += 1; + } + + if (mux == 0) { unsigned wid = msb - lsb + 1; cur = new NetAssign(des->local_symbol(path), des, wid, rv); @@ -1201,6 +1235,12 @@ NetProc* PAssignNB::elaborate(Design*des, const string&path) const } assert(rv); + if (delay()) { + cerr << delay()->get_line() << ": Sorry, I cannot elaborate " + "assignment delay expressions." << endl; + des->errors += 1; + } + NetAssignNB*cur; if (mux == 0) { unsigned wid = msb - lsb + 1; @@ -1723,6 +1763,9 @@ Design* elaborate(const map&modules, /* * $Log: elaborate.cc,v $ + * Revision 1.53 1999/07/12 00:59:36 steve + * procedural blocking assignment delays. + * * Revision 1.52 1999/07/10 03:00:05 steve * Proper initialization of registers. * diff --git a/parse.y b/parse.y index f065c26e5..46a9e195d 100644 --- a/parse.y +++ b/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: parse.y,v 1.50 1999/07/10 02:19:26 steve Exp $" +#ident "$Id: parse.y,v 1.51 1999/07/12 00:59:36 steve Exp $" #endif # include "parse_misc.h" @@ -263,6 +263,8 @@ delay_value $$ = 0; } else { $$ = new PENumber(tmp); + $$->set_file(@1.text); + $$->set_lineno(@1.first_line); } } | IDENTIFIER @@ -1453,8 +1455,7 @@ statement $$ = tmp; } | lpvalue '=' delay expression ';' - { yyerror(@1, "Sorry, assignment timing control not implemented."); - PAssign*tmp = new PAssign($1,$3); + { PAssign*tmp = new PAssign($1,$3,$4); tmp->set_file(@1.text); tmp->set_lineno(@1.first_line); $$ = tmp; diff --git a/pform_dump.cc b/pform_dump.cc index 712efe854..d8f8b4b0d 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.26 1999/07/03 02:12:52 steve Exp $" +#ident "$Id: pform_dump.cc,v 1.27 1999/07/12 00:59:36 steve Exp $" #endif /* @@ -262,14 +262,18 @@ void Statement::dump(ostream&out, unsigned ind) const void PAssign::dump(ostream&out, unsigned ind) const { out << setw(ind) << ""; - out << *lval() << " = " << *rval() << ";"; + out << *lval() << " = "; + if (delay()) out << "#" << *delay() << " "; + out << *rval() << ";"; out << " /* " << get_line() << " */" << endl; } void PAssignNB::dump(ostream&out, unsigned ind) const { out << setw(ind) << ""; - out << *lval() << " <= " << *rval() << ";"; + out << *lval() << " <= "; + if (delay()) out << "#" << *delay() << " "; + out << *rval() << ";"; out << " /* " << get_line() << " */" << endl; } @@ -521,6 +525,9 @@ void PUdp::dump(ostream&out) const /* * $Log: pform_dump.cc,v $ + * Revision 1.27 1999/07/12 00:59:36 steve + * procedural blocking assignment delays. + * * Revision 1.26 1999/07/03 02:12:52 steve * Elaborate user defined tasks. *