No more class derivation from vvm_thread.

This commit is contained in:
steve 2000-04-14 23:31:53 +00:00
parent 4493e968da
commit df0808d5bb
3 changed files with 186 additions and 133 deletions

291
t-vvm.cc
View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: t-vvm.cc,v 1.134 2000/04/12 20:02:53 steve Exp $"
#ident "$Id: t-vvm.cc,v 1.135 2000/04/14 23:31:53 steve Exp $"
#endif
# include <iostream>
@ -862,11 +862,6 @@ void target_vvm::end_design(ostream&os, const Design*mod)
}
os << " design_init();" << endl;
os << " design_start();" << endl;
for (unsigned idx = 0 ; idx < process_counter ; idx += 1)
os << " thread" << (idx+1) << "_t thread_" <<
(idx+1) << ";" << endl;
os << " vpip_simulation_run();" << endl;
os << "}" << endl;
}
@ -957,28 +952,25 @@ void target_vvm::task_def(ostream&os, const NetTaskDef*def)
const string save_thread_class = thread_class_;
thread_class_ = name;
os << "static bool " << name << "_step_0_(vvm_thread*thr);" << endl;
#if 0
os << "class " << name << " : public vvm_thread {" << endl;
os << " public:" << endl;
os << " " << name << "(vvm_thread*th)" << endl;
os << " : vvm_thread(), back_(th), step_(&" << name <<
"::step_0_), callee_(0)" << endl;
os << " { }" << endl;
os << " { step_ = " << name << "_step_0_; back_ = th; }" << endl;
os << " ~" << name << "() { }" << endl;
os << " bool go() { return (this->*step_)(); }" << endl;
os << " private:" << endl;
os << " vvm_thread*back_;" << endl;
os << " bool (" << name << "::*step_)();" << endl;
os << " vvm_thread*callee_;" << endl;
os << " bool step_0_();" << endl;
os << "};" << endl;
#endif
defn << "static bool " << name << "_step_0_(vvm_thread*thr) {" << endl;
defn << "bool " << thread_class_ << "::step_0_() {" << endl;
def->proc()->emit_proc(os, this);
defn << " back_ -> thread_yield();" << endl;
defn << " thr->back_ -> thread_yield();" << endl;
defn << " return false;" << endl;
defn << "}" << endl;
os << "};" << endl;
thread_class_ = save_thread_class;
}
@ -1795,22 +1787,19 @@ void target_vvm::start_process(ostream&os, const NetProcTop*proc)
}
thread_step_ = 0;
os << "class " << thread_class_ << " : public vvm_thread {" << endl;
os << "static bool " << thread_class_ <<
"_step_0_(vvm_thread*thr);" << endl;
os << " public:" << endl;
os << " " << thread_class_ << "()" << endl;
os << " : vvm_thread(), step_(&" << thread_class_ <<
"::step_0_), callee_(0)" << endl;
os << " { }" << endl;
os << " ~" << thread_class_ << "() { }" << endl;
os << endl;
os << " bool go() { return (this->*step_)(); }" << endl;
os << " private:" << endl;
os << " bool (" << thread_class_ << "::*step_)();" << endl;
os << " vvm_thread*callee_;" << endl;
os << " bool step_0_();" << endl;
os << "static vvm_thread " << thread_class_ << ";" << endl;
defn << "bool " << thread_class_ << "::step_0_() {" << endl;
init_code << " " << thread_class_ << ".step_ = &"
<< thread_class_ << "_step_0_;" << endl;
init_code << " " << thread_class_ << ".thread_yield();" << endl;
defn << "static bool " << thread_class_ << "_step_0_(vvm_thread*thr)"
<< endl << "{" << endl;
}
/*
@ -2061,8 +2050,8 @@ void target_vvm::proc_case(ostream&os, const NetCase*net)
defn << " if (B_IS1(" << test_func << "(" << guard << ","
<< expr << "))) {" << endl;
defn << " step_ = &" << thread_class_ <<
"::step_" << thread_step_ << "_;" << endl;
defn << " thr->step_ = &" << thread_class_ <<
"_step_" << thread_step_ << "_;" << endl;
defn << " return true;" << endl;
defn << " }" << endl;
}
@ -2073,12 +2062,12 @@ void target_vvm::proc_case(ostream&os, const NetCase*net)
thread_step_ += 1;
defn << " /* default : */" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
thread_step_ << "_;" << endl;
} else {
defn << " /* no default ... fall out of case. */" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
exit_step << "_;" << endl;
}
defn << " return true;" << endl;
@ -2097,13 +2086,14 @@ void target_vvm::proc_case(ostream&os, const NetCase*net)
step_num += 1;
os << " bool step_" << step_num << "_();" << endl;
os << "static bool " << thread_class_ << "_step_"
<< step_num << "_(vvm_thread*thr);" << endl;
defn << "bool " << thread_class_ << "::step_" << step_num
<< "_() {" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< step_num << "_(vvm_thread*thr) {" << endl;
if (net->stat(idx))
net->stat(idx)->emit_proc(os, this);
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
exit_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
@ -2113,23 +2103,26 @@ void target_vvm::proc_case(ostream&os, const NetCase*net)
if (default_idx < net->nitems()) {
step_num += 1;
os << " bool step_" << step_num << "_();" << endl;
os << "static bool " << thread_class_ << "_step_"
<< step_num << "_(vvm_thread*thr);" << endl;
defn << "bool " << thread_class_ << "::step_" << step_num
<< "_() {" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< step_num << "_(vvm_thread*thr) {" << endl;
if (net->stat(default_idx))
net->stat(default_idx)->emit_proc(os, this);
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
exit_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
}
/* Finally, start the exit step. */
os << " bool step_" << exit_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << exit_step <<
"_() {" << endl;
os << "static bool " << thread_class_ << "_step_"
<< exit_step << "_(vvm_thread*thr);" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< exit_step << "_(vvm_thread*thr) {" << endl;
}
/*
@ -2200,39 +2193,44 @@ void target_vvm::proc_condit(ostream&os, const NetCondit*net)
unsigned else_step = ++thread_step_;
unsigned out_step = ++thread_step_;
/* Declare new steps that I am going to create. */
os << "static bool " << thread_class_ << "_step_"
<< if_step << "_(vvm_thread*thr);" << endl;
os << "static bool " << thread_class_ << "_step_"
<< else_step << "_(vvm_thread*thr);" << endl;
os << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr);" << endl;
defn << " if (B_IS1(" << expr << "[0]))" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
if_step << "_;" << endl;
defn << " else" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
else_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << if_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << if_step <<
"_() {" << endl;
defn << "static bool " << thread_class_ << "_step_" << if_step <<
"_(vvm_thread*thr) {" << endl;
net->emit_recurse_if(os, this);
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
out_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << else_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << else_step <<
"_() {" << endl;
defn << "static bool " << thread_class_ << "_step_" << else_step <<
"_(vvm_thread*thr) {" << endl;
net->emit_recurse_else(os, this);
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
out_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << out_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << out_step <<
"_() {" << endl;
defn << "static bool " << thread_class_ << "_step_" << out_step <<
"_(vvm_thread*thr) {" << endl;
}
void target_vvm::proc_condit_fun(ostream&os, const NetCondit*net)
@ -2251,28 +2249,40 @@ void target_vvm::proc_condit_fun(ostream&os, const NetCondit*net)
/*
* The forever loop is implemented by starting a basic block, handing
* the statement, and putting in a goto to the beginning of the block.
* This is arranged in vvm by starting a step that is the top of the
* loop, elaborating the contents of the loop, then returning to the
* top step after the loop contents.
*/
void target_vvm::proc_forever(ostream&os, const NetForever*net)
{
unsigned top_step = ++thread_step_;
unsigned out_step = ++thread_step_;
defn << " step_ = &" << thread_class_ << "::step_" <<
top_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << top_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << top_step <<
"_() {" << endl;
net->emit_recurse(os, this);
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
top_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << out_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << out_step <<
"_() {" << endl;
os << "static bool " << thread_class_ << "_step_"
<< top_step << "_(vvm_thread*thr);" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< top_step << "_(vvm_thread*thr) {" << endl;
net->emit_recurse(os, this);
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
top_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
/* Generate a loop out step to catch unreachable stuff afer
the loop. */
os << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr);" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr) {" << endl;
}
void target_vvm::proc_repeat(ostream&os, const NetRepeat*net)
@ -2281,36 +2291,48 @@ void target_vvm::proc_repeat(ostream&os, const NetRepeat*net)
unsigned top_step = ++thread_step_;
unsigned out_step = ++thread_step_;
defn << " step_" << top_step << "_idx_ = " << expr <<
".as_unsigned();" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
top_step << "_;" << endl;
/* Declare a variable to use as a loop index. */
os << "static unsigned " << thread_class_ << "_step_"
<< top_step << "_idx_;" << endl;
/* Declare the top step. */
os << "static bool " << thread_class_ << "_step_"
<< top_step << "_(vvm_thread*thr);" << endl;
/* Declare the exit step. */
os << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr);" << endl;
defn << " " << thread_class_ << "_step_"
<< top_step << "_idx_ = " << expr << ".as_unsigned();" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< top_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " unsigned step_" << top_step << "_idx_;" << endl;
os << " bool step_" << top_step << "_();" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< top_step << "_(vvm_thread*thr) {" << endl;
defn << "bool " << thread_class_ << "::step_" << top_step <<
"_() {" << endl;
defn << " if (step_" << top_step << "_idx_ == 0) {" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
out_step << "_;" << endl;
defn << " if (" << thread_class_ << "_step_"
<< top_step << "_idx_ == 0) {" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< out_step << "_;" << endl;
defn << " return true;" << endl;
defn << " }" << endl;
defn << " step_" << top_step << "_idx_ -= 1;" << endl;
defn << " " << thread_class_ << "_step_"
<< top_step << "_idx_ -= 1;" << endl;
net->emit_recurse(os,this);
defn << " step_ = &" << thread_class_ << "::step_" <<
top_step << "_;" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< top_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << out_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << out_step <<
"_() {" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr) {" << endl;
}
/*
@ -2369,32 +2391,38 @@ void target_vvm::proc_utask(ostream&os, const NetUTask*net)
{
unsigned out_step = ++thread_step_;
const string name = mangle(net->name());
defn << " assert(callee_ == 0);" << endl;
defn << " callee_ = new " << name << "(this);" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
out_step << "_;" << endl;
os << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr);" << endl;
defn << " assert(thr->callee_ == 0);" << endl;
defn << " thr->callee_ = new vvm_thread;" << endl;
defn << " thr->callee_->back_ = thr;" << endl;
defn << " thr->callee_->step_ = &" << name << "_step_0_;" << endl;
defn << " thr->callee_->thread_yield();" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< out_step << "_;" << endl;
defn << " return false;" << endl;
defn << "}" << endl;
os << " bool step_" << out_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << out_step <<
"_() {" << endl;
defn << " delete callee_;" << endl;
defn << " callee_ = 0;" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr) {" << endl;
defn << " delete thr->callee_;" << endl;
defn << " thr->callee_ = 0;" << endl;
}
bool target_vvm::proc_wait(ostream&os, const NetEvWait*wait)
{
unsigned out_step = ++thread_step_;
defn << " step_ = &" << thread_class_ << "::step_"
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< out_step << "_;" << endl;
for (unsigned idx = 0 ; idx < wait->nevents() ; idx+= 1) {
const NetEvent*ev = wait->event(idx);
assert(ev);
string ename = mangle(ev->full_name());
defn << " " << ename << ".wait(this); // "
defn << " " << ename << ".wait(thr); // "
<< wait->get_line() << ": @" << ev->full_name()
<< "..." << endl;
}
@ -2402,9 +2430,11 @@ bool target_vvm::proc_wait(ostream&os, const NetEvWait*wait)
defn << " return false;" << endl;
defn << "}" << endl;
os << " bool step_" << out_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << out_step
<< "_() {" << endl;
os << "static bool " << thread_class_ << "_step_" << out_step
<< "_(vvm_thread*thr);" << endl;
defn << "bool " << thread_class_ << "_step_" << out_step
<< "_(vvm_thread*thr) {" << endl;
return wait->emit_recurse(os, this);
}
@ -2427,25 +2457,29 @@ void target_vvm::proc_while(ostream&os, const NetWhile*net)
unsigned head_step = ++thread_step_;
unsigned out_step = ++thread_step_;
defn << " step_ = &" << thread_class_ << "::step_" <<
head_step << "_;" << endl;
os << "static bool " << thread_class_ << "_step_"
<< head_step << "_(vvm_thread*thr);" << endl;
os << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr);" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< head_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << head_step << "_();" << endl;
defn << "// " << net->expr()->get_line() <<
": top of while condition." << endl;
defn << "bool " << thread_class_ << "::step_" << head_step <<
"_() {" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< head_step << "_(vvm_thread*thr) {" << endl;
string expr = emit_proc_rval(defn, 8, net->expr());
defn << "// " << net->expr()->get_line() <<
": test while condition." << endl;
defn << " if (!B_IS1(" << expr << "[0])) {" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
out_step << "_;" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< out_step << "_;" << endl;
defn << " return true;" << endl;
defn << " }" << endl;
@ -2453,15 +2487,13 @@ void target_vvm::proc_while(ostream&os, const NetWhile*net)
defn << "// " << net->expr()->get_line() <<
": end of while loop." << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
head_step << "_;" << endl;
defn << " thr->step_ = &" << thread_class_ << "_step_"
<< head_step << "_;" << endl;
defn << " return true;" << endl;
defn << "}" << endl;
os << " bool step_" << out_step << "_();" << endl;
defn << "bool " << thread_class_ << "::step_" << out_step <<
"_() {" << endl;
defn << "static bool " << thread_class_ << "_step_"
<< out_step << "_(vvm_thread*thr) {" << endl;
}
@ -2471,16 +2503,17 @@ void target_vvm::proc_while(ostream&os, const NetWhile*net)
void target_vvm::proc_delay(ostream&os, const NetPDelay*proc)
{
thread_step_ += 1;
defn << " step_ = &" << thread_class_ << "::step_" <<
defn << " thr->step_ = &" << thread_class_ << "_step_" <<
thread_step_ << "_;" << endl;
defn << " thread_yield(" << proc->delay() << ");" << endl;
defn << " thr->thread_yield(" << proc->delay() << ");" << endl;
defn << " return false;" << endl;
defn << "}" << endl;
os << " bool step_" << thread_step_ << "_();" << endl;
os << "static bool " << thread_class_ << "_step_"
<< thread_step_ << "_(vvm_thread*thr);" << endl;
defn << "bool " << thread_class_ << "::step_" << thread_step_ <<
"_() {" << endl;
defn << "bool " << thread_class_ << "_step_" << thread_step_ <<
"_(vvm_thread*thr) {" << endl;
proc->emit_proc_recurse(os, this);
}
@ -2488,16 +2521,15 @@ void target_vvm::proc_delay(ostream&os, const NetPDelay*proc)
void target_vvm::end_process(ostream&os, const NetProcTop*proc)
{
if (proc->type() == NetProcTop::KALWAYS) {
defn << " step_ = &" << thread_class_ << "::step_0_;"
defn << " thr->step_ = &" << thread_class_ << "_step_0_;"
<< endl;
defn << " return true;" << endl;
} else {
defn << " step_ = 0;" << endl;
defn << " thr->step_ = 0;" << endl;
defn << " return false;" << endl;
}
defn << "}" << endl;
os << "};" << endl;
}
@ -2509,6 +2541,9 @@ extern const struct target tgt_vvm = {
};
/*
* $Log: t-vvm.cc,v $
* Revision 1.135 2000/04/14 23:31:53 steve
* No more class derivation from vvm_thread.
*
* Revision 1.134 2000/04/12 20:02:53 steve
* Finally remove the NetNEvent and NetPEvent classes,
* Get synthesis working with the NetEvWait class,

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: vvm_thread.cc,v 1.5 2000/04/12 01:53:07 steve Exp $"
#ident "$Id: vvm_thread.cc,v 1.6 2000/04/14 23:31:53 steve Exp $"
#endif
# include "vvm.h"
@ -41,7 +41,8 @@ vvm_thread::vvm_thread()
{
sync_next_ = 0;
sync_back_ = 0;
thread_yield();
callee_ = 0;
back_ = 0;
}
vvm_thread::~vvm_thread()
@ -54,8 +55,17 @@ void vvm_thread::thread_yield(unsigned long delay)
ev -> schedule(delay);
}
bool vvm_thread::go()
{
return (step_)(this);
}
/*
* $Log: vvm_thread.cc,v $
* Revision 1.6 2000/04/14 23:31:53 steve
* No more class derivation from vvm_thread.
*
* Revision 1.5 2000/04/12 01:53:07 steve
* Multiple thread can block on an event.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT) && !defined(macintosh)
#ident "$Id: vvm_thread.h,v 1.6 2000/04/12 01:53:07 steve Exp $"
#ident "$Id: vvm_thread.h,v 1.7 2000/04/14 23:31:53 steve Exp $"
#endif
# include "vvm.h"
@ -38,14 +38,19 @@ class vvm_thread {
public:
explicit vvm_thread();
virtual ~vvm_thread();
~vvm_thread();
void thread_yield(unsigned long delay =0);
// This method executes a setp of the thread. The engine will
// continue to call go as long as it returns true. The thread
// will return false if it is ready to give up the CPU.
virtual bool go() =0;
bool go();
bool (*step_)(vvm_thread*);
// These members are used to handle task invocations.
vvm_thread*callee_;
vvm_thread*back_;
// The sync class uses this to list all the threads blocked on it.
vvm_sync*sync_back_;
@ -54,6 +59,9 @@ class vvm_thread {
/*
* $Log: vvm_thread.h,v $
* Revision 1.7 2000/04/14 23:31:53 steve
* No more class derivation from vvm_thread.
*
* Revision 1.6 2000/04/12 01:53:07 steve
* Multiple thread can block on an event.
*