Add structural modulus support down to vvp.
This commit is contained in:
parent
51ffeb7c06
commit
dd79885f6d
10
elab_net.cc
10
elab_net.cc
|
|
@ -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: elab_net.cc,v 1.84 2001/12/31 04:23:59 steve Exp $"
|
#ident "$Id: elab_net.cc,v 1.85 2002/01/03 04:19:01 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -654,9 +654,12 @@ NetNet* PEBinary::elaborate_net_mod_(Design*des, NetScope*scope,
|
||||||
NetNet*rsig = right_->elaborate_net(des, scope, 0, 0, 0, 0);
|
NetNet*rsig = right_->elaborate_net(des, scope, 0, 0, 0, 0);
|
||||||
if (rsig == 0) return 0;
|
if (rsig == 0) return 0;
|
||||||
|
|
||||||
unsigned rwidth = lsig->pin_count();
|
unsigned rwidth = lwidth;
|
||||||
|
if (rwidth == 0) {
|
||||||
|
rwidth = lsig->pin_count();
|
||||||
if (rsig->pin_count() > rwidth)
|
if (rsig->pin_count() > rwidth)
|
||||||
rwidth = rsig->pin_count();
|
rwidth = rsig->pin_count();
|
||||||
|
}
|
||||||
NetModulo*mod = new NetModulo(scope, scope->local_hsymbol(), rwidth,
|
NetModulo*mod = new NetModulo(scope, scope->local_hsymbol(), rwidth,
|
||||||
lsig->pin_count(),
|
lsig->pin_count(),
|
||||||
rsig->pin_count());
|
rsig->pin_count());
|
||||||
|
|
@ -1974,6 +1977,9 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elab_net.cc,v $
|
* $Log: elab_net.cc,v $
|
||||||
|
* Revision 1.85 2002/01/03 04:19:01 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.84 2001/12/31 04:23:59 steve
|
* Revision 1.84 2001/12/31 04:23:59 steve
|
||||||
* Elaborate multiply nets with constant operands ad NetConst.
|
* Elaborate multiply nets with constant operands ad NetConst.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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.90 2001/12/15 02:13:17 steve Exp $"
|
#ident "$Id: ivl_target.h,v 1.91 2002/01/03 04:19:01 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
@ -210,6 +210,7 @@ typedef enum ivl_lpm_type_e {
|
||||||
IVL_LPM_CMP_NE = 11,
|
IVL_LPM_CMP_NE = 11,
|
||||||
IVL_LPM_DIVIDE = 12,
|
IVL_LPM_DIVIDE = 12,
|
||||||
IVL_LPM_FF = 3,
|
IVL_LPM_FF = 3,
|
||||||
|
IVL_LPM_MOD = 13,
|
||||||
IVL_LPM_MULT = 4,
|
IVL_LPM_MULT = 4,
|
||||||
IVL_LPM_MUX = 5,
|
IVL_LPM_MUX = 5,
|
||||||
IVL_LPM_SHIFTL = 6,
|
IVL_LPM_SHIFTL = 6,
|
||||||
|
|
@ -976,6 +977,9 @@ _END_DECL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: ivl_target.h,v $
|
* $Log: ivl_target.h,v $
|
||||||
|
* Revision 1.91 2002/01/03 04:19:01 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.90 2001/12/15 02:13:17 steve
|
* Revision 1.90 2001/12/15 02:13:17 steve
|
||||||
* The IVL_SIT_WIRE type does not exist, it is a
|
* The IVL_SIT_WIRE type does not exist, it is a
|
||||||
* synonym for IVL_SIT_TRI.
|
* synonym for IVL_SIT_TRI.
|
||||||
|
|
|
||||||
|
|
@ -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.73 2001/12/06 03:11:00 steve Exp $"
|
#ident "$Id: t-dll-api.cc,v 1.74 2002/01/03 04:19:01 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -564,6 +564,7 @@ extern "C" ivl_nexus_t ivl_lpm_data(ivl_lpm_t net, unsigned idx)
|
||||||
case IVL_LPM_CMP_GT:
|
case IVL_LPM_CMP_GT:
|
||||||
case IVL_LPM_CMP_NE:
|
case IVL_LPM_CMP_NE:
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
|
case IVL_LPM_MOD:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
assert(idx < net->u_.arith.width);
|
assert(idx < net->u_.arith.width);
|
||||||
|
|
@ -599,6 +600,7 @@ extern "C" ivl_nexus_t ivl_lpm_datab(ivl_lpm_t net, unsigned idx)
|
||||||
case IVL_LPM_CMP_GT:
|
case IVL_LPM_CMP_GT:
|
||||||
case IVL_LPM_CMP_NE:
|
case IVL_LPM_CMP_NE:
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
|
case IVL_LPM_MOD:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
assert(idx < net->u_.arith.width);
|
assert(idx < net->u_.arith.width);
|
||||||
|
|
@ -637,6 +639,7 @@ extern "C" ivl_nexus_t ivl_lpm_q(ivl_lpm_t net, unsigned idx)
|
||||||
switch (net->type) {
|
switch (net->type) {
|
||||||
case IVL_LPM_ADD:
|
case IVL_LPM_ADD:
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
|
case IVL_LPM_MOD:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
assert(idx < net->u_.arith.width);
|
assert(idx < net->u_.arith.width);
|
||||||
|
|
@ -756,6 +759,7 @@ extern "C" unsigned ivl_lpm_width(ivl_lpm_t net)
|
||||||
case IVL_LPM_CMP_GT:
|
case IVL_LPM_CMP_GT:
|
||||||
case IVL_LPM_CMP_NE:
|
case IVL_LPM_CMP_NE:
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
|
case IVL_LPM_MOD:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
return net->u_.arith.width;
|
return net->u_.arith.width;
|
||||||
|
|
@ -1446,6 +1450,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.74 2002/01/03 04:19:01 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.73 2001/12/06 03:11:00 steve
|
* Revision 1.73 2001/12/06 03:11:00 steve
|
||||||
* Add ivl_logic_delay function to ivl_target.
|
* Add ivl_logic_delay function to ivl_target.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
72
t-dll.cc
72
t-dll.cc
|
|
@ -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.74 2001/12/18 05:34:02 steve Exp $"
|
#ident "$Id: t-dll.cc,v 1.75 2002/01/03 04:19:01 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -1109,6 +1109,73 @@ void dll_target::lpm_divide(const NetDivide*net)
|
||||||
scope_add_lpm(obj->scope, obj);
|
scope_add_lpm(obj->scope, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dll_target::lpm_modulo(const NetModulo*net)
|
||||||
|
{
|
||||||
|
ivl_lpm_t obj = new struct ivl_lpm_s;
|
||||||
|
obj->type = IVL_LPM_MOD;
|
||||||
|
obj->name = strdup(net->name());
|
||||||
|
assert(net->scope());
|
||||||
|
obj->scope = find_scope(des_, net->scope());
|
||||||
|
assert(obj->scope);
|
||||||
|
|
||||||
|
unsigned wid = net->width_r();
|
||||||
|
if (wid < net->width_a())
|
||||||
|
wid = net->width_a();
|
||||||
|
if (wid < net->width_b())
|
||||||
|
wid = net->width_b();
|
||||||
|
|
||||||
|
obj->u_.arith.width = wid;
|
||||||
|
|
||||||
|
obj->u_.arith.q = new ivl_nexus_t[3 * obj->u_.arith.width];
|
||||||
|
obj->u_.arith.a = obj->u_.arith.q + obj->u_.arith.width;
|
||||||
|
obj->u_.arith.b = obj->u_.arith.a + obj->u_.arith.width;
|
||||||
|
|
||||||
|
for (unsigned idx = 0 ; idx < wid ; idx += 1) {
|
||||||
|
const Nexus*nex;
|
||||||
|
|
||||||
|
if (idx < net->width_r()) {
|
||||||
|
nex = net->pin_Result(idx).nexus();
|
||||||
|
assert(nex->t_cookie());
|
||||||
|
|
||||||
|
obj->u_.arith.q[idx] = (ivl_nexus_t) nex->t_cookie();
|
||||||
|
nexus_lpm_add(obj->u_.arith.q[idx], obj, 0,
|
||||||
|
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
obj->u_.arith.q[idx] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idx < net->width_a()) {
|
||||||
|
nex = net->pin_DataA(idx).nexus();
|
||||||
|
assert(nex);
|
||||||
|
assert(nex->t_cookie());
|
||||||
|
|
||||||
|
obj->u_.arith.a[idx] = (ivl_nexus_t) nex->t_cookie();
|
||||||
|
nexus_lpm_add(obj->u_.arith.a[idx], obj, 0,
|
||||||
|
IVL_DR_HiZ, IVL_DR_HiZ);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
obj->u_.arith.a[idx] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (idx < net->width_b()) {
|
||||||
|
nex = net->pin_DataB(idx).nexus();
|
||||||
|
assert(nex);
|
||||||
|
assert(nex->t_cookie());
|
||||||
|
|
||||||
|
obj->u_.arith.b[idx] = (ivl_nexus_t) nex->t_cookie();
|
||||||
|
nexus_lpm_add(obj->u_.arith.b[idx], obj, 0,
|
||||||
|
IVL_DR_HiZ, IVL_DR_HiZ);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
obj->u_.arith.b[idx] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scope_add_lpm(obj->scope, obj);
|
||||||
|
}
|
||||||
|
|
||||||
void dll_target::lpm_ff(const NetFF*net)
|
void dll_target::lpm_ff(const NetFF*net)
|
||||||
{
|
{
|
||||||
ivl_lpm_t obj = new struct ivl_lpm_s;
|
ivl_lpm_t obj = new struct ivl_lpm_s;
|
||||||
|
|
@ -1723,6 +1790,9 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-dll.cc,v $
|
* $Log: t-dll.cc,v $
|
||||||
|
* Revision 1.75 2002/01/03 04:19:01 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.74 2001/12/18 05:34:02 steve
|
* Revision 1.74 2001/12/18 05:34:02 steve
|
||||||
* Comments about MUX synthesis.
|
* Comments about MUX synthesis.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
6
t-dll.h
6
t-dll.h
|
|
@ -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.72 2001/12/06 03:11:01 steve Exp $"
|
#ident "$Id: t-dll.h,v 1.73 2002/01/03 04:19:01 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "target.h"
|
# include "target.h"
|
||||||
|
|
@ -75,6 +75,7 @@ struct dll_target : public target_t, public expr_scan_t {
|
||||||
void lpm_compare(const NetCompare*);
|
void lpm_compare(const NetCompare*);
|
||||||
void lpm_divide(const NetDivide*);
|
void lpm_divide(const NetDivide*);
|
||||||
void lpm_ff(const NetFF*);
|
void lpm_ff(const NetFF*);
|
||||||
|
void lpm_modulo(const NetModulo*);
|
||||||
void lpm_mult(const NetMult*);
|
void lpm_mult(const NetMult*);
|
||||||
void lpm_mux(const NetMux*);
|
void lpm_mux(const NetMux*);
|
||||||
void lpm_ram_dq(const NetRamDq*);
|
void lpm_ram_dq(const NetRamDq*);
|
||||||
|
|
@ -589,6 +590,9 @@ struct ivl_statement_s {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-dll.h,v $
|
* $Log: t-dll.h,v $
|
||||||
|
* Revision 1.73 2002/01/03 04:19:01 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.72 2001/12/06 03:11:01 steve
|
* Revision 1.72 2001/12/06 03:11:01 steve
|
||||||
* Add ivl_logic_delay function to ivl_target.
|
* Add ivl_logic_delay function to ivl_target.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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.60 2001/12/15 02:13:33 steve Exp $"
|
#ident "$Id: vvp_scope.c,v 1.61 2002/01/03 04:19:01 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "vvp_priv.h"
|
# include "vvp_priv.h"
|
||||||
|
|
@ -247,6 +247,7 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
|
case IVL_LPM_MOD:
|
||||||
for (idx = 0 ; idx < ivl_lpm_width(lpm) ; idx += 1)
|
for (idx = 0 ; idx < ivl_lpm_width(lpm) ; idx += 1)
|
||||||
if (ivl_lpm_q(lpm, idx) == nex) {
|
if (ivl_lpm_q(lpm, idx) == nex) {
|
||||||
sprintf(result, "L_%s[%u]",
|
sprintf(result, "L_%s[%u]",
|
||||||
|
|
@ -1003,6 +1004,9 @@ static void draw_lpm_add(ivl_lpm_t net)
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
type = "div";
|
type = "div";
|
||||||
break;
|
break;
|
||||||
|
case IVL_LPM_MOD:
|
||||||
|
type = "mod";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
@ -1202,6 +1206,7 @@ static void draw_lpm_in_scope(ivl_lpm_t net)
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_DIVIDE:
|
case IVL_LPM_DIVIDE:
|
||||||
|
case IVL_LPM_MOD:
|
||||||
draw_lpm_add(net);
|
draw_lpm_add(net);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -1321,6 +1326,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vvp_scope.c,v $
|
* $Log: vvp_scope.c,v $
|
||||||
|
* Revision 1.61 2002/01/03 04:19:01 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.60 2001/12/15 02:13:33 steve
|
* Revision 1.60 2001/12/15 02:13:33 steve
|
||||||
* Support all 3 TRI net types.
|
* Support all 3 TRI net types.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* $Id: README.txt,v 1.38 2001/11/01 03:00:19 steve Exp $
|
* $Id: README.txt,v 1.39 2002/01/03 04:19:01 steve Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
VVP SIMULATION ENGINE
|
VVP SIMULATION ENGINE
|
||||||
|
|
@ -433,6 +433,7 @@ create special statement types for the various arithmetic operators.
|
||||||
<label> .arith/sum <wid>, <symbols_list>;
|
<label> .arith/sum <wid>, <symbols_list>;
|
||||||
<label> .arith/mult <wid>, <symbols_list>;
|
<label> .arith/mult <wid>, <symbols_list>;
|
||||||
<label> .arith/div <wid>, <symbols_list>;
|
<label> .arith/div <wid>, <symbols_list>;
|
||||||
|
<label> .arith/mod <wid>, <symbols_list>;
|
||||||
|
|
||||||
Addition is represented by the .arith/sum statement. This creates an
|
Addition is represented by the .arith/sum statement. This creates an
|
||||||
array of functors based at the label. The width of the array is given
|
array of functors based at the label. The width of the array is given
|
||||||
|
|
|
||||||
46
vvp/arith.cc
46
vvp/arith.cc
|
|
@ -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: arith.cc,v 1.21 2001/12/06 03:31:24 steve Exp $"
|
#ident "$Id: arith.cc,v 1.22 2002/01/03 04:19:02 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "arith.h"
|
# include "arith.h"
|
||||||
|
|
@ -128,6 +128,47 @@ void vvp_arith_div::set(vvp_ipoint_t i, bool push, unsigned val, unsigned)
|
||||||
output_val_(base, push, a/b);
|
output_val_(base, push, a/b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void vvp_arith_mod::wide(vvp_ipoint_t base, bool push)
|
||||||
|
{
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vvp_arith_mod::set(vvp_ipoint_t i, bool push, unsigned val, unsigned)
|
||||||
|
{
|
||||||
|
put(i, val);
|
||||||
|
vvp_ipoint_t base = ipoint_make(i,0);
|
||||||
|
|
||||||
|
if(wid_ > 8*sizeof(unsigned long)) {
|
||||||
|
wide(base, push);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long a = 0, b = 0;
|
||||||
|
|
||||||
|
for (unsigned idx = 0 ; idx < wid_ ; idx += 1) {
|
||||||
|
vvp_ipoint_t ptr = ipoint_index(base,idx);
|
||||||
|
functor_t obj = functor_index(ptr);
|
||||||
|
|
||||||
|
unsigned val = obj->ival;
|
||||||
|
if (val & 0xaa) {
|
||||||
|
output_x_(base, push);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val & 0x01)
|
||||||
|
a += 1 << idx;
|
||||||
|
if (val & 0x04)
|
||||||
|
b += 1 << idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b == 0) {
|
||||||
|
output_x_(base, push);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
output_val_(base, push, a%b);
|
||||||
|
}
|
||||||
|
|
||||||
// Multiplication
|
// Multiplication
|
||||||
|
|
||||||
void vvp_arith_mult::set(vvp_ipoint_t i, bool push, unsigned val, unsigned)
|
void vvp_arith_mult::set(vvp_ipoint_t i, bool push, unsigned val, unsigned)
|
||||||
|
|
@ -508,6 +549,9 @@ void vvp_shiftr::set(vvp_ipoint_t i, bool push, unsigned val, unsigned)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: arith.cc,v $
|
* $Log: arith.cc,v $
|
||||||
|
* Revision 1.22 2002/01/03 04:19:02 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.21 2001/12/06 03:31:24 steve
|
* Revision 1.21 2001/12/06 03:31:24 steve
|
||||||
* Support functor delays for gates and UDP devices.
|
* Support functor delays for gates and UDP devices.
|
||||||
* (Stephan Boettcher)
|
* (Stephan Boettcher)
|
||||||
|
|
|
||||||
14
vvp/arith.h
14
vvp/arith.h
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: arith.h,v 1.11 2001/10/31 04:27:46 steve Exp $"
|
#ident "$Id: arith.h,v 1.12 2002/01/03 04:19:02 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "functor.h"
|
# include "functor.h"
|
||||||
|
|
@ -75,6 +75,15 @@ class vvp_arith_div : public vvp_arith_ {
|
||||||
void wide(vvp_ipoint_t base, bool push);
|
void wide(vvp_ipoint_t base, bool push);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class vvp_arith_mod : public vvp_arith_ {
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit vvp_arith_mod(unsigned wid) : vvp_arith_(wid) {}
|
||||||
|
|
||||||
|
void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str);
|
||||||
|
void wide(vvp_ipoint_t base, bool push);
|
||||||
|
};
|
||||||
|
|
||||||
class vvp_arith_sum : public vvp_wide_arith_ {
|
class vvp_arith_sum : public vvp_wide_arith_ {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -125,6 +134,9 @@ class vvp_shiftr : public vvp_arith_ {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: arith.h,v $
|
* $Log: arith.h,v $
|
||||||
|
* Revision 1.12 2002/01/03 04:19:02 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.11 2001/10/31 04:27:46 steve
|
* Revision 1.11 2001/10/31 04:27:46 steve
|
||||||
* Rewrite the functor type to have fewer functor modes,
|
* Rewrite the functor type to have fewer functor modes,
|
||||||
* and use objects to manage the different types.
|
* and use objects to manage the different types.
|
||||||
|
|
|
||||||
|
|
@ -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: compile.cc,v 1.117 2001/12/15 02:11:51 steve Exp $"
|
#ident "$Id: compile.cc,v 1.118 2002/01/03 04:19:02 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "arith.h"
|
# include "arith.h"
|
||||||
|
|
@ -679,6 +679,22 @@ void compile_arith_div(char*label, long wid,
|
||||||
make_arith(arith, label, wid, argc, argv);
|
make_arith(arith, label, wid, argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void compile_arith_mod(char*label, long wid,
|
||||||
|
unsigned argc, struct symb_s*argv)
|
||||||
|
{
|
||||||
|
assert( wid > 0 );
|
||||||
|
|
||||||
|
if ((long)argc != 2*wid) {
|
||||||
|
fprintf(stderr, "%s; .arith has wrong number of symbols\n", label);
|
||||||
|
compile_errors += 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vvp_arith_ *arith = new vvp_arith_mod(wid);
|
||||||
|
|
||||||
|
make_arith(arith, label, wid, argc, argv);
|
||||||
|
}
|
||||||
|
|
||||||
void compile_arith_mult(char*label, long wid,
|
void compile_arith_mult(char*label, long wid,
|
||||||
unsigned argc, struct symb_s*argv)
|
unsigned argc, struct symb_s*argv)
|
||||||
{
|
{
|
||||||
|
|
@ -1350,6 +1366,9 @@ vvp_ipoint_t debug_lookup_functor(const char*name)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.cc,v $
|
* $Log: compile.cc,v $
|
||||||
|
* Revision 1.118 2002/01/03 04:19:02 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.117 2001/12/15 02:11:51 steve
|
* Revision 1.117 2001/12/15 02:11:51 steve
|
||||||
* Give tri0 and tri1 their proper strengths.
|
* Give tri0 and tri1 their proper strengths.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: compile.h,v 1.39 2001/12/14 02:04:49 steve Exp $"
|
#ident "$Id: compile.h,v 1.40 2002/01/03 04:19:02 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
@ -97,6 +97,8 @@ extern void compile_force(char*label, struct symb_s signal,
|
||||||
*/
|
*/
|
||||||
extern void compile_arith_div(char*label, long width,
|
extern void compile_arith_div(char*label, long width,
|
||||||
unsigned argc, struct symb_s*argv);
|
unsigned argc, struct symb_s*argv);
|
||||||
|
extern void compile_arith_mod(char*label, long width,
|
||||||
|
unsigned argc, struct symb_s*argv);
|
||||||
extern void compile_arith_mult(char*label, long width,
|
extern void compile_arith_mult(char*label, long width,
|
||||||
unsigned argc, struct symb_s*argv);
|
unsigned argc, struct symb_s*argv);
|
||||||
extern void compile_arith_sum(char*label, long width,
|
extern void compile_arith_sum(char*label, long width,
|
||||||
|
|
@ -223,6 +225,9 @@ extern void compile_net(char*label, char*name,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.h,v $
|
* $Log: compile.h,v $
|
||||||
|
* Revision 1.40 2002/01/03 04:19:02 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.39 2001/12/14 02:04:49 steve
|
* Revision 1.39 2001/12/14 02:04:49 steve
|
||||||
* Support strength syntax on functors.
|
* Support strength syntax on functors.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: lexor.lex,v 1.28 2001/11/01 03:00:19 steve Exp $"
|
#ident "$Id: lexor.lex,v 1.29 2002/01/03 04:19:02 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
|
|
@ -67,6 +67,7 @@
|
||||||
|
|
||||||
/* These are some keywords that are recognized. */
|
/* These are some keywords that are recognized. */
|
||||||
".arith/div" { return K_ARITH_DIV; }
|
".arith/div" { return K_ARITH_DIV; }
|
||||||
|
".arith/mod" { return K_ARITH_MOD; }
|
||||||
".arith/mult" { return K_ARITH_MULT; }
|
".arith/mult" { return K_ARITH_MULT; }
|
||||||
".arith/sub" { return K_ARITH_SUB; }
|
".arith/sub" { return K_ARITH_SUB; }
|
||||||
".arith/sum" { return K_ARITH_SUM; }
|
".arith/sum" { return K_ARITH_SUM; }
|
||||||
|
|
@ -150,6 +151,9 @@ int yywrap()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: lexor.lex,v $
|
* $Log: lexor.lex,v $
|
||||||
|
* Revision 1.29 2002/01/03 04:19:02 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.28 2001/11/01 03:00:19 steve
|
* Revision 1.28 2001/11/01 03:00:19 steve
|
||||||
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
* Add force/cassign/release/deassign support. (Stephan Boettcher)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
13
vvp/parse.y
13
vvp/parse.y
|
|
@ -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)
|
#if !defined(WINNT)
|
||||||
#ident "$Id: parse.y,v 1.42 2001/12/14 02:04:49 steve Exp $"
|
#ident "$Id: parse.y,v 1.43 2002/01/03 04:19:02 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "parse_misc.h"
|
# include "parse_misc.h"
|
||||||
|
|
@ -57,7 +57,8 @@ extern FILE*yyin;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
%token K_ARITH_DIV K_ARITH_MULT K_ARITH_SUB K_ARITH_SUM K_CMP_GE K_CMP_GT
|
%token K_ARITH_DIV K_ARITH_MOD K_ARITH_MULT K_ARITH_SUB K_ARITH_SUM
|
||||||
|
%token K_CMP_GE K_CMP_GT
|
||||||
%token K_EVENT K_EVENT_OR K_FUNCTOR K_NET K_NET_S
|
%token K_EVENT K_EVENT_OR K_FUNCTOR K_NET K_NET_S
|
||||||
%token K_RESOLV K_SCOPE K_SHIFTL K_SHIFTR K_THREAD
|
%token K_RESOLV K_SCOPE K_SHIFTL K_SHIFTR K_THREAD
|
||||||
%token K_UDP K_UDP_C K_UDP_S
|
%token K_UDP K_UDP_C K_UDP_S
|
||||||
|
|
@ -182,6 +183,11 @@ statement
|
||||||
compile_arith_div($1, $3, obj.cnt, obj.vect);
|
compile_arith_div($1, $3, obj.cnt, obj.vect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
| T_LABEL K_ARITH_MOD T_NUMBER ',' symbols ';'
|
||||||
|
{ struct symbv_s obj = $5;
|
||||||
|
compile_arith_mod($1, $3, obj.cnt, obj.vect);
|
||||||
|
}
|
||||||
|
|
||||||
| T_LABEL K_ARITH_MULT T_NUMBER ',' symbols ';'
|
| T_LABEL K_ARITH_MULT T_NUMBER ',' symbols ';'
|
||||||
{ struct symbv_s obj = $5;
|
{ struct symbv_s obj = $5;
|
||||||
compile_arith_mult($1, $3, obj.cnt, obj.vect);
|
compile_arith_mult($1, $3, obj.cnt, obj.vect);
|
||||||
|
|
@ -532,6 +538,9 @@ int compile_design(const char*path)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: parse.y,v $
|
* $Log: parse.y,v $
|
||||||
|
* Revision 1.43 2002/01/03 04:19:02 steve
|
||||||
|
* Add structural modulus support down to vvp.
|
||||||
|
*
|
||||||
* Revision 1.42 2001/12/14 02:04:49 steve
|
* Revision 1.42 2001/12/14 02:04:49 steve
|
||||||
* Support strength syntax on functors.
|
* Support strength syntax on functors.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue