diff --git a/ivl_target.h b/ivl_target.h index 627172ad5..6e1b9af54 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.40 2001/03/31 17:36:38 steve Exp $" +#ident "$Id: ivl_target.h,v 1.41 2001/04/01 01:48:21 steve Exp $" #endif #ifdef __cplusplus @@ -149,13 +149,14 @@ typedef struct ivl_statement_s*ivl_statement_t; * changes and additions to the enumerations. */ - +#if 0 typedef enum ivl_edge_type_e { IVL_EDGE_NONE = 0, IVL_EDGE_ANY = 1, IVL_EDGE_POS = 2, IVL_EDGE_NEG = 3 } ivl_edge_type_t; +#endif /* This is the type of an ivl_expr_t object. */ typedef enum ivl_expr_type_e { @@ -322,18 +323,18 @@ extern int ivl_const_signed(ivl_net_const_t net); * 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); +extern unsigned ivl_event_nany(ivl_event_t net); +extern ivl_nexus_t ivl_event_any(ivl_event_t net, unsigned idx); + +extern unsigned ivl_event_nneg(ivl_event_t net); +extern ivl_nexus_t ivl_event_neg(ivl_event_t net, unsigned idx); + +extern unsigned ivl_event_npos(ivl_event_t net); +extern ivl_nexus_t ivl_event_pos(ivl_event_t net, unsigned idx); /* EXPRESSIONS @@ -730,6 +731,9 @@ _END_DECL /* * $Log: ivl_target.h,v $ + * Revision 1.41 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.40 2001/03/31 17:36:38 steve * Generate vvp code for case statements. * diff --git a/t-dll-api.cc b/t-dll-api.cc index f3309a2e0..79ffec910 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.28 2001/03/31 17:36:38 steve Exp $" +#ident "$Id: t-dll-api.cc,v 1.29 2001/04/01 01:48:21 steve Exp $" #endif # include "t-dll.h" @@ -99,25 +99,46 @@ extern "C" const char* ivl_event_basename(ivl_event_t net) return nam; } -extern "C" ivl_edge_type_t ivl_event_edge(ivl_event_t net) + +extern "C" unsigned ivl_event_nany(ivl_event_t net) { assert(net); - return net->edge; + return net->nany; } -extern "C" unsigned ivl_event_pins(ivl_event_t net) +extern "C" ivl_nexus_t ivl_event_any(ivl_event_t net, unsigned idx) { 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); + assert(idx < net->nany); return net->pins[idx]; } +extern "C" unsigned ivl_event_nneg(ivl_event_t net) +{ + assert(net); + return net->nneg; +} + +extern "C" ivl_nexus_t ivl_event_neg(ivl_event_t net, unsigned idx) +{ + assert(net); + assert(idx < net->nneg); + return net->pins[net->nany + idx]; +} + +extern "C" unsigned ivl_event_npos(ivl_event_t net) +{ + assert(net); + return net->npos; +} + +extern "C" ivl_nexus_t ivl_event_pos(ivl_event_t net, unsigned idx) +{ + assert(net); + assert(idx < net->npos); + return net->pins[net->nany + net->nneg + idx]; +} + extern "C" const char* ivl_expr_bits(ivl_expr_t net) { assert(net && (net->type_ == IVL_EX_NUMBER)); @@ -781,6 +802,9 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net) /* * $Log: t-dll-api.cc,v $ + * Revision 1.29 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.28 2001/03/31 17:36:38 steve * Generate vvp code for case statements. * diff --git a/t-dll-proc.cc b/t-dll-proc.cc index 986bb2f0b..ce9d1939a 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.17 2001/03/31 17:36:39 steve Exp $" +#ident "$Id: t-dll-proc.cc,v 1.18 2001/04/01 01:48:21 steve Exp $" #endif # include "target.h" @@ -361,18 +361,41 @@ bool dll_target::proc_wait(const NetEvWait*net) pins. This wasn't done during the ::event method because the signals weren't scanned yet. */ - if (ev->nprobe() == 1) { + 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); + unsigned iany = 0; + unsigned ineg = evnt->nany; + unsigned ipos = ineg + evnt->nneg; - 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; + for (unsigned idx = 0 ; idx < ev->nprobe() ; idx += 1) { + const NetEvProbe*pr = ev->probe(idx); + unsigned base = 0; + + switch (pr->edge()) { + case NetEvProbe::ANYEDGE: + base = iany; + iany += pr->pin_count(); + break; + case NetEvProbe::NEGEDGE: + base = ineg; + ineg += pr->pin_count(); + break; + case NetEvProbe::POSEDGE: + base = ipos; + ipos += pr->pin_count(); + break; + } + + for (unsigned bit = 0; bit < pr->pin_count(); bit += 1) { + ivl_nexus_t nex = (ivl_nexus_t) + pr->pin(bit).nexus()->t_cookie(); + assert(nex); + evnt->pins[base+bit] = nex; + } } + } /* The ivl_statement_t for the wait statement is not complete @@ -412,6 +435,9 @@ void dll_target::proc_while(const NetWhile*net) /* * $Log: t-dll-proc.cc,v $ + * Revision 1.18 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.17 2001/03/31 17:36:39 steve * Generate vvp code for case statements. * diff --git a/t-dll.cc b/t-dll.cc index 04ba031a9..f8ec83612 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.31 2001/03/30 06:10:15 steve Exp $" +#ident "$Id: t-dll.cc,v 1.32 2001/04/01 01:48:21 steve Exp $" #endif # include "compiler.h" @@ -298,29 +298,32 @@ void dll_target::event(const NetEvent*net) obj->scope = scope; scope_add_event(scope, obj); - assert(net->nprobe() <= 1); + obj->nany = 0; + obj->nneg = 0; + obj->npos = 0; - 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; + if (net->nprobe() >= 1) { + + for (unsigned idx = 0 ; idx < net->nprobe() ; idx += 1) { + const NetEvProbe*pr = net->probe(0); + switch (pr->edge()) { + case NetEvProbe::ANYEDGE: + obj->nany += pr->pin_count(); + break; + case NetEvProbe::NEGEDGE: + obj->nneg += pr->pin_count(); + break; + case NetEvProbe::POSEDGE: + obj->npos += pr->pin_count(); + break; + } } - obj->npins = pr->pin_count(); - obj->pins = (ivl_nexus_t*)calloc(obj->npins, sizeof(ivl_nexus_t)); + unsigned npins = obj->nany + obj->nneg + obj->npos; + obj->pins = (ivl_nexus_t*)calloc(npins, sizeof(ivl_nexus_t)); } else { - obj->npins = 0; obj->pins = 0; - obj->edge = IVL_EDGE_NONE; } } @@ -743,6 +746,9 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj }; /* * $Log: t-dll.cc,v $ + * Revision 1.32 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.31 2001/03/30 06:10:15 steve * Initialize the event_ list of new scopes. * diff --git a/t-dll.h b/t-dll.h index 0aab77097..80d44570d 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.28 2001/03/31 17:36:39 steve Exp $" +#ident "$Id: t-dll.h,v 1.29 2001/04/01 01:48:21 steve Exp $" #endif # include "target.h" @@ -105,8 +105,7 @@ struct dll_target : public target_t, public expr_scan_t { struct ivl_event_s { char*name; ivl_scope_t scope; - ivl_edge_type_t edge; - unsigned npins; + unsigned short nany, nneg, npos; ivl_nexus_t*pins; }; @@ -395,6 +394,9 @@ struct ivl_statement_s { /* * $Log: t-dll.h,v $ + * Revision 1.29 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.28 2001/03/31 17:36:39 steve * Generate vvp code for case statements. * diff --git a/tgt-stub/stub.c b/tgt-stub/stub.c index cd79bc782..773153a99 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.33 2001/03/31 17:36:39 steve Exp $" +#ident "$Id: stub.c,v 1.34 2001/04/01 01:48:21 steve Exp $" #endif /* @@ -273,25 +273,22 @@ static int show_process(ivl_process_t net, void*x) static void show_event(ivl_event_t net) { - ivl_edge_type_t edge = ivl_event_edge(net); + unsigned idx; + fprintf(out, " event %s;\n", ivl_event_name(net)); - switch (edge) { - case IVL_EDGE_NONE: - fprintf(out, " event %s;\n", ivl_event_name(net)); - break; + for (idx = 0 ; idx < ivl_event_nany(net) ; idx += 1) { + ivl_nexus_t nex = ivl_event_any(net, idx); + fprintf(out, " ANYEDGE: %s\n", ivl_nexus_name(nex)); + } - 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; + for (idx = 0 ; idx < ivl_event_nneg(net) ; idx += 1) { + ivl_nexus_t nex = ivl_event_neg(net, idx); + fprintf(out, " NEGEDGE: %s\n", ivl_nexus_name(nex)); + } + + for (idx = 0 ; idx < ivl_event_npos(net) ; idx += 1) { + ivl_nexus_t nex = ivl_event_pos(net, idx); + fprintf(out, " POSEDGE: %s\n", ivl_nexus_name(nex)); } } @@ -483,6 +480,9 @@ DECLARE_CYGWIN_DLL(DllMain); /* * $Log: stub.c,v $ + * Revision 1.34 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.33 2001/03/31 17:36:39 steve * Generate vvp code for case statements. * diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index 85b312356..b04554101 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.9 2001/03/31 19:29:23 steve Exp $" +#ident "$Id: vvp_scope.c,v 1.10 2001/04/01 01:48:21 steve Exp $" #endif # include "vvp_priv.h" @@ -160,35 +160,49 @@ static void draw_logic_in_scope(ivl_net_logic_t lptr) static void draw_event_in_scope(ivl_event_t obj) { - ivl_edge_type_t edge = ivl_event_edge(obj); - - if (edge == IVL_EDGE_NONE) { + unsigned nany = ivl_event_nany(obj); + unsigned nneg = ivl_event_nneg(obj); + unsigned npos = ivl_event_npos(obj); + if ((nany + nneg + npos) == 0) { 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, "E_%s .event ", ivl_event_name(obj)); + + if (nany > 0) { + assert((nneg + npos) == 0); + assert(nany <= 4); + + fprintf(vvp_out, "edge"); + + for (idx = 0 ; idx < nany ; idx += 1) { + ivl_nexus_t nex = ivl_event_any(obj, idx); + fprintf(vvp_out, ", "); + draw_nexus_input(nex); + } + + } else if (nneg > 0) { + assert((nany + npos) == 0); + fprintf(vvp_out, "negedge"); + + for (idx = 0 ; idx < nneg ; idx += 1) { + ivl_nexus_t nex = ivl_event_neg(obj, idx); + fprintf(vvp_out, ", "); + draw_nexus_input(nex); + } + + } else { + assert((nany + nneg) == 0); + fprintf(vvp_out, "posedge"); + + for (idx = 0 ; idx < npos ; idx += 1) { + ivl_nexus_t nex = ivl_event_pos(obj, idx); + fprintf(vvp_out, ", "); + draw_nexus_input(nex); + } } fprintf(vvp_out, ";\n"); @@ -245,6 +259,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent) /* * $Log: vvp_scope.c,v $ + * Revision 1.10 2001/04/01 01:48:21 steve + * Redesign event information to support arbitrary edge combining. + * * Revision 1.9 2001/03/31 19:29:23 steve * Fix compilation warnings. *