Detect temporaries in sequential block synthesis.
This commit is contained in:
parent
d94b0fe3c8
commit
2fad8d4cff
8
async.cc
8
async.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: async.cc,v 1.3 2002/08/12 01:34:58 steve Exp $"
|
||||
#ident "$Id: async.cc,v 1.4 2002/08/18 22:07:16 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -38,6 +38,9 @@ bool NetCondit::is_asynchronous()
|
|||
|
||||
bool NetEvWait::is_asynchronous()
|
||||
{
|
||||
/* The "sense" set contains the set of Nexa that are in the
|
||||
sensitivity list. We also presume here that the list is
|
||||
only LEVEL sensitive. */
|
||||
NexusSet*sense = new NexusSet;
|
||||
for (unsigned idx = 0 ; idx < nevents_ ; idx += 1) {
|
||||
NexusSet*tmp = event(idx)->nex_async_();
|
||||
|
|
@ -78,6 +81,9 @@ bool NetProcTop::is_asynchronous()
|
|||
|
||||
/*
|
||||
* $Log: async.cc,v $
|
||||
* Revision 1.4 2002/08/18 22:07:16 steve
|
||||
* Detect temporaries in sequential block synthesis.
|
||||
*
|
||||
* Revision 1.3 2002/08/12 01:34:58 steve
|
||||
* conditional ident string using autoconfig.
|
||||
*
|
||||
|
|
|
|||
34
net_link.cc
34
net_link.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: net_link.cc,v 1.10 2002/08/12 01:34:59 steve Exp $"
|
||||
#ident "$Id: net_link.cc,v 1.11 2002/08/18 22:07:16 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -424,6 +424,35 @@ void NexusSet::add(const NexusSet&that)
|
|||
add(that.items_[idx]);
|
||||
}
|
||||
|
||||
void NexusSet::rem(Nexus*that)
|
||||
{
|
||||
if (nitems_ == 0)
|
||||
return;
|
||||
|
||||
unsigned ptr = bsearch_(that);
|
||||
if ((ptr >= nitems_) || (items_[ptr] != that))
|
||||
return;
|
||||
|
||||
if (nitems_ == 1) {
|
||||
free(items_);
|
||||
items_ = 0;
|
||||
nitems_ = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for (unsigned idx = ptr ; idx < (nitems_-1) ; idx += 1)
|
||||
items_[idx] = items_[idx+1];
|
||||
|
||||
items_ = (Nexus**)realloc(items_, (nitems_-1) * sizeof(Nexus*));
|
||||
nitems_ -= 1;
|
||||
}
|
||||
|
||||
void NexusSet::rem(const NexusSet&that)
|
||||
{
|
||||
for (unsigned idx = 0 ; idx < that.nitems_ ; idx += 1)
|
||||
rem(that.items_[idx]);
|
||||
}
|
||||
|
||||
Nexus* NexusSet::operator[] (unsigned idx) const
|
||||
{
|
||||
assert(idx < nitems_);
|
||||
|
|
@ -457,6 +486,9 @@ bool NexusSet::contains(const NexusSet&that) const
|
|||
|
||||
/*
|
||||
* $Log: net_link.cc,v $
|
||||
* Revision 1.11 2002/08/18 22:07:16 steve
|
||||
* Detect temporaries in sequential block synthesis.
|
||||
*
|
||||
* Revision 1.10 2002/08/12 01:34:59 steve
|
||||
* conditional ident string using autoconfig.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: net_nex_input.cc,v 1.5 2002/08/12 01:34:59 steve Exp $"
|
||||
#ident "$Id: net_nex_input.cc,v 1.6 2002/08/18 22:07:16 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -173,20 +173,60 @@ NexusSet* NetAssignBase::nex_input()
|
|||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* The nex_input of a begin/end block is the NexusSet of bits that the
|
||||
* block reads from outside the block. That means it is the union of
|
||||
* the nex_input for all the substatements.
|
||||
*
|
||||
* The input set for a sequential set is not exactly the union of the
|
||||
* input sets because there is the possibility of intermediate values,
|
||||
* that don't deserve to be in the input set. To wit:
|
||||
*
|
||||
* begin
|
||||
* t = a + b;
|
||||
* c = ~t;
|
||||
* end
|
||||
*
|
||||
* In this example, "t" should not be in the input set because it is
|
||||
* used by the sequence as a temporary value.
|
||||
*/
|
||||
NexusSet* NetBlock::nex_input()
|
||||
{
|
||||
if (last_ == 0)
|
||||
return new NexusSet;
|
||||
|
||||
NetProc*cur = last_;
|
||||
NexusSet*result = cur->nex_input();
|
||||
cur = cur->next_;
|
||||
while (cur != last_) {
|
||||
if (type_ == PARA) {
|
||||
cerr << get_line() << ": internal error: Sorry, "
|
||||
<< "I don't know how to synthesize fork/join blocks."
|
||||
<< endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
NetProc*cur = last_->next_;
|
||||
/* This is the accumulated input set. */
|
||||
NexusSet*result = new NexusSet;
|
||||
/* This is an accumulated output set. */
|
||||
NexusSet*prev = new NexusSet;
|
||||
|
||||
do {
|
||||
/* Get the inputs for the current statement. */
|
||||
NexusSet*tmp = cur->nex_input();
|
||||
|
||||
/* Remove from the input set those bits that are outputs
|
||||
from previous statements. They aren't really inputs
|
||||
to the block, just internal intermediate values. */
|
||||
tmp->rem(*prev);
|
||||
|
||||
/* Add the corrected set to the accumulated input set. */
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
|
||||
/* Add the current outputs to the accumulated output
|
||||
set, for processing of later statements. */
|
||||
cur->nex_output(*prev);
|
||||
|
||||
cur = cur->next_;
|
||||
}
|
||||
} while (cur != last_->next_);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -318,6 +358,9 @@ NexusSet* NetWhile::nex_input()
|
|||
|
||||
/*
|
||||
* $Log: net_nex_input.cc,v $
|
||||
* Revision 1.6 2002/08/18 22:07:16 steve
|
||||
* Detect temporaries in sequential block synthesis.
|
||||
*
|
||||
* Revision 1.5 2002/08/12 01:34:59 steve
|
||||
* conditional ident string using autoconfig.
|
||||
*
|
||||
|
|
|
|||
10
netlist.h
10
netlist.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: netlist.h,v 1.258 2002/08/16 05:18:27 steve Exp $"
|
||||
#ident "$Id: netlist.h,v 1.259 2002/08/18 22:07:16 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -282,9 +282,14 @@ class NexusSet {
|
|||
|
||||
unsigned count() const;
|
||||
|
||||
// Add the nexus to the set, if it is not already present.
|
||||
void add(Nexus*that);
|
||||
void add(const NexusSet&that);
|
||||
|
||||
// Remove the nexus from the set, if it is present.
|
||||
void rem(Nexus*that);
|
||||
void rem(const NexusSet&that);
|
||||
|
||||
Nexus* operator[] (unsigned idx) const;
|
||||
|
||||
// Return true if this set contains every nexus in that set.
|
||||
|
|
@ -3011,6 +3016,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
|||
|
||||
/*
|
||||
* $Log: netlist.h,v $
|
||||
* Revision 1.259 2002/08/18 22:07:16 steve
|
||||
* Detect temporaries in sequential block synthesis.
|
||||
*
|
||||
* Revision 1.258 2002/08/16 05:18:27 steve
|
||||
* Fix intermix of node functors and node delete.
|
||||
*
|
||||
|
|
|
|||
14
synth2.cc
14
synth2.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: synth2.cc,v 1.7 2002/08/12 01:35:00 steve Exp $"
|
||||
#ident "$Id: synth2.cc,v 1.8 2002/08/18 22:07:16 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -282,11 +282,13 @@ void synth2_f::process(class Design*des, class NetProcTop*top)
|
|||
return;
|
||||
|
||||
if (! top->is_asynchronous()) {
|
||||
bool synth_error_flag = false;
|
||||
if (top->attribute("ivl_combinational").as_ulong() != 0) {
|
||||
cerr << top->get_line() << ": error: "
|
||||
<< "Process is marked combinational,"
|
||||
<< " but isn't really." << endl;
|
||||
des->errors += 1;
|
||||
synth_error_flag = true;
|
||||
}
|
||||
|
||||
if (top->attribute("ivl_synthesis_on").as_ulong() != 0) {
|
||||
|
|
@ -294,10 +296,13 @@ void synth2_f::process(class Design*des, class NetProcTop*top)
|
|||
<< "Process is marked for synthesis,"
|
||||
<< " but I can't do it." << endl;
|
||||
des->errors += 1;
|
||||
synth_error_flag = true;
|
||||
}
|
||||
|
||||
cerr << top->get_line() << ": warning: "
|
||||
<< "Process not synthesized." << endl;
|
||||
if (! synth_error_flag)
|
||||
cerr << top->get_line() << ": warning: "
|
||||
<< "Process not synthesized." << endl;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -319,6 +324,9 @@ void synth2(Design*des)
|
|||
|
||||
/*
|
||||
* $Log: synth2.cc,v $
|
||||
* Revision 1.8 2002/08/18 22:07:16 steve
|
||||
* Detect temporaries in sequential block synthesis.
|
||||
*
|
||||
* Revision 1.7 2002/08/12 01:35:00 steve
|
||||
* conditional ident string using autoconfig.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue