procedural blocking assignment delays.
This commit is contained in:
parent
a7b3f697cf
commit
6852a62e5a
19
Statement.cc
19
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,
|
||||
|
|
|
|||
14
Statement.h
14
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 <string>
|
||||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
47
elaborate.cc
47
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<string,Module*>&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.
|
||||
*
|
||||
|
|
|
|||
7
parse.y
7
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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue