Restore support for wait event control.
This commit is contained in:
parent
9fadd7821d
commit
9e82ed240c
58
t-vvm.cc
58
t-vvm.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: t-vvm.cc,v 1.19 1999/05/01 20:43:55 steve Exp $"
|
||||
#ident "$Id: t-vvm.cc,v 1.20 1999/05/03 01:51:29 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <iostream>
|
||||
|
|
@ -615,6 +615,7 @@ void target_vvm::net_event(ostream&os, const NetNEvent*gate)
|
|||
mangle(gate->name()) << "(&" << pevent << ", ";
|
||||
switch (gate->type()) {
|
||||
case NetNEvent::POSEDGE:
|
||||
case NetNEvent::POSITIVE:
|
||||
os << "vvm_pevent<" << gate->pin_count() << ">::POSEDGE";
|
||||
break;
|
||||
case NetNEvent::NEGEDGE:
|
||||
|
|
@ -623,8 +624,6 @@ void target_vvm::net_event(ostream&os, const NetNEvent*gate)
|
|||
case NetNEvent::ANYEDGE:
|
||||
os << "vvm_pevent<" << gate->pin_count() << ">::ANYEDGE";
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
os << ");" << endl;
|
||||
}
|
||||
|
|
@ -859,14 +858,13 @@ void target_vvm::proc_event(ostream&os, const NetPEvent*proc)
|
|||
thread_step_ += 1;
|
||||
os << " step_ = &step_" << thread_step_ << "_;" << endl;
|
||||
|
||||
#if 0
|
||||
/* POSITIVE is for the wait construct, and needs to be handled
|
||||
specially. The structure of the generated code is:
|
||||
|
||||
if (event.get()==V1) {
|
||||
return true;
|
||||
} else {
|
||||
event.wait(vvm_pevent::POSEDGE, this);
|
||||
event.wait(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -880,49 +878,32 @@ void target_vvm::proc_event(ostream&os, const NetPEvent*proc)
|
|||
POSEDGE is replaced with the correct type for the desired
|
||||
edge. */
|
||||
|
||||
if (proc->edge() == NetPEvent::POSITIVE) {
|
||||
os << " if (" << mangle(proc->name()) <<
|
||||
".get()==V1) {" << endl;
|
||||
svector<const NetNEvent*>*list = proc->back_list();
|
||||
if ((list->count()==1) && ((*list)[0]->type() == NetNEvent::POSITIVE)) {
|
||||
os << " if (" << mangle((*list)[0]->name()) <<
|
||||
".get()[0]==V1) {" << endl;
|
||||
os << " return true;" << endl;
|
||||
os << " } else {" << endl;
|
||||
os << " " << mangle(proc->name()) <<
|
||||
".wait(vvm_pevent::POSEDGE, this);" << endl;
|
||||
".wait(this);" << endl;
|
||||
os << " return false;" << endl;
|
||||
os << " }" << endl;
|
||||
|
||||
} else {
|
||||
os << " " << mangle(proc->name()) << ".wait(vvm_pevent::";
|
||||
switch (proc->edge()) {
|
||||
case NetPEvent::ANYEDGE:
|
||||
os << "ANYEDGE";
|
||||
break;
|
||||
case NetPEvent::POSITIVE:
|
||||
case NetPEvent::POSEDGE:
|
||||
os << "POSEDGE";
|
||||
break;
|
||||
case NetPEvent::NEGEDGE:
|
||||
os << "NEGEDGE";
|
||||
break;
|
||||
}
|
||||
os << ", this);" << endl;
|
||||
os << " return false;" << endl;
|
||||
/* The canonical wait for an edge puts the thread into
|
||||
the correct wait object, then returns false from the
|
||||
thread to suspend execution. When things are ready to
|
||||
proceed, the correct vvm_pevent will send a wakeup to
|
||||
start the next basic block. */
|
||||
os << " " << mangle(proc->name()) << ".wait(this);" << endl;
|
||||
os << " return false;" << endl;
|
||||
}
|
||||
|
||||
os << " }" << endl;
|
||||
os << " bool step_" << thread_step_ << "_()" << endl;
|
||||
os << " {" << endl;
|
||||
#else
|
||||
/* The canonical wait for an edge puts the thread into the
|
||||
correct wait object, then returns false from the thread to
|
||||
suspend execution. When things are ready to proceed, the
|
||||
correct vvm_pevent will send a wakeup to start the next
|
||||
basic block. */
|
||||
os << " " << mangle(proc->name()) << ".wait(this);" << endl;
|
||||
os << " return false;" << endl;
|
||||
os << " }" << endl;
|
||||
os << " bool step_" << thread_step_ << "_()" << endl;
|
||||
os << " {" << endl;
|
||||
#endif
|
||||
|
||||
proc->emit_proc_recurse(os, this);
|
||||
delete list;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -965,6 +946,9 @@ extern const struct target tgt_vvm = {
|
|||
};
|
||||
/*
|
||||
* $Log: t-vvm.cc,v $
|
||||
* Revision 1.20 1999/05/03 01:51:29 steve
|
||||
* Restore support for wait event control.
|
||||
*
|
||||
* Revision 1.19 1999/05/01 20:43:55 steve
|
||||
* Handle wide events, such as @(a) where a has
|
||||
* many bits in it.
|
||||
|
|
|
|||
10
vvm/vvm.h
10
vvm/vvm.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: vvm.h,v 1.6 1999/04/22 04:56:58 steve Exp $"
|
||||
#ident "$Id: vvm.h,v 1.7 1999/05/03 01:51:29 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <vector>
|
||||
|
|
@ -104,6 +104,11 @@ extern ostream& operator << (ostream&os, const vvm_bits_t&str);
|
|||
template <unsigned WIDTH> class vvm_bitset_t : public vvm_bits_t {
|
||||
|
||||
public:
|
||||
vvm_bitset_t()
|
||||
{ for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
|
||||
bits_[idx] = Vz;
|
||||
}
|
||||
|
||||
vvm_bit_t operator[] (unsigned idx) const { return bits_[idx]; }
|
||||
vvm_bit_t&operator[] (unsigned idx) { return bits_[idx]; }
|
||||
|
||||
|
|
@ -263,6 +268,9 @@ template <unsigned WIDTH> class vvm_signal_t : public vvm_monitor_t {
|
|||
|
||||
/*
|
||||
* $Log: vvm.h,v $
|
||||
* Revision 1.7 1999/05/03 01:51:29 steve
|
||||
* Restore support for wait event control.
|
||||
*
|
||||
* Revision 1.6 1999/04/22 04:56:58 steve
|
||||
* Add to vvm proceedural memory references.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: vvm_gates.h,v 1.9 1999/05/01 20:43:55 steve Exp $"
|
||||
#ident "$Id: vvm_gates.h,v 1.10 1999/05/03 01:51:29 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvm.h"
|
||||
|
|
@ -399,7 +399,7 @@ template <unsigned WIDTH> class vvm_pevent {
|
|||
|
||||
private:
|
||||
vvm_sync*target_;
|
||||
vvm_bit_t value_[WIDTH];
|
||||
vvm_bitset_t<WIDTH> value_;
|
||||
EDGE edge_;
|
||||
|
||||
private: // not implemented
|
||||
|
|
@ -409,6 +409,9 @@ template <unsigned WIDTH> class vvm_pevent {
|
|||
|
||||
/*
|
||||
* $Log: vvm_gates.h,v $
|
||||
* Revision 1.10 1999/05/03 01:51:29 steve
|
||||
* Restore support for wait event control.
|
||||
*
|
||||
* Revision 1.9 1999/05/01 20:43:55 steve
|
||||
* Handle wide events, such as @(a) where a has
|
||||
* many bits in it.
|
||||
|
|
|
|||
Loading…
Reference in New Issue