assignment with blocking event delay.
This commit is contained in:
parent
fcfa9d004a
commit
da4a7ea80a
26
Statement.cc
26
Statement.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: Statement.cc,v 1.14 1999/09/04 19:11:46 steve Exp $"
|
#ident "$Id: Statement.cc,v 1.15 1999/09/22 02:00:48 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "Statement.h"
|
# include "Statement.h"
|
||||||
|
|
@ -27,12 +27,22 @@ Statement::~Statement()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PAssign_::PAssign_(PExpr*lval, PExpr*ex)
|
||||||
|
: event_(0), lval_(lval), rval_(ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
PAssign_::PAssign_(PExpr*lval, PExpr*de, PExpr*ex)
|
PAssign_::PAssign_(PExpr*lval, PExpr*de, PExpr*ex)
|
||||||
: lval_(lval), rval_(ex)
|
: event_(0), lval_(lval), rval_(ex)
|
||||||
{
|
{
|
||||||
if (de) delay_.set_delay(de);
|
if (de) delay_.set_delay(de);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PAssign_::PAssign_(PExpr*lval, PEventStatement*ev, PExpr*ex)
|
||||||
|
: event_(ev), lval_(lval), rval_(ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
PAssign_::~PAssign_()
|
PAssign_::~PAssign_()
|
||||||
{
|
{
|
||||||
delete lval_;
|
delete lval_;
|
||||||
|
|
@ -40,7 +50,7 @@ PAssign_::~PAssign_()
|
||||||
}
|
}
|
||||||
|
|
||||||
PAssign::PAssign(PExpr*lval, PExpr*ex)
|
PAssign::PAssign(PExpr*lval, PExpr*ex)
|
||||||
: PAssign_(lval, 0, ex)
|
: PAssign_(lval, ex)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,12 +59,17 @@ PAssign::PAssign(PExpr*lval, PExpr*d, PExpr*ex)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PAssign::PAssign(PExpr*lval, PEventStatement*d, PExpr*ex)
|
||||||
|
: PAssign_(lval, d, ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
PAssign::~PAssign()
|
PAssign::~PAssign()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PAssignNB::PAssignNB(PExpr*lval, PExpr*ex)
|
PAssignNB::PAssignNB(PExpr*lval, PExpr*ex)
|
||||||
: PAssign_(lval, 0, ex)
|
: PAssign_(lval, ex)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -148,6 +163,9 @@ PWhile::~PWhile()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: Statement.cc,v $
|
* $Log: Statement.cc,v $
|
||||||
|
* Revision 1.15 1999/09/22 02:00:48 steve
|
||||||
|
* assignment with blocking event delay.
|
||||||
|
*
|
||||||
* Revision 1.14 1999/09/04 19:11:46 steve
|
* Revision 1.14 1999/09/04 19:11:46 steve
|
||||||
* Add support for delayed non-blocking assignments.
|
* Add support for delayed non-blocking assignments.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
14
Statement.h
14
Statement.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: Statement.h,v 1.18 1999/09/15 01:55:06 steve Exp $"
|
#ident "$Id: Statement.h,v 1.19 1999/09/22 02:00:48 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <string>
|
# include <string>
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
# include "LineInfo.h"
|
# include "LineInfo.h"
|
||||||
class PExpr;
|
class PExpr;
|
||||||
class Statement;
|
class Statement;
|
||||||
|
class PEventStatement;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The PProcess is the root of a behavioral process. Each process gets
|
* The PProcess is the root of a behavioral process. Each process gets
|
||||||
|
|
@ -78,7 +79,9 @@ class Statement : public LineInfo {
|
||||||
*/
|
*/
|
||||||
class PAssign_ : public Statement {
|
class PAssign_ : public Statement {
|
||||||
public:
|
public:
|
||||||
|
explicit PAssign_(PExpr*lval, PExpr*ex);
|
||||||
explicit PAssign_(PExpr*lval, PExpr*de, PExpr*ex);
|
explicit PAssign_(PExpr*lval, PExpr*de, PExpr*ex);
|
||||||
|
explicit PAssign_(PExpr*lval, PEventStatement*de, PExpr*ex);
|
||||||
virtual ~PAssign_() =0;
|
virtual ~PAssign_() =0;
|
||||||
|
|
||||||
const PExpr* lval() const { return lval_; }
|
const PExpr* lval() const { return lval_; }
|
||||||
|
|
@ -90,6 +93,7 @@ class PAssign_ : public Statement {
|
||||||
NetExpr*&mux) const;
|
NetExpr*&mux) const;
|
||||||
|
|
||||||
PDelays delay_;
|
PDelays delay_;
|
||||||
|
PEventStatement*event_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PExpr* lval_;
|
PExpr* lval_;
|
||||||
|
|
@ -101,6 +105,7 @@ class PAssign : public PAssign_ {
|
||||||
public:
|
public:
|
||||||
explicit PAssign(PExpr*lval, PExpr*ex);
|
explicit PAssign(PExpr*lval, PExpr*ex);
|
||||||
explicit PAssign(PExpr*lval, PExpr*de, PExpr*ex);
|
explicit PAssign(PExpr*lval, PExpr*de, PExpr*ex);
|
||||||
|
explicit PAssign(PExpr*lval, PEventStatement*de, PExpr*ex);
|
||||||
~PAssign();
|
~PAssign();
|
||||||
|
|
||||||
virtual void dump(ostream&out, unsigned ind) const;
|
virtual void dump(ostream&out, unsigned ind) const;
|
||||||
|
|
@ -260,6 +265,10 @@ class PEventStatement : public Statement {
|
||||||
virtual void dump(ostream&out, unsigned ind) const;
|
virtual void dump(ostream&out, unsigned ind) const;
|
||||||
virtual NetProc* elaborate(Design*des, const string&path) const;
|
virtual NetProc* elaborate(Design*des, const string&path) const;
|
||||||
|
|
||||||
|
// This method is used to elaborate, but attach a previously
|
||||||
|
// elaborated statement to the event.
|
||||||
|
NetProc* elaborate_st(Design*des, const string&path, NetProc*st) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
svector<PEEvent*>expr_;
|
svector<PEEvent*>expr_;
|
||||||
Statement*statement_;
|
Statement*statement_;
|
||||||
|
|
@ -337,6 +346,9 @@ class PWhile : public Statement {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: Statement.h,v $
|
* $Log: Statement.h,v $
|
||||||
|
* Revision 1.19 1999/09/22 02:00:48 steve
|
||||||
|
* assignment with blocking event delay.
|
||||||
|
*
|
||||||
* Revision 1.18 1999/09/15 01:55:06 steve
|
* Revision 1.18 1999/09/15 01:55:06 steve
|
||||||
* Elaborate non-blocking assignment to memories.
|
* Elaborate non-blocking assignment to memories.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
57
elaborate.cc
57
elaborate.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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: elaborate.cc,v 1.93 1999/09/20 02:21:10 steve Exp $"
|
#ident "$Id: elaborate.cc,v 1.94 1999/09/22 02:00:48 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1618,11 +1618,15 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const
|
||||||
#<d> a = tmp;
|
#<d> a = tmp;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
If the delay is an event delay, then the transform is
|
||||||
|
similar, with the event delay replacing the time delay. It
|
||||||
|
is an event delay if the event_ member has a value.
|
||||||
|
|
||||||
This rewriting of the expression allows me to not bother to
|
This rewriting of the expression allows me to not bother to
|
||||||
actually and literally represent the delayed assign in the
|
actually and literally represent the delayed assign in the
|
||||||
netlist. The compound statement is exactly equivalent. */
|
netlist. The compound statement is exactly equivalent. */
|
||||||
|
|
||||||
if (rise_time) {
|
if (rise_time || event_) {
|
||||||
string n = des->local_symbol(path);
|
string n = des->local_symbol(path);
|
||||||
unsigned wid = reg->pin_count();
|
unsigned wid = reg->pin_count();
|
||||||
|
|
||||||
|
|
@ -1658,12 +1662,31 @@ NetProc* PAssign::elaborate(Design*des, const string&path) const
|
||||||
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
for (unsigned idx = 0 ; idx < wid ; idx += 1)
|
||||||
connect(a2->pin(idx), reg->pin(idx));
|
connect(a2->pin(idx), reg->pin(idx));
|
||||||
|
|
||||||
/* And build up the complex statement. */
|
/* Generate the delay statement with the final
|
||||||
NetPDelay*de = new NetPDelay(rise_time, a2);
|
assignment attached to it. If this is an event delay,
|
||||||
|
elaborate the PEventStatement. Otherwise, create the
|
||||||
|
right NetPDelay object. */
|
||||||
|
NetProc*st;
|
||||||
|
if (event_) {
|
||||||
|
st = event_->elaborate_st(des, path, a2);
|
||||||
|
if (st == 0) {
|
||||||
|
cerr << event_->get_line() << ": error: "
|
||||||
|
"unable to elaborate event expression."
|
||||||
|
<< endl;
|
||||||
|
des->errors += 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
assert(st);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
NetPDelay*de = new NetPDelay(rise_time, a2);
|
||||||
|
st = de;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And build up the complex statement. */
|
||||||
NetBlock*bl = new NetBlock(NetBlock::SEQU);
|
NetBlock*bl = new NetBlock(NetBlock::SEQU);
|
||||||
bl->append(a1);
|
bl->append(a1);
|
||||||
bl->append(de);
|
bl->append(st);
|
||||||
|
|
||||||
return bl;
|
return bl;
|
||||||
}
|
}
|
||||||
|
|
@ -2132,14 +2155,9 @@ NetProc* PDelayStatement::elaborate(Design*des, const string&path) const
|
||||||
* happens when the source has something like "@(E) ;". Note the null
|
* happens when the source has something like "@(E) ;". Note the null
|
||||||
* statement.
|
* statement.
|
||||||
*/
|
*/
|
||||||
NetProc* PEventStatement::elaborate(Design*des, const string&path) const
|
NetProc* PEventStatement::elaborate_st(Design*des, const string&path,
|
||||||
|
NetProc*enet) const
|
||||||
{
|
{
|
||||||
NetProc*enet = 0;
|
|
||||||
if (statement_) {
|
|
||||||
enet = statement_->elaborate(des, path);
|
|
||||||
if (enet == 0)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a single NetPEvent, and a unique NetNEvent for each
|
/* Create a single NetPEvent, and a unique NetNEvent for each
|
||||||
conjuctive event. An NetNEvent can have many pins only if
|
conjuctive event. An NetNEvent can have many pins only if
|
||||||
|
|
@ -2172,6 +2190,18 @@ NetProc* PEventStatement::elaborate(Design*des, const string&path) const
|
||||||
return pe;
|
return pe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetProc* PEventStatement::elaborate(Design*des, const string&path) const
|
||||||
|
{
|
||||||
|
NetProc*enet = 0;
|
||||||
|
if (statement_) {
|
||||||
|
enet = statement_->elaborate(des, path);
|
||||||
|
if (enet == 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return elaborate_st(des, path, enet);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Forever statements are represented directly in the netlist. It is
|
* Forever statements are represented directly in the netlist. It is
|
||||||
* theoretically possible to use a while structure with a constant
|
* theoretically possible to use a while structure with a constant
|
||||||
|
|
@ -2583,6 +2613,9 @@ Design* elaborate(const map<string,Module*>&modules,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elaborate.cc,v $
|
* $Log: elaborate.cc,v $
|
||||||
|
* Revision 1.94 1999/09/22 02:00:48 steve
|
||||||
|
* assignment with blocking event delay.
|
||||||
|
*
|
||||||
* Revision 1.93 1999/09/20 02:21:10 steve
|
* Revision 1.93 1999/09/20 02:21:10 steve
|
||||||
* Elaborate parameters in phases.
|
* Elaborate parameters in phases.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
19
parse.y
19
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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: parse.y,v 1.64 1999/09/17 02:06:26 steve Exp $"
|
#ident "$Id: parse.y,v 1.65 1999/09/22 02:00:48 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
|
|
@ -1578,7 +1578,7 @@ statement
|
||||||
| lpvalue '=' delay expression ';'
|
| lpvalue '=' delay expression ';'
|
||||||
{ PExpr*del = (*$3)[0];
|
{ PExpr*del = (*$3)[0];
|
||||||
if ($3->count() != 1)
|
if ($3->count() != 1)
|
||||||
yyerror(@1, "Sorry, delay lists not supported here.");
|
yyerror(@1, "sorry: Delay lists not supported here.");
|
||||||
PAssign*tmp = new PAssign($1,del,$4);
|
PAssign*tmp = new PAssign($1,del,$4);
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
|
|
@ -1587,12 +1587,25 @@ statement
|
||||||
| lpvalue K_LE delay expression ';'
|
| lpvalue K_LE delay expression ';'
|
||||||
{ PExpr*del = (*$3)[0];
|
{ PExpr*del = (*$3)[0];
|
||||||
if ($3->count() != 1)
|
if ($3->count() != 1)
|
||||||
yyerror(@1, "Sorry, delay lists not supported here.");
|
yyerror(@1, "sorry: Delay lists not supported here.");
|
||||||
PAssignNB*tmp = new PAssignNB($1,del,$4);
|
PAssignNB*tmp = new PAssignNB($1,del,$4);
|
||||||
tmp->set_file(@1.text);
|
tmp->set_file(@1.text);
|
||||||
tmp->set_lineno(@1.first_line);
|
tmp->set_lineno(@1.first_line);
|
||||||
$$ = tmp;
|
$$ = tmp;
|
||||||
}
|
}
|
||||||
|
| lpvalue '=' event_control expression ';'
|
||||||
|
{ PAssign*tmp = new PAssign($1,$3,$4);
|
||||||
|
tmp->set_file(@1.text);
|
||||||
|
tmp->set_lineno(@1.first_line);
|
||||||
|
$$ = tmp;
|
||||||
|
}
|
||||||
|
| lpvalue K_LE event_control expression ';'
|
||||||
|
{ yyerror(@1, "sorry: Event controls not supported here.");
|
||||||
|
PAssignNB*tmp = new PAssignNB($1,$4);
|
||||||
|
tmp->set_file(@1.text);
|
||||||
|
tmp->set_lineno(@1.first_line);
|
||||||
|
$$ = tmp;
|
||||||
|
}
|
||||||
| K_wait '(' expression ')' statement_opt
|
| K_wait '(' expression ')' statement_opt
|
||||||
{ PEventStatement*tmp;
|
{ PEventStatement*tmp;
|
||||||
PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3);
|
PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue