Redesign event information to support arbitrary edge combining.

This commit is contained in:
steve 2001-04-01 01:48:21 +00:00
parent e29ecdc234
commit d25690cc8e
7 changed files with 171 additions and 92 deletions

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #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 #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -149,13 +149,14 @@ typedef struct ivl_statement_s*ivl_statement_t;
* changes and additions to the enumerations. * changes and additions to the enumerations.
*/ */
#if 0
typedef enum ivl_edge_type_e { typedef enum ivl_edge_type_e {
IVL_EDGE_NONE = 0, IVL_EDGE_NONE = 0,
IVL_EDGE_ANY = 1, IVL_EDGE_ANY = 1,
IVL_EDGE_POS = 2, IVL_EDGE_POS = 2,
IVL_EDGE_NEG = 3 IVL_EDGE_NEG = 3
} ivl_edge_type_t; } ivl_edge_type_t;
#endif
/* This is the type of an ivl_expr_t object. */ /* This is the type of an ivl_expr_t object. */
typedef enum ivl_expr_type_e { typedef enum ivl_expr_type_e {
@ -322,18 +323,18 @@ extern int ivl_const_signed(ivl_net_const_t net);
* ivl_event_edge * ivl_event_edge
* Return the edge type for the event. If this is a named event * 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. * 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_name(ivl_event_t net);
extern const char* ivl_event_basename(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 unsigned ivl_event_nany(ivl_event_t net);
extern ivl_nexus_t ivl_event_pin(ivl_event_t net, unsigned idx); 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 /* EXPRESSIONS
@ -730,6 +731,9 @@ _END_DECL
/* /*
* $Log: ivl_target.h,v $ * $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 * Revision 1.40 2001/03/31 17:36:38 steve
* Generate vvp code for case statements. * Generate vvp code for case statements.
* *

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #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 #endif
# include "t-dll.h" # include "t-dll.h"
@ -99,25 +99,46 @@ extern "C" const char* ivl_event_basename(ivl_event_t net)
return nam; 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); 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); assert(net);
return net->npins; assert(idx < net->nany);
}
extern "C" ivl_nexus_t ivl_event_pin(ivl_event_t net, unsigned idx)
{
assert(net);
assert(idx < net->npins);
return net->pins[idx]; 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) extern "C" const char* ivl_expr_bits(ivl_expr_t net)
{ {
assert(net && (net->type_ == IVL_EX_NUMBER)); 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 $ * $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 * Revision 1.28 2001/03/31 17:36:38 steve
* Generate vvp code for case statements. * Generate vvp code for case statements.
* *

View File

@ -18,7 +18,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #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 #endif
# include "target.h" # 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 pins. This wasn't done during the ::event method because
the signals weren't scanned yet. */ the signals weren't scanned yet. */
if (ev->nprobe() == 1) { if (ev->nprobe() >= 1) {
const NetEvProbe*pr = ev->probe(0); const NetEvProbe*pr = ev->probe(0);
ivl_event_t evnt = stmt_cur_->u_.wait_.event_; 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) { for (unsigned idx = 0 ; idx < ev->nprobe() ; idx += 1) {
ivl_nexus_t nex = (ivl_nexus_t) const NetEvProbe*pr = ev->probe(idx);
pr->pin(idx).nexus()->t_cookie(); unsigned base = 0;
assert(nex);
evnt->pins[idx] = nex; 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 /* 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 $ * $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 * Revision 1.17 2001/03/31 17:36:39 steve
* Generate vvp code for case statements. * Generate vvp code for case statements.
* *

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #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 #endif
# include "compiler.h" # include "compiler.h"
@ -298,29 +298,32 @@ void dll_target::event(const NetEvent*net)
obj->scope = scope; obj->scope = scope;
scope_add_event(scope, obj); scope_add_event(scope, obj);
assert(net->nprobe() <= 1); obj->nany = 0;
obj->nneg = 0;
obj->npos = 0;
if (net->nprobe() == 1) { if (net->nprobe() >= 1) {
const NetEvProbe*pr = net->probe(0);
switch (pr->edge()) { for (unsigned idx = 0 ; idx < net->nprobe() ; idx += 1) {
case NetEvProbe::ANYEDGE: const NetEvProbe*pr = net->probe(0);
obj->edge = IVL_EDGE_ANY; switch (pr->edge()) {
break; case NetEvProbe::ANYEDGE:
case NetEvProbe::NEGEDGE: obj->nany += pr->pin_count();
obj->edge = IVL_EDGE_NEG; break;
break; case NetEvProbe::NEGEDGE:
case NetEvProbe::POSEDGE: obj->nneg += pr->pin_count();
obj->edge = IVL_EDGE_POS; break;
break; case NetEvProbe::POSEDGE:
obj->npos += pr->pin_count();
break;
}
} }
obj->npins = pr->pin_count(); unsigned npins = obj->nany + obj->nneg + obj->npos;
obj->pins = (ivl_nexus_t*)calloc(obj->npins, sizeof(ivl_nexus_t)); obj->pins = (ivl_nexus_t*)calloc(npins, sizeof(ivl_nexus_t));
} else { } else {
obj->npins = 0;
obj->pins = 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 $ * $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 * Revision 1.31 2001/03/30 06:10:15 steve
* Initialize the event_ list of new scopes. * Initialize the event_ list of new scopes.
* *

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #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 #endif
# include "target.h" # include "target.h"
@ -105,8 +105,7 @@ struct dll_target : public target_t, public expr_scan_t {
struct ivl_event_s { struct ivl_event_s {
char*name; char*name;
ivl_scope_t scope; ivl_scope_t scope;
ivl_edge_type_t edge; unsigned short nany, nneg, npos;
unsigned npins;
ivl_nexus_t*pins; ivl_nexus_t*pins;
}; };
@ -395,6 +394,9 @@ struct ivl_statement_s {
/* /*
* $Log: t-dll.h,v $ * $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 * Revision 1.28 2001/03/31 17:36:39 steve
* Generate vvp code for case statements. * Generate vvp code for case statements.
* *

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) && !defined(macintosh) #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 #endif
/* /*
@ -273,25 +273,22 @@ static int show_process(ivl_process_t net, void*x)
static void show_event(ivl_event_t net) 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) { for (idx = 0 ; idx < ivl_event_nany(net) ; idx += 1) {
case IVL_EDGE_NONE: ivl_nexus_t nex = ivl_event_any(net, idx);
fprintf(out, " event %s;\n", ivl_event_name(net)); fprintf(out, " ANYEDGE: %s\n", ivl_nexus_name(nex));
break; }
case IVL_EDGE_ANY: for (idx = 0 ; idx < ivl_event_nneg(net) ; idx += 1) {
fprintf(out, " event %s @(", ivl_event_name(net)); ivl_nexus_t nex = ivl_event_neg(net, idx);
fprintf(out, ");\n"); fprintf(out, " NEGEDGE: %s\n", ivl_nexus_name(nex));
break; }
case IVL_EDGE_NEG:
fprintf(out, " event %s @(negedge ", ivl_event_name(net)); for (idx = 0 ; idx < ivl_event_npos(net) ; idx += 1) {
fprintf(out, ");\n"); ivl_nexus_t nex = ivl_event_pos(net, idx);
break; fprintf(out, " POSEDGE: %s\n", ivl_nexus_name(nex));
case IVL_EDGE_POS:
fprintf(out, " event %s @(posedge ", ivl_event_name(net));
fprintf(out, ");\n");
break;
} }
} }
@ -483,6 +480,9 @@ DECLARE_CYGWIN_DLL(DllMain);
/* /*
* $Log: stub.c,v $ * $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 * Revision 1.33 2001/03/31 17:36:39 steve
* Generate vvp code for case statements. * Generate vvp code for case statements.
* *

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) #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 #endif
# include "vvp_priv.h" # 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) static void draw_event_in_scope(ivl_event_t obj)
{ {
ivl_edge_type_t edge = ivl_event_edge(obj); unsigned nany = ivl_event_nany(obj);
unsigned nneg = ivl_event_nneg(obj);
if (edge == IVL_EDGE_NONE) { unsigned npos = ivl_event_npos(obj);
if ((nany + nneg + npos) == 0) {
fprintf(vvp_out, "E_%s .event \"%s\";\n", fprintf(vvp_out, "E_%s .event \"%s\";\n",
ivl_event_name(obj), ivl_event_basename(obj)); ivl_event_name(obj), ivl_event_basename(obj));
} else { } else {
unsigned idx; 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) { fprintf(vvp_out, "E_%s .event ", ivl_event_name(obj));
ivl_nexus_t nex = ivl_event_pin(obj, idx);
fprintf(vvp_out, ", "); if (nany > 0) {
draw_nexus_input(nex); 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"); fprintf(vvp_out, ";\n");
@ -245,6 +259,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
/* /*
* $Log: vvp_scope.c,v $ * $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 * Revision 1.9 2001/03/31 19:29:23 steve
* Fix compilation warnings. * Fix compilation warnings.
* *