diff --git a/elab_expr.cc b/elab_expr.cc index 384216a03..f9b95a4e2 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: elab_expr.cc,v 1.107 2006/07/31 03:50:17 steve Exp $" +#ident "$Id: elab_expr.cc,v 1.108 2006/08/09 05:19:08 steve Exp $" #endif # include "config.h" @@ -111,8 +111,19 @@ NetEBinary* PEBinary::elaborate_expr_base_(Design*des, tmp->set_line(*this); break; - case '/': case '%': + /* The % operator does not support real arguments in + baseline Verilog. But we allow it in our extended + form of verilog. */ + if (generation_flag < GN_VER2001X) { + if (lp->expr_type()==IVL_VT_REAL || rp->expr_type()==IVL_VT_REAL) { + cerr << get_line() << ": error: Modulus operator may not " + "have REAL operands." << endl; + des->errors += 1; + } + } + /* Fall through to handle the % with the / operator. */ + case '/': tmp = new NetEBDiv(op_, lp, rp); tmp->set_line(*this); break; @@ -1387,6 +1398,9 @@ NetExpr* PEUnary::elaborate_expr(Design*des, NetScope*scope, /* * $Log: elab_expr.cc,v $ + * Revision 1.108 2006/08/09 05:19:08 steve + * Add support for real valued modulus. + * * Revision 1.107 2006/07/31 03:50:17 steve * Add support for power in constant expressions. * diff --git a/tgt-vvp/eval_real.c b/tgt-vvp/eval_real.c index 279c3e824..99d1a847e 100644 --- a/tgt-vvp/eval_real.c +++ b/tgt-vvp/eval_real.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: eval_real.c,v 1.14 2005/07/13 04:52:31 steve Exp $" +#ident "$Id: eval_real.c,v 1.15 2006/08/09 05:19:08 steve Exp $" #endif /* @@ -80,6 +80,10 @@ static int draw_binary_real(ivl_expr_t exp) fprintf(vvp_out, " %%div/wr %d, %d;\n", l, r); break; + case '%': + fprintf(vvp_out, " %%mod/wr %d, %d;\n", l, r); + break; +#if 0 case '%': { struct vector_info res = draw_eval_expr(exp, STUFF_OK_XZ); l = allocate_word(); @@ -89,7 +93,7 @@ static int draw_binary_real(ivl_expr_t exp) clr_vector(res); } break; - +#endif default: fprintf(stderr, "XXXX draw_binary_real(%c)\n", ivl_expr_opcode(exp)); @@ -312,6 +316,9 @@ int draw_eval_real(ivl_expr_t exp) /* * $Log: eval_real.c,v $ + * Revision 1.15 2006/08/09 05:19:08 steve + * Add support for real valued modulus. + * * Revision 1.14 2005/07/13 04:52:31 steve * Handle functions with real values. * diff --git a/vvp/codes.h b/vvp/codes.h index fac20c9aa..d226f7f9f 100644 --- a/vvp/codes.h +++ b/vvp/codes.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: codes.h,v 1.78 2006/02/02 02:44:00 steve Exp $" +#ident "$Id: codes.h,v 1.79 2006/08/09 05:19:08 steve Exp $" #endif @@ -95,6 +95,7 @@ extern bool of_LOAD_XP(vthread_t thr, vvp_code_t code); extern bool of_LOADI_WR(vthread_t thr, vvp_code_t code); extern bool of_MOD(vthread_t thr, vvp_code_t code); extern bool of_MOD_S(vthread_t thr, vvp_code_t code); +extern bool of_MOD_WR(vthread_t thr, vvp_code_t code); extern bool of_MOV(vthread_t thr, vvp_code_t code); extern bool of_MUL(vthread_t thr, vvp_code_t code); extern bool of_MUL_WR(vthread_t thr, vvp_code_t code); @@ -178,6 +179,9 @@ extern vvp_code_t codespace_null(void); /* * $Log: codes.h,v $ + * Revision 1.79 2006/08/09 05:19:08 steve + * Add support for real valued modulus. + * * Revision 1.78 2006/02/02 02:44:00 steve * Allow part selects of memory words in l-values. * diff --git a/vvp/compile.cc b/vvp/compile.cc index 2d090a99f..fec45c245 100644 --- a/vvp/compile.cc +++ b/vvp/compile.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: compile.cc,v 1.222 2006/08/08 05:11:37 steve Exp $" +#ident "$Id: compile.cc,v 1.223 2006/08/09 05:19:08 steve Exp $" #endif # include "arith.h" @@ -139,6 +139,7 @@ const static struct opcode_table_s opcode_table[] = { { "%loadi/wr",of_LOADI_WR,3,{OA_BIT1, OA_NUMBER, OA_BIT2} }, { "%mod", of_MOD, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, { "%mod/s", of_MOD_S, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, + { "%mod/wr", of_MOD_WR, 2, {OA_BIT1, OA_BIT2, OA_NONE} }, { "%mov", of_MOV, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, { "%mul", of_MUL, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} }, { "%mul/wr", of_MUL_WR, 2, {OA_BIT1, OA_BIT2, OA_NONE} }, @@ -1496,6 +1497,9 @@ void compile_param_string(char*label, char*name, char*value) /* * $Log: compile.cc,v $ + * Revision 1.223 2006/08/09 05:19:08 steve + * Add support for real valued modulus. + * * Revision 1.222 2006/08/08 05:11:37 steve * Handle 64bit delay constants. * diff --git a/vvp/opcodes.txt b/vvp/opcodes.txt index 9c58061b1..627875f20 100644 --- a/vvp/opcodes.txt +++ b/vvp/opcodes.txt @@ -1,7 +1,7 @@ /* * Copyright (c) 2001-2003 Stephen Williams (steve@icarus.com) * - * $Id: opcodes.txt,v 1.70 2006/02/02 02:44:00 steve Exp $ + * $Id: opcodes.txt,v 1.71 2006/08/09 05:19:08 steve Exp $ */ @@ -424,6 +424,10 @@ replaced with the result. The /s form does signed %. +* %mod/wr , + +This opcode is the real-valued modulus of the two real values. + * %mov , , This instruction copies a vector from one place in register space to diff --git a/vvp/vthread.cc b/vvp/vthread.cc index 50a2e3f04..a977e558a 100644 --- a/vvp/vthread.cc +++ b/vvp/vthread.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: vthread.cc,v 1.155 2006/08/08 05:11:37 steve Exp $" +#ident "$Id: vthread.cc,v 1.156 2006/08/09 05:19:08 steve Exp $" #endif # include "config.h" @@ -2279,6 +2279,18 @@ bool of_MOD_S(vthread_t thr, vvp_code_t cp) return true; } +/* + * %mod/wr , + */ +bool of_MOD_WR(vthread_t thr, vvp_code_t cp) +{ + double l = thr->words[cp->bit_idx[0]].w_real; + double r = thr->words[cp->bit_idx[1]].w_real; + thr->words[cp->bit_idx[0]].w_real = fmod(l,r); + + return true; +} + /* * %mov , , * This instruction is implemented by the of_MOV function @@ -3272,6 +3284,9 @@ bool of_JOIN_UFUNC(vthread_t thr, vvp_code_t cp) /* * $Log: vthread.cc,v $ + * Revision 1.156 2006/08/09 05:19:08 steve + * Add support for real valued modulus. + * * Revision 1.155 2006/08/08 05:11:37 steve * Handle 64bit delay constants. *