Get signed compares working correctly in vvp.

This commit is contained in:
steve 2001-04-05 01:12:27 +00:00
parent 6322400b83
commit 898639d7bf
9 changed files with 128 additions and 15 deletions

View File

@ -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.47 2001/04/04 04:50:35 steve Exp $"
#ident "$Id: ivl_target.h,v 1.48 2001/04/05 01:12:27 steve Exp $"
#endif
#ifdef __cplusplus
@ -612,7 +612,13 @@ extern const char* ivl_scope_tname(ivl_scope_t net);
* port direction. If the signal is not a port, it returns
* IVL_SIP_NONE.
*
* ivl_signal_signed
* A signal, which is a vector, may be signed. In Verilog 2000, any
* net or variable may be signed. This function returns true if the
* signal is signed.
*
* ivl_signal_type
* Return the type of the signal, i.e. reg, wire, tri0, et al.
*
* ivl_signal_name
* This function returns the fully scoped hierarchical name for the
@ -632,6 +638,7 @@ extern const char* ivl_scope_tname(ivl_scope_t net);
extern ivl_nexus_t ivl_signal_pin(ivl_signal_t net, unsigned idx);
extern unsigned ivl_signal_pins(ivl_signal_t net);
extern ivl_signal_port_t ivl_signal_port(ivl_signal_t net);
extern int ivl_signal_signed(ivl_signal_t net);
extern ivl_signal_type_t ivl_signal_type(ivl_signal_t net);
extern const char* ivl_signal_name(ivl_signal_t net);
extern const char* ivl_signal_basename(ivl_signal_t net);
@ -737,6 +744,9 @@ _END_DECL
/*
* $Log: ivl_target.h,v $
* Revision 1.48 2001/04/05 01:12:27 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.47 2001/04/04 04:50:35 steve
* Support forever loops in the tgt-vvp target.
*

View File

@ -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.34 2001/04/04 04:50:35 steve Exp $"
#ident "$Id: t-dll-api.cc,v 1.35 2001/04/05 01:12:28 steve Exp $"
#endif
# include "t-dll.h"
@ -579,6 +579,11 @@ extern "C" ivl_signal_port_t ivl_signal_port(ivl_signal_t net)
return net->port_;
}
extern "C" int ivl_signal_signed(ivl_signal_t net)
{
return net->signed_ != 0;
}
extern "C" ivl_signal_type_t ivl_signal_type(ivl_signal_t net)
{
return net->type_;
@ -836,6 +841,9 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net)
/*
* $Log: t-dll-api.cc,v $
* Revision 1.35 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.34 2001/04/04 04:50:35 steve
* Support forever loops in the tgt-vvp target.
*

View File

@ -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-expr.cc,v 1.9 2001/04/02 00:28:35 steve Exp $"
#ident "$Id: t-dll-expr.cc,v 1.10 2001/04/05 01:12:28 steve Exp $"
#endif
# include "t-dll.h"
@ -49,6 +49,7 @@ void dll_target::expr_binary(const NetEBinary*net)
expr_->type_ = IVL_EX_BINARY;
expr_->width_= net->expr_width();
expr_->signed_ = net->has_sign()? 1 : 0;
expr_->u_.binary_.op_ = net->op();
expr_->u_.binary_.lef_ = left;
@ -152,6 +153,7 @@ void dll_target::expr_signal(const NetESignal*net)
expr_->type_ = IVL_EX_SIGNAL;
expr_->width_= net->expr_width();
expr_->signed_ = net->has_sign()? 1 : 0;
expr_->u_.subsig_.name_ = strdup(net->name().c_str());
}
@ -173,6 +175,9 @@ void dll_target::expr_unary(const NetEUnary*net)
/*
* $Log: t-dll-expr.cc,v $
* Revision 1.10 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.9 2001/04/02 00:28:35 steve
* Support the scope expression node.
*

View File

@ -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.32 2001/04/01 01:48:21 steve Exp $"
#ident "$Id: t-dll.cc,v 1.33 2001/04/05 01:12:28 steve Exp $"
#endif
# include "compiler.h"
@ -616,7 +616,7 @@ void dll_target::signal(const NetNet*net)
ivl_signal_t object. */
obj->width_ = net->pin_count();
obj->signed_= 0;
obj->signed_= net->get_signed()? 1 : 0;
switch (net->port_type()) {
@ -746,6 +746,9 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj };
/*
* $Log: t-dll.cc,v $
* Revision 1.33 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.32 2001/04/01 01:48:21 steve
* Redesign event information to support arbitrary edge combining.
*

View File

@ -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.36 2001/04/03 04:50:37 steve Exp $"
#ident "$Id: stub.c,v 1.37 2001/04/05 01:12:28 steve Exp $"
#endif
/*
@ -210,10 +210,12 @@ static void show_statement(ivl_statement_t net, unsigned ind)
}
case IVL_ST_CONDIT: {
ivl_expr_t ex = ivl_stmt_cond_expr(net);
ivl_statement_t t = ivl_stmt_cond_true(net);
ivl_statement_t f = ivl_stmt_cond_false(net);
fprintf(out, "%*sif (...)\n", ind, "");
show_expression(ex, ind+4);
if (t)
show_statement(t, ind+4);
else
@ -323,6 +325,7 @@ static void show_signal(ivl_signal_t net)
unsigned pin;
const char*type = "?";
const char*port = "";
const char*sign = ivl_signal_signed(net)? "signed" : "unsigned";
switch (ivl_signal_type(net)) {
case IVL_SIT_REG:
@ -348,7 +351,7 @@ static void show_signal(ivl_signal_t net)
break;
}
fprintf(out, " %s %s[%u] %s\n", type, port,
fprintf(out, " %s %s %s[%u] %s\n", type, sign, port,
ivl_signal_pins(net), ivl_signal_basename(net));
for (pin = 0 ; pin < ivl_signal_pins(net) ; pin += 1) {
@ -506,6 +509,9 @@ DECLARE_CYGWIN_DLL(DllMain);
/*
* $Log: stub.c,v $
* Revision 1.37 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.36 2001/04/03 04:50:37 steve
* Support non-blocking assignments.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: eval_expr.c,v 1.12 2001/04/02 03:47:49 steve Exp $"
#ident "$Id: eval_expr.c,v 1.13 2001/04/05 01:12:28 steve Exp $"
#endif
# include "vvp_priv.h"
@ -197,6 +197,8 @@ static struct vector_info draw_binary_expr_le(ivl_expr_t exp, unsigned wid)
struct vector_info lv;
struct vector_info rv;
char s_flag = (ivl_expr_signed(le) && ivl_expr_signed(re)) ? 's' : 'u';
unsigned owid = ivl_expr_width(le);
if (ivl_expr_width(re) > owid)
owid = ivl_expr_width(re);
@ -205,17 +207,30 @@ static struct vector_info draw_binary_expr_le(ivl_expr_t exp, unsigned wid)
rv = draw_eval_expr_wid(re, owid);
switch (ivl_expr_opcode(exp)) {
case 'G':
assert(lv.wid == rv.wid);
fprintf(vvp_out, " %%cmp/%c %u, %u, %u;\n", s_flag,
rv.base, lv.base, lv.wid);
fprintf(vvp_out, " %%or 5, 4, 1;\n");
break;
case 'L':
assert(lv.wid == rv.wid);
fprintf(vvp_out, " %%cmp/u %u, %u, %u;\n", lv.base,
rv.base, lv.wid);
fprintf(vvp_out, " %%cmp/%c %u, %u, %u;\n", s_flag,
lv.base, rv.base, lv.wid);
fprintf(vvp_out, " %%or 5, 4, 1;\n");
break;
case '<':
assert(lv.wid == rv.wid);
fprintf(vvp_out, " %%cmp/u %u, %u, %u;\n", lv.base,
rv.base, lv.wid);
fprintf(vvp_out, " %%cmp/%c %u, %u, %u;\n", s_flag,
lv.base, rv.base, lv.wid);
break;
case '>':
assert(lv.wid == rv.wid);
fprintf(vvp_out, " %%cmp/%c %u, %u, %u;\n", s_flag,
rv.base, lv.base, lv.wid);
break;
default:
@ -303,7 +318,9 @@ static struct vector_info draw_binary_expr(ivl_expr_t exp, unsigned wid)
break;
case '<':
case '>':
case 'L': /* <= */
case 'G': /* >= */
rv = draw_binary_expr_le(exp, wid);
break;
@ -553,6 +570,9 @@ struct vector_info draw_eval_expr(ivl_expr_t exp)
/*
* $Log: eval_expr.c,v $
* Revision 1.13 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.12 2001/04/02 03:47:49 steve
* Evaluate binary & and | operators.
*

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: codes.h,v 1.15 2001/04/01 22:25:33 steve Exp $"
#ident "$Id: codes.h,v 1.16 2001/04/05 01:12:28 steve Exp $"
#endif
@ -38,6 +38,7 @@ typedef bool (*vvp_code_fun)(vthread_t thr, vvp_code_t code);
extern bool of_ADD(vthread_t thr, vvp_code_t code);
extern bool of_AND(vthread_t thr, vvp_code_t code);
extern bool of_ASSIGN(vthread_t thr, vvp_code_t code);
extern bool of_CMPS(vthread_t thr, vvp_code_t code);
extern bool of_CMPU(vthread_t thr, vvp_code_t code);
extern bool of_CMPX(vthread_t thr, vvp_code_t code);
extern bool of_CMPZ(vthread_t thr, vvp_code_t code);
@ -105,6 +106,9 @@ extern void codespace_dump(FILE*fd);
/*
* $Log: codes.h,v $
* Revision 1.16 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.15 2001/04/01 22:25:33 steve
* Add the reduction nor instruction.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: compile.cc,v 1.28 2001/04/01 22:25:33 steve Exp $"
#ident "$Id: compile.cc,v 1.29 2001/04/05 01:12:28 steve Exp $"
#endif
# include "compile.h"
@ -68,6 +68,7 @@ const static struct opcode_table_s opcode_table[] = {
{ "%add", of_ADD, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%and", of_AND, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%assign", of_ASSIGN, 3, {OA_FUNC_PTR, OA_BIT1, OA_BIT2} },
{ "%cmp/s", of_CMPS, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%cmp/u", of_CMPU, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%cmp/x", of_CMPX, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
{ "%cmp/z", of_CMPZ, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
@ -712,6 +713,9 @@ void compile_dump(FILE*fd)
/*
* $Log: compile.cc,v $
* Revision 1.29 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.28 2001/04/01 22:25:33 steve
* Add the reduction nor instruction.
*

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#if !defined(WINNT)
#ident "$Id: vthread.cc,v 1.21 2001/04/03 03:18:34 steve Exp $"
#ident "$Id: vthread.cc,v 1.22 2001/04/05 01:12:28 steve Exp $"
#endif
# include "vthread.h"
@ -208,6 +208,56 @@ bool of_ASSIGN(vthread_t thr, vvp_code_t cp)
return true;
}
bool of_CMPS(vthread_t thr, vvp_code_t cp)
{
unsigned eq = 1;
unsigned eeq = 1;
unsigned lt = 0;
unsigned idx1 = cp->bit_idx1;
unsigned idx2 = cp->bit_idx2;
unsigned sig1 = thr_get_bit(thr, idx1 + cp->number - 1);
unsigned sig2 = thr_get_bit(thr, idx2 + cp->number - 1);
for (unsigned idx = 0 ; idx < cp->number ; idx += 1) {
unsigned lv = thr_get_bit(thr, idx1);
unsigned rv = thr_get_bit(thr, idx2);
if (lv > rv) {
lt = 0;
eeq = 0;
} else if (lv < rv) {
lt = 1;
eeq = 0;
}
if (eq != 2) {
if ((lv == 0) && (rv != 0))
eq = 0;
if ((lv == 1) && (rv != 1))
eq = 0;
if ((lv | rv) >= 2)
eq = 2;
}
if (idx1 >= 4) idx1 += 1;
if (idx2 >= 4) idx2 += 1;
}
if (eq == 2)
lt = 2;
else if ((sig1 == 1) && (sig2 == 0))
lt = 1;
else if ((sig1 == 0) && (sig2 == 1))
lt = 0;
thr_put_bit(thr, 4, eq);
thr_put_bit(thr, 5, lt);
thr_put_bit(thr, 6, eeq);
return true;
}
bool of_CMPU(vthread_t thr, vvp_code_t cp)
{
unsigned eq = 1;
@ -504,6 +554,9 @@ bool of_WAIT(vthread_t thr, vvp_code_t cp)
/*
* $Log: vthread.cc,v $
* Revision 1.22 2001/04/05 01:12:28 steve
* Get signed compares working correctly in vvp.
*
* Revision 1.21 2001/04/03 03:18:34 steve
* support functor_set push for blocking assignment.
*