diff --git a/ivl_target.h b/ivl_target.h index c62a00302..c1e6034cf 100644 --- a/ivl_target.h +++ b/ivl_target.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: ivl_target.h,v 1.36 2001/03/27 06:27:40 steve Exp $" +#ident "$Id: ivl_target.h,v 1.37 2001/03/28 06:07:39 steve Exp $" #endif #ifdef __cplusplus @@ -61,6 +61,11 @@ _BEGIN_DECL * This object represents the entire elaborated design. Various * global properties and methods are available from this. * + * ivl_event_t + * This object represents an event node. An event node stands for + * named events written explicitly in the Verilog, and net events + * that are implicit when @ statements are used. + * * ivl_expr_t * This object represents a node of an expression. If the * expression has sub-expressions, they can be accessed from @@ -123,12 +128,12 @@ _BEGIN_DECL * they include the instance name of the module that contains them. */ typedef struct ivl_design_s *ivl_design_t; +typedef struct ivl_event_s *ivl_event_t; typedef struct ivl_expr_s *ivl_expr_t; typedef struct ivl_lpm_s *ivl_lpm_t; typedef struct ivl_lpm_ff_s *ivl_lpm_ff_t; typedef struct ivl_lval_s *ivl_lval_t; typedef struct ivl_net_const_s*ivl_net_const_t; -typedef struct ivl_net_event_s*ivl_net_event_t; typedef struct ivl_net_logic_s*ivl_net_logic_t; typedef struct ivl_net_probe_s*ivl_net_probe_t; typedef struct ivl_nexus_s *ivl_nexus_t; @@ -146,9 +151,10 @@ typedef struct ivl_statement_s*ivl_statement_t; typedef enum ivl_edge_type_e { - IVL_EDGE_ANY = 0, - IVL_EDGE_POS = 1, - IVL_EDGE_NEG = 2 + IVL_EDGE_NONE = 0, + IVL_EDGE_ANY = 1, + IVL_EDGE_POS = 2, + IVL_EDGE_NEG = 3 } ivl_edge_type_t; /* This is the type of an ivl_expr_t object. */ @@ -300,6 +306,31 @@ extern ivl_nexus_t ivl_const_pin(ivl_net_const_t net, unsigned idx); extern unsigned ivl_const_pins(ivl_net_const_t net); extern int ivl_const_signed(ivl_net_const_t net); +/* EVENTS + * + * Events are a unification of named events and implicit events + * generated by the @ statements. + * + * ivl_event_name + * ivl_event_basename + * + * ivl_event_edge + * Return the edge type for the event. If this is a named event + * that has no network input, then the edge is IVL_EDGE_NONE. + * + * ivl_event_pins + * ivl_event_pin + * Events of edge other then NONE have pins that are the connection + * of the event to the net. + */ +extern const char* ivl_event_name(ivl_event_t net); +extern const char* ivl_event_basename(ivl_event_t net); +extern ivl_edge_type_t ivl_event_edge(ivl_event_t net); + +extern unsigned ivl_event_pins(ivl_event_t net); +extern ivl_nexus_t ivl_event_pin(ivl_event_t net, unsigned idx); + + /* EXPRESSIONS * * These methods operate on expression objects from the @@ -509,6 +540,10 @@ extern ivl_signal_t ivl_nexus_ptr_sig(ivl_nexus_ptr_t net); * If the scope has no children, this method will return 0 and * otherwise do nothing. * + * ivl_scope_event + * ivl_scope_events + * Scopes have 0 or more event objects in them. + * * ivl_scope_log * ivl_scope_logs * Scopes have 0 or more logic devices in them. A logic device is @@ -534,6 +569,8 @@ extern ivl_signal_t ivl_nexus_ptr_sig(ivl_nexus_ptr_t net); extern int ivl_scope_children(ivl_scope_t net, ivl_scope_f func, void*cd); +extern unsigned ivl_scope_events(ivl_scope_t net); +extern ivl_event_t ivl_scope_event(ivl_scope_t net, unsigned idx); extern unsigned ivl_scope_logs(ivl_scope_t net); extern ivl_net_logic_t ivl_scope_log(ivl_scope_t net, unsigned idx); extern unsigned ivl_scope_lpms(ivl_scope_t net); @@ -635,8 +672,6 @@ extern ivl_statement_type_t ivl_statement_type(ivl_statement_t net); /* IVL_ST_BLOCK */ extern unsigned ivl_stmt_block_count(ivl_statement_t net); - /* IVL_ST_WAIT */ -extern ivl_edge_type_t ivl_stmt_edge(ivl_statement_t net); /* IVL_ST_BLOCK */ extern ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net, unsigned i); /* IVL_ST_CONDIT */ @@ -647,6 +682,8 @@ extern ivl_statement_t ivl_stmt_cond_false(ivl_statement_t net); extern ivl_statement_t ivl_stmt_cond_true(ivl_statement_t net); /* IVL_ST_DELAY */ extern unsigned long ivl_stmt_delay_val(ivl_statement_t net); + /* IVL_ST_WAIT */ +extern ivl_event_t ivl_stmt_event(ivl_statement_t net); /* IVL_ST_ASSIGN */ extern ivl_lval_t ivl_stmt_lval(ivl_statement_t net, unsigned idx); /* IVL_ST_ASSIGN */ @@ -659,9 +696,6 @@ extern const char* ivl_stmt_name(ivl_statement_t net); extern ivl_expr_t ivl_stmt_parm(ivl_statement_t net, unsigned idx); /* IVL_ST_STASK */ extern unsigned ivl_stmt_parm_count(ivl_statement_t net); - /* IVL_ST_WAIT */ -extern unsigned ivl_stmt_pins(ivl_statement_t net); -extern ivl_nexus_t ivl_stmt_pin(ivl_statement_t net, unsigned idx); /* IVL_ST_ASSIGN */ extern ivl_expr_t ivl_stmt_rval(ivl_statement_t net); /* IVL_ST_DELAY, IVL_ST_WAIT, IVL_ST_WHILE */ @@ -685,6 +719,10 @@ _END_DECL /* * $Log: ivl_target.h,v $ + * Revision 1.37 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.36 2001/03/27 06:27:40 steve * Generate code for simple @ statements. * diff --git a/net_event.cc b/net_event.cc index dd4a42869..73e5646db 100644 --- a/net_event.cc +++ b/net_event.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: net_event.cc,v 1.12 2000/12/15 17:45:07 steve Exp $" +#ident "$Id: net_event.cc,v 1.13 2001/03/28 06:07:39 steve Exp $" #endif # include "netlist.h" @@ -58,6 +58,12 @@ string NetEvent::full_name() const return scope_->name() + "." + name_; } +const NetScope* NetEvent::scope() const +{ + assert(scope_); + return scope_; +} + unsigned NetEvent::nprobe() const { unsigned cnt = 0; @@ -433,6 +439,10 @@ NetProc* NetEvWait::statement() /* * $Log: net_event.cc,v $ + * Revision 1.13 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.12 2000/12/15 17:45:07 steve * Remove limits from the similar events search. * diff --git a/t-dll-api.cc b/t-dll-api.cc index ff0d94f7b..f3f7079f2 100644 --- a/t-dll-api.cc +++ b/t-dll-api.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: t-dll-api.cc,v 1.23 2001/03/27 06:27:40 steve Exp $" +#ident "$Id: t-dll-api.cc,v 1.24 2001/03/28 06:07:39 steve Exp $" #endif # include "t-dll.h" @@ -85,6 +85,39 @@ extern "C" int ivl_const_signed(ivl_net_const_t net) return net->signed_ == 1; } +extern "C" const char* ivl_event_name(ivl_event_t net) +{ + return net->name; +} + +extern "C" const char* ivl_event_basename(ivl_event_t net) +{ + const char*nam = net->name; + nam += strlen(ivl_scope_name(net->scope)); + assert(*nam == '.'); + nam += 1; + return nam; +} + +extern "C" ivl_edge_type_t ivl_event_edge(ivl_event_t net) +{ + assert(net); + return net->edge; +} + +extern "C" unsigned ivl_event_pins(ivl_event_t net) +{ + assert(net); + return net->npins; +} + +extern "C" ivl_nexus_t ivl_event_pin(ivl_event_t net, unsigned idx) +{ + assert(net); + assert(idx < net->npins); + return net->pins[idx]; +} + extern "C" const char* ivl_expr_bits(ivl_expr_t net) { assert(net && (net->type_ == IVL_EX_NUMBER)); @@ -385,6 +418,19 @@ extern "C" int ivl_scope_children(ivl_scope_t net, return 0; } +extern "C" unsigned ivl_scope_events(ivl_scope_t net) +{ + assert(net); + return net->nevent_; +} + +extern "C" ivl_event_t ivl_scope_event(ivl_scope_t net, unsigned idx) +{ + assert(net); + assert(idx < net->nevent_); + return net->event_[idx]; +} + extern "C" unsigned ivl_scope_logs(ivl_scope_t net) { assert(net); @@ -547,10 +593,10 @@ extern "C" unsigned long ivl_stmt_delay_val(ivl_statement_t net) return net->u_.delay_.delay_; } -extern "C" ivl_edge_type_t ivl_stmt_edge(ivl_statement_t net) +extern "C" ivl_event_t ivl_stmt_event(ivl_statement_t net) { assert(net->type_ == IVL_ST_WAIT); - return net->u_.wait_.edge_; + return net->u_.wait_.event_; } extern "C" ivl_lval_t ivl_stmt_lval(ivl_statement_t net, unsigned idx) @@ -627,29 +673,6 @@ extern "C" unsigned ivl_stmt_parm_count(ivl_statement_t net) return 0; } -extern "C" unsigned ivl_stmt_pins(ivl_statement_t net) -{ - switch (net->type_) { - case IVL_ST_WAIT: - return 1; - default: - assert(0); - } - return 0; -} - -extern "C" ivl_nexus_t ivl_stmt_pin(ivl_statement_t net, unsigned idx) -{ - switch (net->type_) { - case IVL_ST_WAIT: - assert(idx == 0); - return net->u_.wait_.cond_; - default: - assert(0); - } - return 0; -} - extern "C" ivl_expr_t ivl_stmt_rval(ivl_statement_t net) { switch (net->type_) { @@ -680,6 +703,10 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net) /* * $Log: t-dll-api.cc,v $ + * Revision 1.24 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.23 2001/03/27 06:27:40 steve * Generate code for simple @ statements. * diff --git a/t-dll-proc.cc b/t-dll-proc.cc index 9a4536f0d..fb9e1f807 100644 --- a/t-dll-proc.cc +++ b/t-dll-proc.cc @@ -18,7 +18,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: t-dll-proc.cc,v 1.12 2001/03/27 06:27:40 steve Exp $" +#ident "$Id: t-dll-proc.cc,v 1.13 2001/03/28 06:07:39 steve Exp $" #endif # include "target.h" @@ -279,28 +279,36 @@ bool dll_target::proc_wait(const NetEvWait*net) return false; } - NetEvent*ev = net->event(0); - assert(ev->nprobe() == 1); + /* Locate the event by name. Save the ivl_event_t in the + statement so that the generator can find it easily. */ + const NetEvent*ev = net->event(0); + ivl_scope_t ev_scope = lookup_scope_(ev->scope()); - const NetEvProbe*pr = ev->probe(0); - assert(pr->pin_count() == 1); - - switch (pr->edge()) { - case NetEvProbe::ANYEDGE: - stmt_cur_->u_.wait_.edge_ = IVL_EDGE_ANY; - break; - case NetEvProbe::NEGEDGE: - stmt_cur_->u_.wait_.edge_ = IVL_EDGE_NEG; - break; - case NetEvProbe::POSEDGE: - stmt_cur_->u_.wait_.edge_ = IVL_EDGE_POS; - break; + for (unsigned idx = 0 ; idx < ev_scope->nevent_ ; idx += 1) { + const char*ename = ivl_event_basename(ev_scope->event_[idx]); + if (strcmp(ev->name(), ename) == 0) { + stmt_cur_->u_.wait_.event_ = ev_scope->event_[idx]; + break; + } } - const Nexus*nex = pr->pin(0).nexus(); - assert(nex); - assert(nex->t_cookie()); - stmt_cur_->u_.wait_.cond_ = (ivl_nexus_t) nex->t_cookie(); + /* If this is an event with a probe, then connect up the + pins. This wasn't done during the ::event method because + the signals weren't scanned yet. */ + + if (ev->nprobe() == 1) { + const NetEvProbe*pr = ev->probe(0); + ivl_event_t evnt = stmt_cur_->u_.wait_.event_; + + assert(pr->pin_count() == evnt->npins); + + for (unsigned idx = 0 ; idx < evnt->npins ; idx += 1) { + ivl_nexus_t nex = (ivl_nexus_t) + pr->pin(idx).nexus()->t_cookie(); + assert(nex); + evnt->pins[idx] = nex; + } + } ivl_statement_t save_cur_ = stmt_cur_; stmt_cur_ = stmt_cur_->u_.wait_.stmt_; @@ -333,6 +341,10 @@ void dll_target::proc_while(const NetWhile*net) /* * $Log: t-dll-proc.cc,v $ + * Revision 1.13 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.12 2001/03/27 06:27:40 steve * Generate code for simple @ statements. * diff --git a/t-dll.cc b/t-dll.cc index e65e86e38..e92f1141e 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: t-dll.cc,v 1.29 2001/03/27 03:31:06 steve Exp $" +#ident "$Id: t-dll.cc,v 1.30 2001/03/28 06:07:39 steve Exp $" #endif # include "compiler.h" @@ -160,6 +160,22 @@ void scope_add_logic(ivl_scope_t scope, ivl_net_logic_t net) } +void scope_add_event(ivl_scope_t scope, ivl_event_t net) +{ + if (scope->nevent_ == 0) { + scope->nevent_ = 1; + scope->event_ = (ivl_event_t*)malloc(sizeof(ivl_event_t)); + scope->event_[0] = net; + + } else { + scope->nevent_ += 1; + scope->event_ = (ivl_event_t*) + realloc(scope->event_, scope->nevent_*sizeof(ivl_event_t)); + scope->event_[scope->nevent_-1] = net; + } + +} + static void scope_add_lpm(ivl_scope_t scope, ivl_lpm_t net) { if (scope->nlpm_ == 0) { @@ -273,6 +289,45 @@ bool dll_target::bufz(const NetBUFZ*net) void dll_target::event(const NetEvent*net) { + struct ivl_event_s *obj = new struct ivl_event_s; + + ivl_scope_t scope = find_scope(des_.root_, net->scope()); + obj->name = strdup(net->full_name().c_str()); + obj->scope = scope; + scope_add_event(scope, obj); + + assert(net->nprobe() <= 1); + + if (net->nprobe() == 1) { + const NetEvProbe*pr = net->probe(0); + switch (pr->edge()) { + case NetEvProbe::ANYEDGE: + obj->edge = IVL_EDGE_ANY; + break; + case NetEvProbe::NEGEDGE: + obj->edge = IVL_EDGE_NEG; + break; + case NetEvProbe::POSEDGE: + obj->edge = IVL_EDGE_POS; + break; + } + + obj->npins = pr->pin_count(); + obj->pins = (ivl_nexus_t*)calloc(obj->npins, sizeof(ivl_nexus_t)); +#if 0 + for (unsigned idx = 0 ; idx < obj->npins ; idx += 1) { + ivl_nexus_t nex = (ivl_nexus_t) + pr->pin(idx).nexus()->t_cookie(); + assert(nex); + obj->pins[idx] = nex; + } +#endif + } else { + obj->npins = 0; + obj->pins = 0; + obj->edge = IVL_EDGE_NONE; + } + } void dll_target::logic(const NetLogic*net) @@ -691,6 +746,10 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj }; /* * $Log: t-dll.cc,v $ + * Revision 1.30 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.29 2001/03/27 03:31:06 steve * Support error code from target_t::end_design method. * diff --git a/t-dll.h b/t-dll.h index 4994f4395..30dfec23b 100644 --- a/t-dll.h +++ b/t-dll.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: t-dll.h,v 1.24 2001/03/27 06:27:40 steve Exp $" +#ident "$Id: t-dll.h,v 1.25 2001/03/28 06:07:39 steve Exp $" #endif # include "target.h" @@ -100,6 +100,14 @@ struct dll_target : public target_t, public expr_scan_t { * These are various private declarations used by the t-dll target. */ +struct ivl_event_s { + char*name; + ivl_scope_t scope; + ivl_edge_type_t edge; + unsigned npins; + ivl_nexus_t*pins; +}; + /* * The ivl_expr_t is an opaque reference to one of these * structures. This structure holds all the information we need about @@ -279,6 +287,9 @@ struct ivl_scope_s { unsigned nlog_; ivl_net_logic_t*log_; + unsigned nevent_; + ivl_event_t* event_; + unsigned nlpm_; ivl_lpm_t* lpm_; }; @@ -352,12 +363,11 @@ struct ivl_statement_s { } stask_; struct { /* IVL_ST_TRIGGER */ - ivl_net_event_t event_; + ivl_event_t event_; } trig_; struct { /* IVL_ST_WAIT */ - ivl_edge_type_t edge_; - ivl_nexus_t cond_; + ivl_event_t event_; ivl_statement_t stmt_; } wait_; @@ -370,6 +380,10 @@ struct ivl_statement_s { /* * $Log: t-dll.h,v $ + * Revision 1.25 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.24 2001/03/27 06:27:40 steve * Generate code for simple @ statements. * diff --git a/tgt-stub/stub.c b/tgt-stub/stub.c index 83b59e331..f9ca9142c 100644 --- a/tgt-stub/stub.c +++ b/tgt-stub/stub.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: stub.c,v 1.29 2001/02/07 22:22:00 steve Exp $" +#ident "$Id: stub.c,v 1.30 2001/03/28 06:07:39 steve Exp $" #endif /* @@ -144,7 +144,8 @@ static void show_statement(ivl_statement_t net, unsigned ind) fprintf(out, "}\n"); } - show_expression(ivl_stmt_rval(net), ind+4); + if (ivl_stmt_rval(net)) + show_expression(ivl_stmt_rval(net), ind+4); break; case IVL_ST_BLOCK: { @@ -189,7 +190,8 @@ static void show_statement(ivl_statement_t net, unsigned ind) fprintf(out, "%*sCall %s(%u parameters);\n", ind, "", ivl_stmt_name(net), ivl_stmt_parm_count(net)); for (idx = 0 ; idx < ivl_stmt_parm_count(net) ; idx += 1) - show_expression(ivl_stmt_parm(net, idx), ind+4); + if (ivl_stmt_parm(net, idx)) + show_expression(ivl_stmt_parm(net, idx), ind+4); break; } @@ -197,11 +199,11 @@ static void show_statement(ivl_statement_t net, unsigned ind) fprintf(out, "%*s-> ...\n", ind, ""); break; - - case IVL_ST_WAIT: - fprintf(out, "%*s@(...)\n", ind, ""); - show_statement(ivl_stmt_sub_stmt(net), ind+2); - break; + case IVL_ST_WAIT: { + ivl_event_t evnt = ivl_stmt_event(net); + fprintf(out, "%*s@(%s)\n", ind, "", ivl_event_name(evnt)); + break; + } case IVL_ST_WHILE: fprintf(out, "%*swhile ()\n", ind, ""); @@ -229,6 +231,29 @@ static int show_process(ivl_process_t net, void*x) return 0; } +static void show_event(ivl_event_t net) +{ + ivl_edge_type_t edge = ivl_event_edge(net); + + switch (edge) { + case IVL_EDGE_NONE: + fprintf(out, " event %s;\n", ivl_event_name(net)); + break; + + case IVL_EDGE_ANY: + fprintf(out, " event %s @(", ivl_event_name(net)); + fprintf(out, ");\n"); + break; + case IVL_EDGE_NEG: + fprintf(out, " event %s @(negedge ", ivl_event_name(net)); + fprintf(out, ");\n"); + break; + case IVL_EDGE_POS: + fprintf(out, " event %s @(posedge ", ivl_event_name(net)); + fprintf(out, ");\n"); + break; + } +} static void show_signal(ivl_signal_t net) { @@ -372,6 +397,9 @@ static int show_scope(ivl_scope_t net, void*x) break; } + for (idx = 0 ; idx < ivl_scope_events(net) ; idx += 1) + show_event(ivl_scope_event(net, idx)); + for (idx = 0 ; idx < ivl_scope_sigs(net) ; idx += 1) show_signal(ivl_scope_sig(net, idx)); @@ -415,6 +443,10 @@ DECLARE_CYGWIN_DLL(DllMain); /* * $Log: stub.c,v $ + * Revision 1.30 2001/03/28 06:07:39 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.29 2001/02/07 22:22:00 steve * ivl_target header search path fixes. * diff --git a/tgt-vvp/vvp_process.c b/tgt-vvp/vvp_process.c index 6eb2183cf..b9c10e426 100644 --- a/tgt-vvp/vvp_process.c +++ b/tgt-vvp/vvp_process.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvp_process.c,v 1.9 2001/03/27 06:27:41 steve Exp $" +#ident "$Id: vvp_process.c,v 1.10 2001/03/28 06:07:40 steve Exp $" #endif # include "vvp_priv.h" @@ -195,12 +195,8 @@ static int show_stmt_noop(ivl_statement_t net) static int show_stmt_wait(ivl_statement_t net) { - ivl_nexus_t nex; - - assert(ivl_stmt_pins(net) == 1); - nex = ivl_stmt_pin(net, 0); - - fprintf(vvp_out, " %%wait L_%s;\n", ivl_nexus_name(nex)); + ivl_event_t ev = ivl_stmt_event(net); + fprintf(vvp_out, " %%wait E_%s;\n", ivl_event_name(ev)); return show_statement(ivl_stmt_sub_stmt(net)); } @@ -294,7 +290,7 @@ static int show_statement(ivl_statement_t net) return rc; } - +#if 0 static void show_stmt_event_wait(ivl_statement_t net) { ivl_edge_type_t edge = ivl_stmt_edge(net); @@ -322,7 +318,8 @@ static void show_stmt_event_wait(ivl_statement_t net) fprintf(vvp_out, ";\n"); } - +#endif +#if 0 static void show_stmt_events(ivl_statement_t net) { switch (ivl_statement_type(net)) { @@ -336,6 +333,7 @@ static void show_stmt_events(ivl_statement_t net) return; } } +#endif /* * The process as a whole is surrounded by this code. We generate a @@ -351,11 +349,11 @@ int draw_process(ivl_process_t net, void*x) local_count = 0; fprintf(vvp_out, " .scope S_%s;\n", ivl_scope_name(scope)); - +#if 0 /* Show any .event statements that are needed to support this thread. */ show_stmt_events(stmt); - +#endif /* Generate the entry label. Just give the thread a number so that we ar certain the label is unique. */ fprintf(vvp_out, "T_%d\n", thread_count); @@ -389,6 +387,10 @@ int draw_process(ivl_process_t net, void*x) /* * $Log: vvp_process.c,v $ + * Revision 1.10 2001/03/28 06:07:40 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.9 2001/03/27 06:27:41 steve * Generate code for simple @ statements. * diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index f5ae1157e..4b1753eec 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vvp_scope.c,v 1.6 2001/03/27 06:27:41 steve Exp $" +#ident "$Id: vvp_scope.c,v 1.7 2001/03/28 06:07:40 steve Exp $" #endif # include "vvp_priv.h" @@ -158,6 +158,43 @@ static void draw_logic_in_scope(ivl_net_logic_t lptr) fprintf(vvp_out, ";\n"); } +static void draw_event_in_scope(ivl_event_t obj) +{ + ivl_edge_type_t edge = ivl_event_edge(obj); + + if (edge == IVL_EDGE_NONE) { + fprintf(vvp_out, "E_%s .event \"%s\";\n", + ivl_event_name(obj), ivl_event_basename(obj)); + + } else { + unsigned idx; + unsigned pins = ivl_event_pins(obj); + assert(pins < 4); + fprintf(vvp_out, "E_%s .event ", ivl_event_name(obj)); + switch (edge) { + case IVL_EDGE_POS: + fprintf(vvp_out, "posedge"); + break; + case IVL_EDGE_NEG: + fprintf(vvp_out, "posedge"); + break; + case IVL_EDGE_ANY: + fprintf(vvp_out, "edge"); + break; + case IVL_EDGE_NONE: + assert(0); + } + + for (idx = 0 ; idx < pins ; idx += 1) { + ivl_nexus_t nex = ivl_event_pin(obj, idx); + fprintf(vvp_out, ", "); + draw_nexus_input(nex); + } + + fprintf(vvp_out, ";\n"); + } +} + int draw_scope(ivl_scope_t net, ivl_scope_t parent) { unsigned idx; @@ -197,12 +234,21 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent) } } + for (idx = 0 ; idx < ivl_scope_events(net) ; idx += 1) { + ivl_event_t event = ivl_scope_event(net, idx); + draw_event_in_scope(event); + } + ivl_scope_children(net, draw_scope, net); return 0; } /* * $Log: vvp_scope.c,v $ + * Revision 1.7 2001/03/28 06:07:40 steve + * Add the ivl_event_t to ivl_target, and use that to generate + * .event statements in vvp way ahead of the thread that uses it. + * * Revision 1.6 2001/03/27 06:27:41 steve * Generate code for simple @ statements. *