Support real expressions in case statements.

This commit is contained in:
steve 2003-05-14 05:26:41 +00:00
parent 889b9bfe07
commit 2a29c4fd62
5 changed files with 135 additions and 32 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
*/ */
#ifdef HAVE_CVS_IDENT #ifdef HAVE_CVS_IDENT
#ident "$Id: ivl_target.h,v 1.117 2003/04/22 04:48:29 steve Exp $" #ident "$Id: ivl_target.h,v 1.118 2003/05/14 05:26:41 steve Exp $"
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@ -283,30 +283,31 @@ typedef enum ivl_signal_type_e {
/* This is the type code for ivl_statement_t objects. */ /* This is the type code for ivl_statement_t objects. */
typedef enum ivl_statement_type_e { typedef enum ivl_statement_type_e {
IVL_ST_NONE = 0, IVL_ST_NONE = 0,
IVL_ST_NOOP = 1, IVL_ST_NOOP = 1,
IVL_ST_ASSIGN, IVL_ST_ASSIGN = 2,
IVL_ST_ASSIGN_NB, IVL_ST_ASSIGN_NB = 3,
IVL_ST_BLOCK, IVL_ST_BLOCK = 4,
IVL_ST_CASE, IVL_ST_CASE = 5,
IVL_ST_CASEX, IVL_ST_CASER = 24, /* Case statement with real expressions. */
IVL_ST_CASEZ, IVL_ST_CASEX = 6,
IVL_ST_CASSIGN, IVL_ST_CASEZ = 7,
IVL_ST_CONDIT, IVL_ST_CASSIGN = 8,
IVL_ST_DEASSIGN, IVL_ST_CONDIT = 9,
IVL_ST_DELAY, IVL_ST_DEASSIGN = 10,
IVL_ST_DELAYX, IVL_ST_DELAY = 11,
IVL_ST_DISABLE, IVL_ST_DELAYX = 12,
IVL_ST_FORCE, IVL_ST_DISABLE = 13,
IVL_ST_FOREVER, IVL_ST_FORCE = 14,
IVL_ST_FORK, IVL_ST_FOREVER = 15,
IVL_ST_RELEASE, IVL_ST_FORK = 16,
IVL_ST_REPEAT, IVL_ST_RELEASE = 17,
IVL_ST_STASK, IVL_ST_REPEAT = 18,
IVL_ST_TRIGGER, IVL_ST_STASK = 19,
IVL_ST_UTASK, IVL_ST_TRIGGER = 20,
IVL_ST_WAIT, IVL_ST_UTASK = 21,
IVL_ST_WHILE IVL_ST_WAIT = 22,
IVL_ST_WHILE = 23
} ivl_statement_type_t; } ivl_statement_type_t;
/* This is the type of a variable, and also used as the type for an /* This is the type of a variable, and also used as the type for an
@ -1134,11 +1135,11 @@ extern ivl_scope_t ivl_stmt_block_scope(ivl_statement_t net);
extern ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net, unsigned i); extern ivl_statement_t ivl_stmt_block_stmt(ivl_statement_t net, unsigned i);
/* IVL_ST_UTASK IVL_ST_DISABLE */ /* IVL_ST_UTASK IVL_ST_DISABLE */
extern ivl_scope_t ivl_stmt_call(ivl_statement_t net); extern ivl_scope_t ivl_stmt_call(ivl_statement_t net);
/* IVL_ST_CASE */ /* IVL_ST_CASE,IVL_ST_CASER,IVL_ST_CASEX,IVL_ST_CASEZ */
extern unsigned ivl_stmt_case_count(ivl_statement_t net); extern unsigned ivl_stmt_case_count(ivl_statement_t net);
/* IVL_ST_CASE */ /* IVL_ST_CASE,IVL_ST_CASER,IVL_ST_CASEX,IVL_ST_CASEZ */
extern ivl_expr_t ivl_stmt_case_expr(ivl_statement_t net, unsigned i); extern ivl_expr_t ivl_stmt_case_expr(ivl_statement_t net, unsigned i);
/* IVL_ST_CASE */ /* IVL_ST_CASE,IVL_ST_CASER,IVL_ST_CASEX,IVL_ST_CASEZ */
extern ivl_statement_t ivl_stmt_case_stmt(ivl_statement_t net, unsigned i); extern ivl_statement_t ivl_stmt_case_stmt(ivl_statement_t net, unsigned i);
/* IVL_ST_CONDIT IVL_ST_CASE IVL_ST_REPEAT IVL_ST_WHILE */ /* IVL_ST_CONDIT IVL_ST_CASE IVL_ST_REPEAT IVL_ST_WHILE */
extern ivl_expr_t ivl_stmt_cond_expr(ivl_statement_t net); extern ivl_expr_t ivl_stmt_cond_expr(ivl_statement_t net);
@ -1214,6 +1215,9 @@ _END_DECL
/* /*
* $Log: ivl_target.h,v $ * $Log: ivl_target.h,v $
* Revision 1.118 2003/05/14 05:26:41 steve
* Support real expressions in case statements.
*
* Revision 1.117 2003/04/22 04:48:29 steve * Revision 1.117 2003/04/22 04:48:29 steve
* Support event names as expressions elements. * Support event names as expressions elements.
* *

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
*/ */
#ifdef HAVE_CVS_IDENT #ifdef HAVE_CVS_IDENT
#ident "$Id: t-dll-api.cc,v 1.98 2003/04/22 04:48:30 steve Exp $" #ident "$Id: t-dll-api.cc,v 1.99 2003/05/14 05:26:41 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -1540,6 +1540,7 @@ extern "C" unsigned ivl_stmt_case_count(ivl_statement_t net)
{ {
switch (net->type_) { switch (net->type_) {
case IVL_ST_CASE: case IVL_ST_CASE:
case IVL_ST_CASER:
case IVL_ST_CASEX: case IVL_ST_CASEX:
case IVL_ST_CASEZ: case IVL_ST_CASEZ:
return net->u_.case_.ncase; return net->u_.case_.ncase;
@ -1553,6 +1554,7 @@ extern "C" ivl_expr_t ivl_stmt_case_expr(ivl_statement_t net, unsigned idx)
{ {
switch (net->type_) { switch (net->type_) {
case IVL_ST_CASE: case IVL_ST_CASE:
case IVL_ST_CASER:
case IVL_ST_CASEX: case IVL_ST_CASEX:
case IVL_ST_CASEZ: case IVL_ST_CASEZ:
assert(idx < net->u_.case_.ncase); assert(idx < net->u_.case_.ncase);
@ -1568,6 +1570,7 @@ extern "C" ivl_statement_t ivl_stmt_case_stmt(ivl_statement_t net, unsigned idx)
{ {
switch (net->type_) { switch (net->type_) {
case IVL_ST_CASE: case IVL_ST_CASE:
case IVL_ST_CASER:
case IVL_ST_CASEX: case IVL_ST_CASEX:
case IVL_ST_CASEZ: case IVL_ST_CASEZ:
assert(idx < net->u_.case_.ncase); assert(idx < net->u_.case_.ncase);
@ -1586,6 +1589,7 @@ extern "C" ivl_expr_t ivl_stmt_cond_expr(ivl_statement_t net)
return net->u_.condit_.cond_; return net->u_.condit_.cond_;
case IVL_ST_CASE: case IVL_ST_CASE:
case IVL_ST_CASER:
case IVL_ST_CASEX: case IVL_ST_CASEX:
case IVL_ST_CASEZ: case IVL_ST_CASEZ:
return net->u_.case_.cond; return net->u_.case_.cond;
@ -1833,6 +1837,9 @@ extern "C" ivl_variable_type_t ivl_variable_type(ivl_variable_t net)
/* /*
* $Log: t-dll-api.cc,v $ * $Log: t-dll-api.cc,v $
* Revision 1.99 2003/05/14 05:26:41 steve
* Support real expressions in case statements.
*
* Revision 1.98 2003/04/22 04:48:30 steve * Revision 1.98 2003/04/22 04:48:30 steve
* Support event names as expressions elements. * Support event names as expressions elements.
* *

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
*/ */
#ifdef HAVE_CVS_IDENT #ifdef HAVE_CVS_IDENT
#ident "$Id: t-dll-proc.cc,v 1.58 2003/05/07 19:56:20 steve Exp $" #ident "$Id: t-dll-proc.cc,v 1.59 2003/05/14 05:26:41 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -356,6 +356,11 @@ void dll_target::proc_case(const NetCase*net)
stmt_cur_->u_.case_.cond = expr_; stmt_cur_->u_.case_.cond = expr_;
expr_ = 0; expr_ = 0;
/* If the condition expression is a real valued expression,
then change the case statement to a CASER statement. */
if (stmt_cur_->u_.case_.cond->value_ == IVL_VT_REAL)
stmt_cur_->type_ = IVL_ST_CASER;
unsigned ncase = net->nitems(); unsigned ncase = net->nitems();
stmt_cur_->u_.case_.ncase = ncase; stmt_cur_->u_.case_.ncase = ncase;
@ -829,6 +834,9 @@ void dll_target::proc_while(const NetWhile*net)
/* /*
* $Log: t-dll-proc.cc,v $ * $Log: t-dll-proc.cc,v $
* Revision 1.59 2003/05/14 05:26:41 steve
* Support real expressions in case statements.
*
* Revision 1.58 2003/05/07 19:56:20 steve * Revision 1.58 2003/05/07 19:56:20 steve
* Improve internal error message. * Improve internal error message.
* *

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
*/ */
#ifdef HAVE_CVS_IDENT #ifdef HAVE_CVS_IDENT
#ident "$Id: stub.c,v 1.78 2003/05/13 01:56:15 steve Exp $" #ident "$Id: stub.c,v 1.79 2003/05/14 05:26:41 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -395,6 +395,7 @@ static void show_statement(ivl_statement_t net, unsigned ind)
case IVL_ST_CASEX: case IVL_ST_CASEX:
case IVL_ST_CASEZ: case IVL_ST_CASEZ:
case IVL_ST_CASER:
case IVL_ST_CASE: { case IVL_ST_CASE: {
unsigned cnt = ivl_stmt_case_count(net); unsigned cnt = ivl_stmt_case_count(net);
unsigned idx; unsigned idx;
@ -852,6 +853,9 @@ int target_design(ivl_design_t des)
/* /*
* $Log: stub.c,v $ * $Log: stub.c,v $
* Revision 1.79 2003/05/14 05:26:41 steve
* Support real expressions in case statements.
*
* Revision 1.78 2003/05/13 01:56:15 steve * Revision 1.78 2003/05/13 01:56:15 steve
* Allow primitives to hvae unconnected input ports. * Allow primitives to hvae unconnected input ports.
* *

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
*/ */
#ifdef HAVE_CVS_IDENT #ifdef HAVE_CVS_IDENT
#ident "$Id: vvp_process.c,v 1.84 2003/03/25 02:15:48 steve Exp $" #ident "$Id: vvp_process.c,v 1.85 2003/05/14 05:26:41 steve Exp $"
#endif #endif
# include "vvp_priv.h" # include "vvp_priv.h"
@ -799,6 +799,79 @@ static int show_stmt_case(ivl_statement_t net, ivl_scope_t sscope)
return 0; return 0;
} }
static int show_stmt_case_r(ivl_statement_t net, ivl_scope_t sscope)
{
ivl_expr_t exp = ivl_stmt_cond_expr(net);
int cond = draw_eval_real(exp);
unsigned count = ivl_stmt_case_count(net);
unsigned local_base = local_count;
unsigned idx, default_case;
local_count += count + 1;
/* First draw the branch table. All the non-default cases
generate a branch out of here, to the code that implements
the case. The default will fall through all the tests. */
default_case = count;
for (idx = 0 ; idx < count ; idx += 1) {
ivl_expr_t cex = ivl_stmt_case_expr(net, idx);
int cvec;
if (cex == 0) {
default_case = idx;
continue;
}
cvec = draw_eval_real(cex);
fprintf(vvp_out, " %%cmp/wr %d, %d;\n", cond, cvec);
fprintf(vvp_out, " %%jmp/1 T_%d.%d, 4;\n",
thread_count, local_base+idx);
/* Done with the guard expression value. */
clr_word(cvec);
}
/* Done with the case expression. */
clr_word(cond);
/* Emit code for the case default. The above jump table will
fall through to this statement. */
if (default_case < count) {
ivl_statement_t cst = ivl_stmt_case_stmt(net, default_case);
show_statement(cst, sscope);
}
/* Jump to the out of the case. */
fprintf(vvp_out, " %%jmp T_%d.%d;\n", thread_count,
local_base+count);
for (idx = 0 ; idx < count ; idx += 1) {
ivl_statement_t cst = ivl_stmt_case_stmt(net, idx);
if (idx == default_case)
continue;
fprintf(vvp_out, "T_%d.%d ;\n", thread_count, local_base+idx);
clear_expression_lookaside();
show_statement(cst, sscope);
fprintf(vvp_out, " %%jmp T_%d.%d;\n", thread_count,
local_base+count);
}
/* The out of the case. */
fprintf(vvp_out, "T_%d.%d ;\n", thread_count, local_base+count);
return 0;
}
static int show_stmt_cassign(ivl_statement_t net) static int show_stmt_cassign(ivl_statement_t net)
{ {
ivl_lval_t lval; ivl_lval_t lval;
@ -1269,6 +1342,10 @@ static int show_statement(ivl_statement_t net, ivl_scope_t sscope)
rc += show_stmt_case(net, sscope); rc += show_stmt_case(net, sscope);
break; break;
case IVL_ST_CASER:
rc += show_stmt_case_r(net, sscope);
break;
case IVL_ST_CASSIGN: case IVL_ST_CASSIGN:
rc += show_stmt_cassign(net); rc += show_stmt_cassign(net);
break; break;
@ -1431,6 +1508,9 @@ int draw_func_definition(ivl_scope_t scope)
/* /*
* $Log: vvp_process.c,v $ * $Log: vvp_process.c,v $
* Revision 1.85 2003/05/14 05:26:41 steve
* Support real expressions in case statements.
*
* Revision 1.84 2003/03/25 02:15:48 steve * Revision 1.84 2003/03/25 02:15:48 steve
* Use hash code for scope labels. * Use hash code for scope labels.
* *