Remove the useless vvm_simulation class.

This commit is contained in:
steve 1999-12-12 19:47:54 +00:00
parent 76655ce2bb
commit 6be5421c8a
10 changed files with 231 additions and 424 deletions

147
t-vvm.cc
View File

@ -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.89 1999/12/12 06:03:14 steve Exp $"
#ident "$Id: t-vvm.cc,v 1.90 1999/12/12 19:47:54 steve Exp $"
#endif
# include <iostream>
@ -315,7 +315,7 @@ void vvm_proc_rval::expr_ufunc(const NetEUFunc*expr)
}
/* Make the function call. */
os_ << " " << mangle(expr->name()) << "(sim_);" << endl;
os_ << " " << mangle(expr->name()) << "();" << endl;
/* Save the return value in a temporary. */
result = make_temp();
@ -612,11 +612,11 @@ void target_vvm::start_design(ostream&os, const Design*mod)
os << "static struct __vpiStringConst string_table[];" << endl;
os << "static struct __vpiNumberConst number_table[];" << endl;
init_code << "static void design_init(vvm_simulation&sim)" << endl;
init_code << "static void design_init()" << endl;
init_code << "{" << endl;
init_code << " vpip_init_simulation();"
<< endl;
start_code << "static void design_start(vvm_simulation&sim)" << endl;
start_code << "static void design_start()" << endl;
start_code << "{" << endl;
}
@ -701,15 +701,14 @@ void target_vvm::end_design(ostream&os, const Design*mod)
os << " vvm_set_module_path(\"" << vpi_module_path <<
"\");" << endl;
os << " vvm_load_vpi_module(\"system.vpi\");" << endl;
os << " vvm_simulation sim;" << endl;
os << " design_init(sim);" << endl;
os << " design_start(sim);" << endl;
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) << "(&sim);" << endl;
(idx+1) << ";" << endl;
os << " sim.run();" << endl;
os << " vpip_simulation_run();" << endl;
os << "}" << endl;
}
@ -799,8 +798,8 @@ void target_vvm::task_def(ostream&os, const NetTaskDef*def)
os << "class " << name << " : public vvm_thread {" << endl;
os << " public:" << endl;
os << " " << name << "(vvm_simulation*sim, vvm_thread*th)" << endl;
os << " : vvm_thread(sim), back_(th), step_(&" << name << "::step_0_)" << endl;
os << " " << name << "(vvm_thread*th)" << endl;
os << " : vvm_thread(), back_(th), step_(&" << name << "::step_0_)" << endl;
os << " { }" << endl;
os << " ~" << name << "() { }" << endl;
os << " bool go() { return (this->*step_)(); }" << endl;
@ -813,7 +812,7 @@ void target_vvm::task_def(ostream&os, const NetTaskDef*def)
defn << "bool " << thread_class_ << "::step_0_() {" << endl;
def->proc()->emit_proc(os, this);
defn << " sim_->thread_active(back_);" << endl;
defn << " back_ -> thread_yield();" << endl;
defn << " return false;" << endl;
defn << "}" << endl;
@ -834,10 +833,10 @@ void target_vvm::func_def(ostream&os, const NetFuncDef*def)
thread_step_ = 0;
const string name = mangle(def->name());
os << "// Function " << def->name() << endl;
os << "static void " << name << "(vvm_simulation*);" << endl;
os << "static void " << name << "();" << endl;
defn << "// Function " << def->name() << endl;
defn << "static void " << name << "(vvm_simulation*sim_)" << endl;
defn << "static void " << name << "()" << endl;
defn << "{" << endl;
def->proc()->emit_proc(os, this);
defn << "}" << endl;
@ -854,7 +853,7 @@ string target_vvm::defn_gate_outputfun_(ostream&os,
"_" << lnk.get_inst() << ends;
string name = tmp.str();
os << "static void " << name << "(vvm_simulation*, vpip_bit_t);" << endl;
os << "static void " << name << "(vpip_bit_t);" << endl;
return name;
}
@ -869,7 +868,7 @@ void target_vvm::emit_gate_outputfun_(const NetNode*gate, unsigned gpin)
delayed << "static void " << mangle(gate->name()) <<
"_output_" << lnk.get_name() << "_" << lnk.get_inst() <<
"(vvm_simulation*sim, vpip_bit_t val)" <<
"(vpip_bit_t val)" <<
endl << "{" << endl;
/* The output function connects to gpin of the netlist part
@ -884,12 +883,12 @@ void target_vvm::emit_gate_outputfun_(const NetNode*gate, unsigned gpin)
if (cur->pin(pin).get_name() != "") {
delayed << " " << mangle(cur->name()) << ".set_"
<< cur->pin(pin).get_name() << "(sim, " <<
<< cur->pin(pin).get_name() << "(" <<
cur->pin(pin).get_inst() << ", val);" << endl;
} else {
delayed << " " << mangle(cur->name()) << ".set(sim, "
delayed << " " << mangle(cur->name()) << ".set("
<< pin << ", val);" << endl;
}
@ -1073,7 +1072,7 @@ void target_vvm::logic(ostream&os, const NetLogic*gate)
emit_gate_outputfun_(gate, 0);
start_code << " " << mangle(gate->name()) <<
".start(&sim);" << endl;
".start();" << endl;
}
void target_vvm::bufz(ostream&os, const NetBUFZ*gate)
@ -1174,18 +1173,17 @@ void target_vvm::net_assign_nb(ostream&os, const NetAssignNB*net)
os << " public:" << endl;
if (net->bmux()) {
os << " " << name << "(vvm_simulation*s, const vvm_bitset_t<"
os << " " << name << "(const vvm_bitset_t<"
<< iwid << ">&v, unsigned idx)" << endl;
os << " : sim_(s), value_(v), idx_(idx) { }" << endl;
os << " : value_(v), idx_(idx) { }" << endl;
} else {
os << " " << name << "(vvm_simulation*s, const vvm_bits_t&v)"
os << " " << name << "(const vvm_bits_t&v)"
<< endl;
os << " : sim_(s), value_(v) { }" << endl;
os << " : value_(v) { }" << endl;
}
os << " void event_function();" << endl;
os << " private:" << endl;
os << " vvm_simulation*sim_;" << endl;
os << " vvm_bitset_t<" << iwid << ">value_;" << endl;
if (net->bmux())
@ -1220,7 +1218,7 @@ void target_vvm::net_assign_nb(ostream&os, const NetAssignNB*net)
continue;
delayed << " " << mangle(cur->name())
<< ".set_" << lnk.get_name() << "sim_, "
<< ".set_" << lnk.get_name()
<< lnk.get_inst() << ", value_[0]);" << endl;
}
@ -1247,7 +1245,7 @@ void target_vvm::net_assign_nb(ostream&os, const NetAssignNB*net)
continue;
delayed << " " << mangle(cur->name()) <<
".set_" << lnk.get_name() << "(sim_, "
".set_" << lnk.get_name() << "("
<< lnk.get_inst() << ", value_[" <<
idx << "]);" << endl;
}
@ -1262,7 +1260,7 @@ void target_vvm::net_case_cmp(ostream&os, const NetCaseCmp*gate)
os << "static void " << mangle(gate->name()) <<
"_output_" << lnk.get_name() << "_" << lnk.get_inst() <<
"(vvm_simulation*, vpip_bit_t);" << endl;
"(vpip_bit_t);" << endl;
assert(gate->pin_count() == 3);
os << "static vvm_eeq" << "<" << gate->rise_time() << "> "
@ -1271,8 +1269,7 @@ void target_vvm::net_case_cmp(ostream&os, const NetCaseCmp*gate)
emit_gate_outputfun_(gate, 0);
start_code << " " << mangle(gate->name()) <<
".start(&sim);" << endl;
start_code << " " << mangle(gate->name()) << ".start();" << endl;
}
/*
@ -1288,7 +1285,7 @@ void target_vvm::net_const(ostream&os, const NetConst*gate)
os << "static vvm_bufz " << mangle(gate->name()) << "(&" <<
outfun << ");" << endl;
init_code << " " << mangle(gate->name()) << ".set(&sim, 1, ";
init_code << " " << mangle(gate->name()) << ".set(1, ";
switch (gate->value()) {
case verinum::V0:
init_code << "V0";
@ -1358,8 +1355,8 @@ void target_vvm::start_process(ostream&os, const NetProcTop*proc)
os << "class " << thread_class_ << " : public vvm_thread {" << endl;
os << " public:" << endl;
os << " " << thread_class_ << "(vvm_simulation*sim)" << endl;
os << " : vvm_thread(sim), step_(&" << thread_class_ <<
os << " " << thread_class_ << "()" << endl;
os << " : vvm_thread(), step_(&" << thread_class_ <<
"::step_0_)" << endl;
os << " { }" << endl;
os << " ~" << thread_class_ << "() { }" << endl;
@ -1417,7 +1414,7 @@ void target_vvm::proc_assign(ostream&os, const NetAssign*net)
written[cur->name()] = true;
defn << " " << mangle(cur->name()) <<
".set_" << cur->pin(pin).get_name() <<
"(sim_, " << cur->pin(pin).get_inst() <<
"(" << cur->pin(pin).get_inst() <<
", " << rval << "[0]);" << endl;
}
@ -1453,7 +1450,7 @@ void target_vvm::proc_assign(ostream&os, const NetAssign*net)
written[cur->name()] = true;
defn << " " << mangle(cur->name()) <<
".set_" << cur->pin(pin).get_name() <<
"(sim_, " << cur->pin(pin).get_inst() <<
"(" << cur->pin(pin).get_inst() <<
", " << rval << "[" << idx << "]);" << endl;
}
}
@ -1474,7 +1471,7 @@ void target_vvm::proc_assign_mem(ostream&os, const NetAssignMem*amem)
defn << " /* " << amem->get_line() << " */" << endl;
if (mem->width() == amem->rval()->expr_width()) {
defn << " " << mangle(mem->name()) <<
".set_word(sim_, " << index << ".as_unsigned(), " <<
".set_word(" << index << ".as_unsigned(), " <<
rval << ");" << endl;
} else {
@ -1486,7 +1483,7 @@ void target_vvm::proc_assign_mem(ostream&os, const NetAssignMem*amem)
defn << " " << tmp << "[" << idx << "] = " <<
rval << "[" << idx << "];" << endl;
defn << " " << mangle(mem->name()) << ".set_word(sim_, "
defn << " " << mangle(mem->name()) << ".set_word("
<< index << ".as_unsigned(), " << tmp << ");" << endl;
}
}
@ -1497,14 +1494,14 @@ void target_vvm::proc_assign_nb(ostream&os, const NetAssignNB*net)
if (net->bmux()) {
string bval = emit_proc_rval(defn, 8, net->bmux());
defn << " sim_->insert_event(" << net->rise_time()
<< ", new " << mangle(net->name()) << "(sim_, " << rval
<< ", " << bval << ".as_unsigned()));" << endl;
defn << " (new " << mangle(net->name()) << "("
<< rval << ", " << bval << ".as_unsigned())) "
<< "-> schedule(" << net->rise_time() << ");" << endl;
} else {
defn << " sim_->insert_event(" << net->rise_time()
<< ", new " << mangle(net->name()) << "(sim_, " << rval
<< "));" << endl;
defn << " (new " << mangle(net->name()) << "("
<< rval << ")) -> schedule(" << net->rise_time() <<
");" << endl;
}
}
@ -1786,7 +1783,7 @@ void target_vvm::proc_utask(ostream&os, const NetUTask*net)
{
unsigned out_step = ++thread_step_;
const string name = mangle(net->name());
defn << " callee_ = new " << name << "(sim_, this);" << endl;
defn << " callee_ = new " << name << "(this);" << endl;
defn << " step_ = &" << thread_class_ << "::step_" <<
out_step << "_;" << endl;
defn << " return false;" << endl;
@ -1922,8 +1919,7 @@ void target_vvm::proc_delay(ostream&os, const NetPDelay*proc)
thread_step_ += 1;
defn << " step_ = &" << thread_class_ << "::step_" <<
thread_step_ << "_;" << endl;
defn << " sim_->thread_delay(" << proc->delay() << ", this);"
<< endl;
defn << " thread_yield(" << proc->delay() << ");" << endl;
defn << " return false;" << endl;
defn << "}" << endl;
@ -1959,6 +1955,9 @@ extern const struct target tgt_vvm = {
};
/*
* $Log: t-vvm.cc,v $
* Revision 1.90 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.89 1999/12/12 06:03:14 steve
* Allow memories without indices in expressions.
*
@ -2015,63 +2014,5 @@ extern const struct target tgt_vvm = {
*
* Revision 1.72 1999/11/06 16:00:17 steve
* Put number constants into a static table.
*
* Revision 1.71 1999/11/01 02:07:41 steve
* Add the synth functor to do generic synthesis
* and add the LPM_FF device to handle rows of
* flip-flops.
*
* Revision 1.70 1999/10/31 20:08:24 steve
* Include subtraction in LPM_ADD_SUB device.
*
* Revision 1.69 1999/10/31 04:11:28 steve
* Add to netlist links pin name and instance number,
* and arrange in vvm for pin connections by name
* and instance number.
*
* Revision 1.68 1999/10/28 21:51:21 steve
* gate output pins use vpip_bit_t (Eric Aardoom)
*
* Revision 1.67 1999/10/28 21:36:00 steve
* Get rid of monitor_t and fold __vpiSignal into signal.
*
* Revision 1.66 1999/10/28 04:48:29 steve
* Put strings into a single string table.
*
* Revision 1.65 1999/10/28 00:47:24 steve
* Rewrite vvm VPI support to make objects more
* persistent, rewrite the simulation scheduler
* in C (to interface with VPI) and add VPI support
* for callbacks.
*
* Revision 1.64 1999/10/23 16:27:53 steve
* assignment to bit select is aa single bit.
*
* Revision 1.63 1999/10/21 02:15:06 steve
* Make generated code ISO legal.
*
* Revision 1.62 1999/10/10 01:59:55 steve
* Structural case equals device.
*
* Revision 1.61 1999/10/08 02:00:48 steve
* vvm supports unary | operator.
*
* Revision 1.60 1999/10/07 05:25:34 steve
* Add non-const bit select in l-value of assignment.
*
* Revision 1.59 1999/10/06 01:28:18 steve
* The $finish task should work immediately.
*
* Revision 1.58 1999/10/05 06:19:46 steve
* Add support for reduction NOR.
*
* Revision 1.57 1999/10/05 04:02:10 steve
* Relaxed width handling for <= assignment.
*
* Revision 1.56 1999/10/01 15:26:28 steve
* Add some vvm operators from Eric Aardoom.
*
* Revision 1.55 1999/10/01 03:58:37 steve
* More resilient assignment to memory location.
*/

View File

@ -18,7 +18,7 @@
# 59 Temple Place - Suite 330
# Boston, MA 02111-1307, USA
#
#ident "$Id: Makefile.in,v 1.14 1999/11/27 19:07:58 steve Exp $"
#ident "$Id: Makefile.in,v 1.15 1999/12/12 19:47:54 steve Exp $"
#
#
SHELL = /bin/sh
@ -59,7 +59,7 @@ all: libvvm.a
mv $*.d dep
O = vvm_bit.o vvm_calltf.o vvm_event.o vvm_gates.o vvm_pevent.o \
vvm_simulation.o vvm_thread.o vpip.o
vvm_thread.o vpip.o
P = vpi_callback.o \
vpi_const.o vpi_iter.o vpi_memory.o vpi_null.o \

View File

@ -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.26 1999/12/09 06:00:19 steve Exp $"
#ident "$Id: vvm.h,v 1.27 1999/12/12 19:47:54 steve Exp $"
#endif
# include <cassert>
@ -33,8 +33,6 @@
typedef unsigned vvm_u32;
class vvm_event;
class vvm_simulation;
class vvm_simulation_cycle;
class vvm_thread;
class ostream;
@ -159,68 +157,24 @@ template <unsigned WIDTH> class vvm_bitset_t : public vvm_bits_t {
*/
class vvm_event {
friend class vvm_simulation;
public:
vvm_event();
virtual ~vvm_event() =0;
virtual void event_function() =0;
static void callback_(void*);
void schedule(unsigned long delay =0);
private:
struct vpip_event*event_;
static void callback_(void*);
private: // not implemented
vvm_event(const vvm_event&);
vvm_event& operator= (const vvm_event&);
};
/*
* This class is the main simulation engine. Object of this type are
* self-contained simulations. Generally, only one is needed.
*/
class vvm_simulation {
public:
vvm_simulation();
~vvm_simulation();
// Take a simulation that has been primed with some initial
// events, and run it. Continue running it until the
// simulation stops. The sim parameter becomes the new list,
// or 0 if the events run out. The simulation clock is
// advanced for the first cycle in sim.
void run();
// Add an event to an existing simulation cycle list. If there
// is not a cycle for the exact delay of the event, create one
// and insert it into the cycle list. Add the event to the
// list of events for the cycle time.
void insert_event(unsigned long delay, vvm_event*event);
// This puts the event in the current active list. No delay.
void active_event(vvm_event*event);
// These are versions of the *_event methods that take
// vvm_thread objects instead.
void thread_delay(unsigned long delay, vvm_thread*);
void thread_active(vvm_thread*);
// Trigger an event as a monitor event causes it to be
// scheduled and executed when the time cycle is
// complete. Unlike other events, the execution of a event so
// scheduled will not cause the event to be deleted. Also,
// only one event can be a monitor.
void monitor_event(vvm_event*);
bool finished() const;
private: // not implemented
vvm_simulation(const vvm_simulation&);
vvm_simulation& operator= (const vvm_simulation&);
};
/*
* The vvm_signal_t template is the real object that handles the
@ -239,12 +193,12 @@ template <unsigned WIDTH> class vvm_signal_t : public __vpiSignal {
void init_P(unsigned idx, vpip_bit_t val)
{ bits[idx] = val; }
void set_P(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_P(unsigned idx, vpip_bit_t val)
{ bits[idx] = val;
vpip_run_value_changes(this);
}
void set_P(vvm_simulation*sim, const vvm_bitset_t<WIDTH>&val)
void set_P(const vvm_bitset_t<WIDTH>&val)
{ for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
set(sim, idx, val[idx]);
}
@ -253,7 +207,7 @@ template <unsigned WIDTH> class vvm_signal_t : public __vpiSignal {
struct vvm_ram_callback {
vvm_ram_callback();
virtual ~vvm_ram_callback();
virtual void handle_write(vvm_simulation*sim, unsigned idx) =0;
virtual void handle_write(unsigned idx) =0;
vvm_ram_callback*next_;
};
@ -265,20 +219,20 @@ class vvm_memory_t : public __vpiMemory {
{ cb_list_ = 0;
}
void set_word(vvm_simulation*sim, unsigned addr,
void set_word(unsigned addr,
const vvm_bitset_t<WIDTH>&val)
{ unsigned base = WIDTH * addr;
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
bits[base+idx] = val[idx];
call_list_(sim, addr);
call_list_(addr);
}
void set_word(vvm_simulation*sim, unsigned addr,
void set_word(unsigned addr,
const vpip_bit_t val[WIDTH])
{ unsigned base = WIDTH * addr;
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
bits[base+idx] = val[idx];
call_list_(sim, addr);
call_list_(addr);
}
vvm_bitset_t<WIDTH> get_word(unsigned addr) const
@ -296,14 +250,17 @@ class vvm_memory_t : public __vpiMemory {
private:
vvm_ram_callback*cb_list_;
void call_list_(vvm_simulation*sim, unsigned idx)
void call_list_(unsigned idx)
{ for (vvm_ram_callback*cur = cb_list_; cur; cur = cur->next_)
cur->handle_write(sim, idx);
cur->handle_write(idx);
}
};
/*
* $Log: vvm.h,v $
* Revision 1.27 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.26 1999/12/09 06:00:19 steve
* Fix const/non-const errors.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vvm_event.cc,v 1.2 1999/10/28 00:47:25 steve Exp $"
#ident "$Id: vvm_event.cc,v 1.3 1999/12/12 19:47:54 steve Exp $"
#endif
# include "vvm.h"
@ -32,6 +32,11 @@ vvm_event::~vvm_event()
{
}
void vvm_event::schedule(unsigned long delay)
{
event_ = vpip_sim_insert_event(delay, this, callback_, 0);
}
void vvm_event::callback_(void*cbd)
{
vvm_event*obj = reinterpret_cast<vvm_event*>(cbd);
@ -41,6 +46,9 @@ void vvm_event::callback_(void*cbd)
/*
* $Log: vvm_event.cc,v $
* Revision 1.3 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.2 1999/10/28 00:47:25 steve
* Rewrite vvm VPI support to make objects more
* persistent, rewrite the simulation scheduler

View File

@ -23,13 +23,13 @@
* Picture Elements, Inc., 777 Panoramic Way, Berkeley, CA 94704.
*/
#if !defined(WINNT)
#ident "$Id: vvm_gates.cc,v 1.3 1999/12/02 04:54:11 steve Exp $"
#ident "$Id: vvm_gates.cc,v 1.4 1999/12/12 19:47:54 steve Exp $"
#endif
# include "vvm_gates.h"
vvm_out_event::vvm_out_event(vvm_simulation*s, vpip_bit_t v, action_t o)
: output_(o), sim_(s), val_(v)
vvm_out_event::vvm_out_event(vpip_bit_t v, action_t o)
: output_(o), val_(v)
{
}
@ -39,7 +39,7 @@ vvm_out_event::~vvm_out_event()
void vvm_out_event::event_function()
{
output_(sim_, val_);
output_(val_);
}
vvm_1bit_out::vvm_1bit_out(vvm_out_event::action_t o, unsigned d)
@ -51,13 +51,10 @@ vvm_1bit_out::~vvm_1bit_out()
{
}
void vvm_1bit_out::output(vvm_simulation*sim, vpip_bit_t val)
void vvm_1bit_out::output(vpip_bit_t val)
{
vvm_event*ev = new vvm_out_event(sim, val, output_);
if (delay_ > 0)
sim->insert_event(delay_, ev);
else
sim->active_event(ev);
vvm_event*ev = new vvm_out_event(val, output_);
ev -> schedule(delay_);
}
@ -146,6 +143,9 @@ void compute_mux(vpip_bit_t*out, unsigned wid,
/*
* $Log: vvm_gates.cc,v $
* Revision 1.4 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.3 1999/12/02 04:54:11 steve
* Handle mux sel of X, if inputs are equal.
*

View File

@ -1,7 +1,7 @@
#ifndef __vvm_gates_H
#define __vvm_gates_H
/*
* Copyright (c) 1998 Stephen Williams (steve@icarus.com)
* Copyright (c) 1998-1999 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
@ -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.31 1999/12/05 02:24:09 steve Exp $"
#ident "$Id: vvm_gates.h,v 1.32 1999/12/12 19:47:54 steve Exp $"
#endif
# include "vvm.h"
@ -47,16 +47,15 @@ extern void compute_mux(vpip_bit_t*out, unsigned wid,
class vvm_out_event : public vvm_event {
public:
typedef void (*action_t)(vvm_simulation*, vpip_bit_t);
typedef void (*action_t)(vpip_bit_t);
vvm_out_event(vvm_simulation*s, vpip_bit_t v, action_t o);
vvm_out_event(vpip_bit_t v, action_t o);
~vvm_out_event();
void event_function();
private:
const action_t output_;
vvm_simulation*const sim_;
const vpip_bit_t val_;
};
@ -65,7 +64,7 @@ class vvm_1bit_out {
public:
vvm_1bit_out(vvm_out_event::action_t, unsigned delay);
~vvm_1bit_out();
void output(vvm_simulation*sim, vpip_bit_t);
void output(vpip_bit_t);
private:
vvm_out_event::action_t output_;
@ -100,13 +99,13 @@ template <unsigned WIDTH> class vvm_add_sub {
{ ndir_ = not(val);
}
void set_DataA(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_DataA(unsigned idx, vpip_bit_t val)
{ a_[idx] = val;
compute_(sim);
compute_();
}
void set_DataB(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_DataB(unsigned idx, vpip_bit_t val)
{ b_[idx] = val;
compute_(sim);
compute_();
}
private:
@ -120,7 +119,7 @@ template <unsigned WIDTH> class vvm_add_sub {
vvm_out_event::action_t o_[WIDTH];
void compute_(vvm_simulation*sim)
void compute_()
{ vpip_bit_t carry = ndir_;
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1) {
vpip_bit_t val;
@ -128,8 +127,8 @@ template <unsigned WIDTH> class vvm_add_sub {
if (val == r_[idx]) continue;
r_[idx] = val;
if (o_[idx] == 0) continue;
vvm_event*ev = new vvm_out_event(sim, val, o_[idx]);
sim->insert_event(0, ev);
vvm_event*ev = new vvm_out_event(val, o_[idx]);
ev->schedule();
}
}
};
@ -144,13 +143,13 @@ class vvm_and : private vvm_1bit_out {
void init_I(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void start(vvm_simulation*sim)
{ output(sim, compute_and(input_,WIDTH)); }
void start()
{ output(compute_and(input_,WIDTH)); }
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val) return;
input_[idx] = val;
output(sim, compute_and(input_,WIDTH));
output(compute_and(input_,WIDTH));
}
private:
@ -183,29 +182,29 @@ template <unsigned WIDTH, unsigned WDIST> class vvm_clshift {
void init_Direction(vpip_bit_t val)
{ dir_ = val; }
void set_Data(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_Data(unsigned idx, vpip_bit_t val)
{ if (data_[idx] == val) return;
data_[idx] = val;
if ((dist_val_ + idx) >= WIDTH) return;
if ((dist_val_ + idx) < 0) return;
vvm_out_event::action_t out = out_[dist_val_+idx];
if (out == 0) return;
vvm_event*ev = new vvm_out_event(sim, val, out);
sim->active_event(ev);
vvm_event*ev = new vvm_out_event(val, out);
ev->schedule();
}
void set_Distance(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_Distance(unsigned idx, vpip_bit_t val)
{ if (dist_[idx] == val) return;
dist_[idx] = val;
calculate_dist_();
compute_(sim);
compute_();
}
void set_Direction(vvm_simulation*sim, unsigned, vpip_bit_t val)
void set_Direction(unsigned, vpip_bit_t val)
{ if (dir_ == val) return;
dir_ = val;
calculate_dist_();
compute_(sim);
compute_();
}
void config_rout(unsigned idx, vvm_out_event::action_t o)
@ -238,13 +237,13 @@ template <unsigned WIDTH, unsigned WDIST> class vvm_clshift {
dist_val_ = tmp;
}
void compute_(vvm_simulation*sim)
void compute_()
{ vvm_event*ev;
if (dist_val_ == WIDTH) {
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1) {
if (out_[idx] == 0) continue;
ev = new vvm_out_event(sim, Vx, out_[idx]);
sim->active_event(ev);
ev = new vvm_out_event(Vx, out_[idx]);
ev->schedule();
}
return;
}
@ -254,8 +253,8 @@ template <unsigned WIDTH, unsigned WDIST> class vvm_clshift {
if ((idx-dist_val_) >= WIDTH) val = V0;
else if ((idx-dist_val_) < 0) val = V0;
else val = data_[idx-dist_val_];
ev = new vvm_out_event(sim, val, out_[idx]);
sim->active_event(ev);
ev = new vvm_out_event(val, out_[idx]);
ev->schedule();
}
}
};
@ -280,16 +279,16 @@ template <unsigned WIDTH> class vvm_compare {
void init_DataB(unsigned idx, vpip_bit_t val)
{ b_[idx] = val; }
void set_DataA(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_DataA(unsigned idx, vpip_bit_t val)
{ if (a_[idx] == val) return;
a_[idx] = val;
compute_(sim);
compute_();
}
void set_DataB(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_DataB(unsigned idx, vpip_bit_t val)
{ if (b_[idx] == val) return;
b_[idx] = val;
compute_(sim);
compute_();
}
void config_ALB_out(vvm_out_event::action_t o)
@ -316,7 +315,7 @@ template <unsigned WIDTH> class vvm_compare {
vvm_out_event::action_t out_gt_;
vvm_out_event::action_t out_ge_;
void compute_(vvm_simulation*sim)
void compute_()
{ vpip_bit_t gt = V0;
vpip_bit_t lt = V0;
vvm_event*ev;
@ -329,20 +328,20 @@ template <unsigned WIDTH> class vvm_compare {
gt_ = gt;
lt_ = lt;
if (out_lt_) {
ev = new vvm_out_event(sim, lt_, out_lt_);
sim->active_event(ev);
ev = new vvm_out_event(lt_, out_lt_);
ev->schedule();
}
if (out_le_) {
ev = new vvm_out_event(sim, not(gt_), out_le_);
sim->active_event(ev);
ev = new vvm_out_event(not(gt_), out_le_);
ev->schedule();
}
if (out_gt_) {
ev = new vvm_out_event(sim, gt_, out_gt_);
sim->active_event(ev);
ev = new vvm_out_event(gt_, out_gt_);
ev->schedule();
}
if (out_ge_) {
ev = new vvm_out_event(sim, not(lt_), out_ge_);
sim->active_event(ev);
ev = new vvm_out_event(not(lt_), out_ge_);
ev->schedule();
}
}
};
@ -365,14 +364,14 @@ template <unsigned WIDTH> class vvm_ff {
void init_Data(unsigned idx, vpip_bit_t val) { d_[idx] = val; }
void init_Clock(unsigned, vpip_bit_t val) { clk_ = val; }
void set_Clock(vvm_simulation*sim, unsigned, vpip_bit_t val)
void set_Clock(unsigned, vpip_bit_t val)
{ if (val == clk_) return;
bool flag = posedge(clk_, val);
clk_ = val;
if (flag) latch_(sim);
if (flag) latch_();
}
void set_Data(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_Data(unsigned idx, vpip_bit_t val)
{ d_[idx] = val;
}
@ -387,13 +386,12 @@ template <unsigned WIDTH> class vvm_ff {
vvm_out_event::action_t out_[WIDTH];
void latch_(vvm_simulation*sim)
void latch_()
{ q_ = d_;
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
if (out_[idx]) {
vvm_event*ev = new vvm_out_event(sim, q_[idx],
out_[idx]);
sim->active_event(ev);
vvm_event*ev = new vvm_out_event(q_[idx], out_[idx]);
ev->schedule();
}
}
};
@ -420,16 +418,16 @@ template <unsigned WIDTH, unsigned SIZE, unsigned SELWID> class vvm_mux {
void init_Data(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void set_Sel(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_Sel(unsigned idx, vpip_bit_t val)
{ if (sel_[idx] == val) return;
sel_[idx] = val;
evaluate_(sim);
evaluate_();
}
void set_Data(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_Data(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val) return;
input_[idx] = val;
evaluate_(sim);
evaluate_();
}
void config_rout(unsigned idx, vvm_out_event::action_t o)
@ -442,16 +440,15 @@ template <unsigned WIDTH, unsigned SIZE, unsigned SELWID> class vvm_mux {
vvm_out_event::action_t out_[WIDTH];
void evaluate_(vvm_simulation*sim)
void evaluate_()
{ vpip_bit_t tmp[WIDTH];
compute_mux(tmp, WIDTH, sel_, SELWID, input_, SIZE);
for (unsigned idx = 0 ; idx < WIDTH ; idx += 1)
if (tmp[idx] != output_[idx]) {
output_[idx] = tmp[idx];
vvm_event*ev = new vvm_out_event(sim,
output_[idx],
vvm_event*ev = new vvm_out_event(output_[idx],
out_[idx]);
sim->active_event(ev);
ev->schedule();
}
}
};
@ -466,14 +463,14 @@ class vvm_or : private vvm_1bit_out {
void init_I(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void start(vvm_simulation*sim)
{ output(sim, compute_or(input_,WIDTH)); }
void start()
{ output(compute_or(input_,WIDTH)); }
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val)
return;
input_[idx] = val;
output(sim, compute_or(input_,WIDTH));
output(compute_or(input_,WIDTH));
}
private:
@ -490,14 +487,14 @@ class vvm_nor : private vvm_1bit_out {
void init_I(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void start(vvm_simulation*sim)
{ output(sim, compute_nor(input_,WIDTH)); }
void start()
{ output(compute_nor(input_,WIDTH)); }
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val)
return;
input_[idx] = val;
output(sim, compute_nor(input_,WIDTH));
output(compute_nor(input_,WIDTH));
}
private:
@ -538,29 +535,29 @@ class vvm_ram_dq : protected vvm_ram_callback {
void init_InClock(unsigned, vpip_bit_t val)
{ iclk_ = val; }
void set_Address(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_Address(unsigned idx, vpip_bit_t val)
{ if (addr_[idx] == val) return;
addr_[idx] = val;
compute_();
send_out_(sim);
send_out_();
}
void set_Data(vvm_simulation*, unsigned idx, vpip_bit_t val)
void set_Data(unsigned idx, vpip_bit_t val)
{ data_[idx] = val; }
void set_WE(vvm_simulation*, unsigned, vpip_bit_t val)
void set_WE(unsigned, vpip_bit_t val)
{ we_ = val; }
void set_InClock(vvm_simulation*sim, unsigned, vpip_bit_t val)
void set_InClock(unsigned, vpip_bit_t val)
{ if (val == iclk_) return;
vpip_bit_t tmp = iclk_;
iclk_ = val;
if (we_ != V1) return;
if (posedge(tmp, val)) mem_->set_word(sim, addr_val_, data_);
if (posedge(tmp, val)) mem_->set_word(addr_val_, data_);
}
void handle_write(vvm_simulation*sim, unsigned idx)
{ if (idx == addr_val_) send_out_(sim); }
void handle_write(unsigned idx)
{ if (idx == addr_val_) send_out_(); }
void config_rout(unsigned idx, vvm_out_event::action_t o)
{ out_[idx] = o; }
@ -585,14 +582,13 @@ class vvm_ram_dq : protected vvm_ram_callback {
if (addr_[bit] == V1) addr_val_ |= mask;
}
void send_out_(vvm_simulation*sim)
void send_out_()
{ vvm_bitset_t<WIDTH>ov = mem_->get_word(addr_val_);
for (unsigned bit = 0 ; bit < WIDTH ; bit += 1)
if (out_[bit]) {
vvm_event*ev = new vvm_out_event(sim,
ov[bit],
vvm_event*ev = new vvm_out_event(ov[bit],
out_[bit]);
sim->active_event(ev);
ev->schedule();
}
}
};
@ -605,16 +601,13 @@ template <unsigned long DELAY> class vvm_buf {
{ }
void init_I(unsigned, vpip_bit_t) { }
void start(vvm_simulation*) { }
void start() { }
void set_I(vvm_simulation*sim, unsigned, vpip_bit_t val)
void set_I(unsigned, vpip_bit_t val)
{ vpip_bit_t outval = val;
if (val == Vz) val = Vx;
vvm_event*ev = new vvm_out_event(sim, outval, output_);
if (DELAY > 0)
sim->insert_event(DELAY, ev);
else
sim->active_event(ev);
vvm_event*ev = new vvm_out_event(outval, output_);
ev->schedule(DELAY);
}
private:
@ -630,18 +623,15 @@ template <unsigned long DELAY> class vvm_bufif1 {
input_[1] = Vx;
}
void set(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set(unsigned idx, vpip_bit_t val)
{ if (input_[idx-1] == val)
return;
input_[idx-1] = val;
vvm_event*ev = new vvm_out_event(sim, compute_(), output_);
if (DELAY > 0)
sim->insert_event(DELAY, ev);
else
sim->active_event(ev);
vvm_event*ev = new vvm_out_event(compute_(), output_);
ev->schedule(DELAY);
}
void start(vvm_simulation*sim)
void start()
{
}
@ -666,13 +656,13 @@ class vvm_nand : private vvm_1bit_out {
void init_I(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void start(vvm_simulation*sim)
{ output(sim, compute_nand(input_,WIDTH)); }
void start()
{ output(compute_nand(input_,WIDTH)); }
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val) return;
input_[idx] = val;
output(sim, compute_nand(input_,WIDTH));
output(compute_nand(input_,WIDTH));
}
private:
@ -689,10 +679,10 @@ template <unsigned long DELAY> class vvm_not : private vvm_1bit_out {
: vvm_1bit_out(o, DELAY) { }
void init_I(unsigned, vpip_bit_t) { }
void start(vvm_simulation*) { }
void start() { }
void set_I(vvm_simulation*sim, unsigned, vpip_bit_t val)
{ output(sim, not(val)); }
void set_I(unsigned, vpip_bit_t val)
{ output(not(val)); }
private:
};
@ -706,14 +696,14 @@ class vvm_xnor : private vvm_1bit_out {
void init_I(unsigned idx, vpip_bit_t val) { input_[idx] = val; }
void start(vvm_simulation*sim)
{ output(sim,compute_xnor(input_,WIDTH)); }
void start()
{ output(compute_xnor(input_,WIDTH)); }
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val)
return;
input_[idx] = val;
output(sim,compute_xnor(input_,WIDTH));
output(compute_xnor(input_,WIDTH));
}
private:
@ -730,14 +720,14 @@ class vvm_xor : private vvm_1bit_out {
void init_I(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void start(vvm_simulation*sim)
{ output(sim,compute_xor(input_,WIDTH)); }
void start()
{ output(compute_xor(input_,WIDTH)); }
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val)
return;
input_[idx] = val;
output(sim,compute_xor(input_,WIDTH)); }
output(compute_xor(input_,WIDTH)); }
private:
vpip_bit_t input_[WIDTH];
@ -756,19 +746,16 @@ template <unsigned long DELAY> class vvm_eeq {
void init_I(unsigned idx, vpip_bit_t val)
{ input_[idx] = val; }
void start(vvm_simulation*sim)
{ vvm_event*ev = new vvm_out_event(sim, compute_(), output_);
if (DELAY > 0)
sim->insert_event(DELAY, ev);
else
sim->active_event(ev);
void start()
{ vvm_event*ev = new vvm_out_event(compute_(), output_);
ev->schedule(DELAY);
}
void set_I(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_I(unsigned idx, vpip_bit_t val)
{ if (input_[idx] == val)
return;
input_[idx] = val;
start(sim);
start();
}
private:
@ -805,7 +792,7 @@ template <unsigned WIDTH> class vvm_udp_ssequ {
void init(unsigned pin, vpip_bit_t val)
{ state_[pin] = val; }
void set(vvm_simulation*sim, unsigned pin, vpip_bit_t val)
void set(unsigned pin, vpip_bit_t val)
{ assert(pin > 0);
assert(pin < WIDTH+1);
if (val == Vz) val = Vx;
@ -836,8 +823,8 @@ template <unsigned WIDTH> class vvm_udp_ssequ {
vpip_bit_t outval = (code == 0)? V0 : (code == 1)? V1 : Vx;
state_[0] = outval;
state_[pin] = val;
vvm_event*ev = new vvm_out_event(sim, outval, output_);
sim->insert_event(1, ev); // XXXX Delay not supported.
vvm_event*ev = new vvm_out_event(outval, output_);
ev->schedule(1); // XXXX Delay not supported.
}
private:
@ -854,8 +841,8 @@ class vvm_bufz {
void init(unsigned idx, vpip_bit_t val) { }
void set(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
{ output_(sim, val); }
void set(unsigned idx, vpip_bit_t val)
{ output_(val); }
private:
vvm_out_event::action_t output_;
@ -877,7 +864,7 @@ class vvm_sync {
vvm_sync();
void wait(vvm_thread*);
void wakeup(vvm_simulation*sim);
void wakeup();
private:
vvm_thread*hold_;
@ -899,19 +886,19 @@ template <unsigned WIDTH> class vvm_pevent {
vvm_bitset_t<WIDTH> get() const { return value_; }
void set_P(vvm_simulation*sim, unsigned idx, vpip_bit_t val)
void set_P(unsigned idx, vpip_bit_t val)
{ if (value_[idx] == val) return;
switch (edge_) {
case ANYEDGE:
target_->wakeup(sim);
target_->wakeup();
break;
case POSEDGE:
if (val == V1)
target_->wakeup(sim);
target_->wakeup();
break;
case NEGEDGE:
if (val == V0)
target_->wakeup(sim);
target_->wakeup();
break;
}
value_[idx] = val;
@ -934,6 +921,9 @@ template <unsigned WIDTH> class vvm_pevent {
/*
* $Log: vvm_gates.h,v $
* Revision 1.32 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.31 1999/12/05 02:24:09 steve
* Synthesize LPM_RAM_DQ for writes into memories.
*

View File

@ -17,11 +17,12 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vvm_pevent.cc,v 1.3 1999/05/01 20:43:55 steve Exp $"
#ident "$Id: vvm_pevent.cc,v 1.4 1999/12/12 19:47:54 steve Exp $"
#endif
# include "vvm.h"
# include "vvm_gates.h"
# include "vvm_thread.h"
vvm_sync::vvm_sync()
: hold_(0)
@ -34,16 +35,19 @@ void vvm_sync::wait(vvm_thread*thr)
hold_ = thr;
}
void vvm_sync::wakeup(vvm_simulation*sim)
void vvm_sync::wakeup()
{
vvm_thread*tmp = hold_;
hold_ = 0;
if (tmp) sim->thread_active(tmp);
if (tmp) tmp->thread_yield();
}
/*
* $Log: vvm_pevent.cc,v $
* Revision 1.4 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.3 1999/05/01 20:43:55 steve
* Handle wide events, such as @(a) where a has
* many bits in it.

View File

@ -1,115 +0,0 @@
/*
* Copyright (c) 1998-1999 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
* General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vvm_simulation.cc,v 1.7 1999/10/28 00:47:25 steve Exp $"
#endif
# include "vvm.h"
# include "vvm_thread.h"
# include "vpi_priv.h"
# include <assert.h>
vvm_simulation::vvm_simulation()
{
}
vvm_simulation::~vvm_simulation()
{
}
void vvm_simulation::monitor_event(vvm_event*)
{
assert(0);
}
void vvm_simulation::insert_event(unsigned long delay, vvm_event*event)
{
event->event_ = vpip_sim_insert_event(delay, event,
vvm_event::callback_, 0);
}
void vvm_simulation::active_event(vvm_event*event)
{
event->event_ = vpip_sim_insert_event(0, event,
vvm_event::callback_, 0);
}
/*
* This function takes a list of simulation cycles and runs the
* simulation. It consumes the list as the events are executes,
* eventually deleting everything.
*/
void vvm_simulation::run()
{
vpip_simulation_run();
}
class delay_event : public vvm_event {
public:
delay_event(vvm_thread*thr) : thr_(thr) { }
void event_function() { while (thr_->go()) /* empty */; }
private:
vvm_thread*thr_;
};
void vvm_simulation::thread_delay(unsigned long delay, vvm_thread*thr)
{
delay_event*ev = new delay_event(thr);
insert_event(delay, ev);
}
void vvm_simulation::thread_active(vvm_thread*thr)
{
delay_event*ev = new delay_event(thr);
active_event(ev);
}
/*
* $Log: vvm_simulation.cc,v $
* Revision 1.7 1999/10/28 00:47:25 steve
* Rewrite vvm VPI support to make objects more
* persistent, rewrite the simulation scheduler
* in C (to interface with VPI) and add VPI support
* for callbacks.
*
* Revision 1.6 1999/10/06 01:28:18 steve
* The $finish task should work immediately.
*
* Revision 1.5 1999/09/29 02:53:33 steve
* Useless assertion.
*
* Revision 1.4 1999/06/19 03:31:33 steve
* End run if events run out.
*
* Revision 1.3 1999/06/07 03:40:03 steve
* Allow 0 delays for things like thread yield.
*
* Revision 1.2 1998/11/10 00:48:31 steve
* Add support it vvm target for level-sensitive
* triggers (i.e. the Verilog wait).
* Fix display of $time is format strings.
*
* Revision 1.1 1998/11/09 23:44:11 steve
* Add vvm library.
*
*/

View File

@ -17,24 +17,42 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vvm_thread.cc,v 1.1 1998/11/09 23:44:11 steve Exp $"
#ident "$Id: vvm_thread.cc,v 1.2 1999/12/12 19:47:54 steve Exp $"
#endif
# include "vvm.h"
# include "vvm_thread.h"
vvm_thread::vvm_thread(vvm_simulation*sim)
: sim_(sim)
class delay_event : public vvm_event {
public:
delay_event(vvm_thread*thr) : thr_(thr) { }
void event_function() { while (thr_->go()) /* empty */; }
private:
vvm_thread*thr_;
};
vvm_thread::vvm_thread()
{
sim_->thread_active(this);
thread_yield();
}
vvm_thread::~vvm_thread()
{
}
void vvm_thread::thread_yield(unsigned long delay)
{
delay_event*ev = new delay_event(this);
ev -> schedule(delay);
}
/*
* $Log: vvm_thread.cc,v $
* Revision 1.2 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.1 1998/11/09 23:44:11 steve
* Add vvm library.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vvm_thread.h,v 1.2 1998/11/10 00:48:31 steve Exp $"
#ident "$Id: vvm_thread.h,v 1.3 1999/12/12 19:47:54 steve Exp $"
#endif
# include "vvm.h"
@ -36,20 +36,24 @@
class vvm_thread {
public:
explicit vvm_thread(vvm_simulation*sim);
explicit vvm_thread();
virtual ~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;
protected:
vvm_simulation*const sim_;
};
/*
* $Log: vvm_thread.h,v $
* Revision 1.3 1999/12/12 19:47:54 steve
* Remove the useless vvm_simulation class.
*
* Revision 1.2 1998/11/10 00:48:31 steve
* Add support it vvm target for level-sensitive
* triggers (i.e. the Verilog wait).