Add support for structural multiply in t-dll.
Add code generators and vvp support for both structural and behavioral multiply.
This commit is contained in:
parent
63a02d1c0a
commit
4b82d26f5e
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: elab_net.cc,v 1.68 2001/06/15 04:14:18 steve Exp $"
|
||||
#ident "$Id: elab_net.cc,v 1.69 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "PExpr.h"
|
||||
|
|
@ -791,7 +791,7 @@ NetNet* PEBinary::elaborate_net_mul_(Design*des, const string&path,
|
|||
if (rsig == 0) return 0;
|
||||
|
||||
unsigned rwidth = lwidth;
|
||||
NetMult*mult = new NetMult(des->local_symbol(path), rwidth,
|
||||
NetMult*mult = new NetMult(scope, des->local_symbol(path), rwidth,
|
||||
lsig->pin_count(),
|
||||
rsig->pin_count());
|
||||
des->add_node(mult);
|
||||
|
|
@ -1901,6 +1901,11 @@ NetNet* PEUnary::elaborate_net(Design*des, const string&path,
|
|||
|
||||
/*
|
||||
* $Log: elab_net.cc,v $
|
||||
* Revision 1.69 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.68 2001/06/15 04:14:18 steve
|
||||
* Generate vvp code for GT and GE comparisons.
|
||||
*
|
||||
|
|
|
|||
16
ivl_target.h
16
ivl_target.h
|
|
@ -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.67 2001/06/16 02:41:41 steve Exp $"
|
||||
#ident "$Id: ivl_target.h,v 1.68 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
@ -205,9 +205,10 @@ typedef enum ivl_lpm_type_e {
|
|||
IVL_LPM_CMP_GE,
|
||||
IVL_LPM_CMP_GT,
|
||||
IVL_LPM_FF,
|
||||
IVL_LPM_MULT,
|
||||
IVL_LPM_MUX,
|
||||
IVL_LPM_SUB,
|
||||
IVL_LPM_RAM,
|
||||
IVL_LPM_RAM
|
||||
} ivl_lpm_type_t;
|
||||
|
||||
/* Processes are initial or always blocks with a statement. This is
|
||||
|
|
@ -517,13 +518,13 @@ extern unsigned ivl_lpm_width(ivl_lpm_t net);
|
|||
extern ivl_nexus_t ivl_lpm_clk(ivl_lpm_t net);
|
||||
/* IVL_LPM_RAM */
|
||||
extern ivl_nexus_t ivl_lpm_enable(ivl_lpm_t net);
|
||||
/* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_RAM IVL_LPM_SUB */
|
||||
/* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_MULT IVL_LPM_RAM IVL_LPM_SUB */
|
||||
extern ivl_nexus_t ivl_lpm_data(ivl_lpm_t net, unsigned idx);
|
||||
/* IVL_LPM_ADD IVL_LPM_SUB */
|
||||
/* IVL_LPM_ADD IVL_LPM_MULT IVL_LPM_SUB */
|
||||
extern ivl_nexus_t ivl_lpm_datab(ivl_lpm_t net, unsigned idx);
|
||||
/* IVL_LPM_MUX */
|
||||
extern ivl_nexus_t ivl_lpm_data2(ivl_lpm_t net, unsigned sdx, unsigned idx);
|
||||
/* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_RAM IVL_LPM_SUB */
|
||||
/* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_MULT IVL_LPM_RAM IVL_LPM_SUB */
|
||||
extern ivl_nexus_t ivl_lpm_q(ivl_lpm_t net, unsigned idx);
|
||||
/* IVL_LPM_MUX IVL_LPM_RAM */
|
||||
extern unsigned ivl_lpm_selects(ivl_lpm_t net);
|
||||
|
|
@ -881,6 +882,11 @@ _END_DECL
|
|||
|
||||
/*
|
||||
* $Log: ivl_target.h,v $
|
||||
* Revision 1.68 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.67 2001/06/16 02:41:41 steve
|
||||
* Generate code to support memory access in continuous
|
||||
* assignment statements. (Stephan Boettcher)
|
||||
|
|
|
|||
15
netlist.cc
15
netlist.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: netlist.cc,v 1.162 2001/06/15 04:14:18 steve Exp $"
|
||||
#ident "$Id: netlist.cc,v 1.163 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <cassert>
|
||||
|
|
@ -1012,10 +1012,10 @@ const Link& NetDivide::pin_DataB(unsigned idx) const
|
|||
return pin(idx+width_r_+width_a_);
|
||||
}
|
||||
|
||||
NetMult::NetMult(const string&n, unsigned wr, unsigned wa, unsigned wb,
|
||||
unsigned ws)
|
||||
: NetNode(n, 2+wr+wa+wb+ws), width_r_(wr), width_a_(wa), width_b_(wb),
|
||||
width_s_(ws)
|
||||
NetMult::NetMult(NetScope*sc, const string&n, unsigned wr,
|
||||
unsigned wa, unsigned wb, unsigned ws)
|
||||
: NetNode(sc, n, 2+wr+wa+wb+ws), width_r_(wr), width_a_(wa), width_b_(wb),
|
||||
width_s_(ws)
|
||||
{
|
||||
pin(0).set_dir(Link::INPUT); pin(0).set_name("Aclr", 0);
|
||||
pin(1).set_dir(Link::INPUT); pin(1).set_name("Clock", 0);
|
||||
|
|
@ -2323,6 +2323,11 @@ const NetProc*NetTaskDef::proc() const
|
|||
|
||||
/*
|
||||
* $Log: netlist.cc,v $
|
||||
* Revision 1.163 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.162 2001/06/15 04:14:18 steve
|
||||
* Generate vvp code for GT and GE comparisons.
|
||||
*
|
||||
|
|
|
|||
11
netlist.h
11
netlist.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: netlist.h,v 1.208 2001/06/15 04:14:18 steve Exp $"
|
||||
#ident "$Id: netlist.h,v 1.209 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -678,8 +678,8 @@ class NetMemory {
|
|||
class NetMult : public NetNode {
|
||||
|
||||
public:
|
||||
NetMult(const string&n, unsigned width, unsigned wa, unsigned wb,
|
||||
unsigned width_s =0);
|
||||
NetMult(NetScope*sc, const string&n, unsigned width,
|
||||
unsigned wa, unsigned wb, unsigned width_s =0);
|
||||
~NetMult();
|
||||
|
||||
// Get the width of the device bussed inputs. There are these
|
||||
|
|
@ -2809,6 +2809,11 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
|||
|
||||
/*
|
||||
* $Log: netlist.h,v $
|
||||
* Revision 1.209 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.208 2001/06/15 04:14:18 steve
|
||||
* Generate vvp code for GT and GE comparisons.
|
||||
*
|
||||
|
|
|
|||
11
t-dll-api.cc
11
t-dll-api.cc
|
|
@ -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.50 2001/06/16 02:41:41 steve Exp $"
|
||||
#ident "$Id: t-dll-api.cc,v 1.51 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "t-dll.h"
|
||||
|
|
@ -465,6 +465,7 @@ extern "C" ivl_nexus_t ivl_lpm_data(ivl_lpm_t net, unsigned idx)
|
|||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_CMP_GE:
|
||||
case IVL_LPM_CMP_GT:
|
||||
case IVL_LPM_MULT:
|
||||
case IVL_LPM_SUB:
|
||||
assert(idx < net->u_.arith.width);
|
||||
return net->u_.arith.a[idx];
|
||||
|
|
@ -491,6 +492,7 @@ extern "C" ivl_nexus_t ivl_lpm_datab(ivl_lpm_t net, unsigned idx)
|
|||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_CMP_GE:
|
||||
case IVL_LPM_CMP_GT:
|
||||
case IVL_LPM_MULT:
|
||||
case IVL_LPM_SUB:
|
||||
assert(idx < net->u_.arith.width);
|
||||
return net->u_.arith.b[idx];
|
||||
|
|
@ -527,6 +529,7 @@ extern "C" ivl_nexus_t ivl_lpm_q(ivl_lpm_t net, unsigned idx)
|
|||
|
||||
switch (net->type) {
|
||||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_MULT:
|
||||
case IVL_LPM_SUB:
|
||||
assert(idx < net->u_.arith.width);
|
||||
return net->u_.arith.q[idx];
|
||||
|
|
@ -621,6 +624,7 @@ extern "C" unsigned ivl_lpm_width(ivl_lpm_t net)
|
|||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_CMP_GE:
|
||||
case IVL_LPM_CMP_GT:
|
||||
case IVL_LPM_MULT:
|
||||
case IVL_LPM_SUB:
|
||||
return net->u_.arith.width;
|
||||
default:
|
||||
|
|
@ -1223,6 +1227,11 @@ extern "C" ivl_statement_t ivl_stmt_sub_stmt(ivl_statement_t net)
|
|||
|
||||
/*
|
||||
* $Log: t-dll-api.cc,v $
|
||||
* Revision 1.51 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.50 2001/06/16 02:41:41 steve
|
||||
* Generate code to support memory access in continuous
|
||||
* assignment statements. (Stephan Boettcher)
|
||||
|
|
|
|||
72
t-dll.cc
72
t-dll.cc
|
|
@ -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.48 2001/06/16 02:41:42 steve Exp $"
|
||||
#ident "$Id: t-dll.cc,v 1.49 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "compiler.h"
|
||||
|
|
@ -837,9 +837,10 @@ void dll_target::lpm_ram_dq(const NetRamDq*net)
|
|||
|
||||
const Nexus*nex;
|
||||
|
||||
// How do I find out if there is something
|
||||
// connected to the clock input?
|
||||
bool has_write_port = false;
|
||||
// A write port is present only if something is connected to
|
||||
// the clock input.
|
||||
|
||||
bool has_write_port = net->pin_InClock().is_linked();
|
||||
|
||||
// Connect the write clock and write enable
|
||||
|
||||
|
|
@ -933,6 +934,64 @@ void dll_target::lpm_ram_dq(const NetRamDq*net)
|
|||
}
|
||||
}
|
||||
|
||||
void dll_target::lpm_mult(const NetMult*net)
|
||||
{
|
||||
ivl_lpm_t obj = new struct ivl_lpm_s;
|
||||
obj->type = IVL_LPM_MULT;
|
||||
obj->name = strdup(net->name());
|
||||
assert(net->scope());
|
||||
obj->scope = find_scope(des_.root_, net->scope());
|
||||
assert(obj->scope);
|
||||
|
||||
unsigned wid = net->width_r();
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
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_mux(const NetMux*net)
|
||||
{
|
||||
ivl_lpm_t obj = new struct ivl_lpm_s;
|
||||
|
|
@ -1293,6 +1352,11 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj };
|
|||
|
||||
/*
|
||||
* $Log: t-dll.cc,v $
|
||||
* Revision 1.49 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.48 2001/06/16 02:41:42 steve
|
||||
* Generate code to support memory access in continuous
|
||||
* assignment statements. (Stephan Boettcher)
|
||||
|
|
|
|||
8
t-dll.h
8
t-dll.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: t-dll.h,v 1.48 2001/06/16 02:41:42 steve Exp $"
|
||||
#ident "$Id: t-dll.h,v 1.49 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "target.h"
|
||||
|
|
@ -64,6 +64,7 @@ struct dll_target : public target_t, public expr_scan_t {
|
|||
void lpm_add_sub(const NetAddSub*);
|
||||
void lpm_compare(const NetCompare*);
|
||||
void lpm_ff(const NetFF*);
|
||||
void lpm_mult(const NetMult*);
|
||||
void lpm_mux(const NetMux*);
|
||||
void lpm_ram_dq(const NetRamDq*);
|
||||
void net_assign(const NetAssign_*);
|
||||
|
|
@ -537,6 +538,11 @@ struct ivl_statement_s {
|
|||
|
||||
/*
|
||||
* $Log: t-dll.h,v $
|
||||
* Revision 1.49 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.48 2001/06/16 02:41:42 steve
|
||||
* Generate code to support memory access in continuous
|
||||
* assignment statements. (Stephan Boettcher)
|
||||
|
|
|
|||
|
|
@ -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.29 2001/05/24 04:20:10 steve Exp $"
|
||||
#ident "$Id: eval_expr.c,v 1.30 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvp_priv.h"
|
||||
|
|
@ -518,12 +518,12 @@ static struct vector_info draw_binary_expr_arith(ivl_expr_t exp, unsigned wid)
|
|||
struct vector_info lv;
|
||||
struct vector_info rv;
|
||||
|
||||
assert(ivl_expr_width(le) == wid);
|
||||
assert(ivl_expr_width(re) == wid);
|
||||
|
||||
lv = draw_eval_expr_wid(le, wid);
|
||||
rv = draw_eval_expr_wid(re, wid);
|
||||
|
||||
assert(lv.wid == wid);
|
||||
assert(rv.wid == wid);
|
||||
|
||||
switch (ivl_expr_opcode(exp)) {
|
||||
case '+':
|
||||
fprintf(vvp_out, " %%add %u, %u, %u;\n", lv.base, rv.base, wid);
|
||||
|
|
@ -533,6 +533,10 @@ static struct vector_info draw_binary_expr_arith(ivl_expr_t exp, unsigned wid)
|
|||
fprintf(vvp_out, " %%sub %u, %u, %u;\n", lv.base, rv.base, wid);
|
||||
break;
|
||||
|
||||
case '*':
|
||||
fprintf(vvp_out, " %%mul %u, %u, %u;\n", lv.base, rv.base, wid);
|
||||
break;
|
||||
|
||||
case '%':
|
||||
fprintf(vvp_out, " %%mod %u, %u, %u;\n", lv.base, rv.base, wid);
|
||||
break;
|
||||
|
|
@ -572,6 +576,7 @@ static struct vector_info draw_binary_expr(ivl_expr_t exp, unsigned wid)
|
|||
|
||||
case '+':
|
||||
case '-':
|
||||
case '*':
|
||||
case '%':
|
||||
rv = draw_binary_expr_arith(exp, wid);
|
||||
break;
|
||||
|
|
@ -1043,6 +1048,11 @@ struct vector_info draw_eval_expr(ivl_expr_t exp)
|
|||
|
||||
/*
|
||||
* $Log: eval_expr.c,v $
|
||||
* Revision 1.30 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.29 2001/05/24 04:20:10 steve
|
||||
* Add behavioral modulus.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: vvp_scope.c,v 1.33 2001/06/16 02:41:42 steve Exp $"
|
||||
#ident "$Id: vvp_scope.c,v 1.34 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvp_priv.h"
|
||||
|
|
@ -118,6 +118,7 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
|||
case IVL_LPM_RAM:
|
||||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_SUB:
|
||||
case IVL_LPM_MULT:
|
||||
for (idx = 0 ; idx < ivl_lpm_width(lpm) ; idx += 1)
|
||||
if (ivl_lpm_q(lpm, idx) == nex) {
|
||||
sprintf(result, "L_%s[%u]",
|
||||
|
|
@ -138,7 +139,10 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
|||
|
||||
}
|
||||
|
||||
fprintf(stderr, "internal error: no input to nexus %s\n",
|
||||
ivl_nexus_name(nex));
|
||||
assert(0);
|
||||
return "C<z>";
|
||||
}
|
||||
|
||||
static const char* draw_net_input(ivl_nexus_t nex)
|
||||
|
|
@ -706,6 +710,9 @@ static void draw_lpm_add(ivl_lpm_t net)
|
|||
case IVL_LPM_SUB:
|
||||
type = "sub";
|
||||
break;
|
||||
case IVL_LPM_MULT:
|
||||
type = "mult";
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
|
@ -779,6 +786,7 @@ static void draw_lpm_in_scope(ivl_lpm_t net)
|
|||
|
||||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_SUB:
|
||||
case IVL_LPM_MULT:
|
||||
draw_lpm_add(net);
|
||||
return;
|
||||
|
||||
|
|
@ -876,6 +884,11 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
|||
|
||||
/*
|
||||
* $Log: vvp_scope.c,v $
|
||||
* Revision 1.34 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.33 2001/06/16 02:41:42 steve
|
||||
* Generate code to support memory access in continuous
|
||||
* assignment statements. (Stephan Boettcher)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
||||
*
|
||||
* $Id: README.txt,v 1.29 2001/06/15 04:07:57 steve Exp $
|
||||
* $Id: README.txt,v 1.30 2001/06/16 23:45:05 steve Exp $
|
||||
*/
|
||||
|
||||
VVP SIMULATION ENGINE
|
||||
|
|
@ -423,6 +423,7 @@ create special statement types for the various arithmetic operators.
|
|||
|
||||
<label> .arith/sub <wid>, <symbols_list>;
|
||||
<label> .arith/sum <wid>, <symbols_list>;
|
||||
<label> .arith/mult <wid>, <symbols_list>;
|
||||
|
||||
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
|
||||
|
|
|
|||
60
vvp/arith.cc
60
vvp/arith.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: arith.cc,v 1.4 2001/06/16 03:36:03 steve Exp $"
|
||||
#ident "$Id: arith.cc,v 1.5 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "arith.h"
|
||||
|
|
@ -48,6 +48,55 @@ void vvp_arith_::output_x_(bool push)
|
|||
}
|
||||
}
|
||||
|
||||
vvp_arith_mult::vvp_arith_mult(vvp_ipoint_t b, unsigned w)
|
||||
: vvp_arith_(b, w)
|
||||
{
|
||||
}
|
||||
|
||||
void vvp_arith_mult::set(vvp_ipoint_t i, functor_t f, bool push)
|
||||
{
|
||||
assert(wid_ <= 8*sizeof(unsigned long));
|
||||
|
||||
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 ival = obj->ival;
|
||||
if (ival & 0xaa) {
|
||||
output_x_(push);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ival & 0x01)
|
||||
a += 1 << idx;
|
||||
if (ival & 0x04)
|
||||
b += 1 << idx;
|
||||
|
||||
}
|
||||
|
||||
unsigned long sum = a * b;
|
||||
|
||||
for (unsigned idx = 0 ; idx < wid_ ; idx += 1) {
|
||||
vvp_ipoint_t ptr = ipoint_index(base_,idx);
|
||||
functor_t obj = functor_index(ptr);
|
||||
|
||||
unsigned oval = sum & 1;
|
||||
sum >>= 1;
|
||||
|
||||
if (obj->oval == oval)
|
||||
continue;
|
||||
|
||||
|
||||
obj->oval = oval;
|
||||
if (push)
|
||||
functor_propagate(ptr);
|
||||
else
|
||||
schedule_functor(ptr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
vvp_arith_sum::vvp_arith_sum(vvp_ipoint_t b, unsigned w)
|
||||
: vvp_arith_(b, w)
|
||||
{
|
||||
|
|
@ -55,7 +104,7 @@ vvp_arith_sum::vvp_arith_sum(vvp_ipoint_t b, unsigned w)
|
|||
|
||||
void vvp_arith_sum::set(vvp_ipoint_t i, functor_t f, bool push)
|
||||
{
|
||||
assert(wid_ <= sizeof(unsigned long));
|
||||
assert(wid_ <= 8*sizeof(unsigned long));
|
||||
|
||||
unsigned long sum = 0;
|
||||
|
||||
|
|
@ -108,7 +157,7 @@ vvp_arith_sub::vvp_arith_sub(vvp_ipoint_t b, unsigned w)
|
|||
|
||||
void vvp_arith_sub::set(vvp_ipoint_t i, functor_t f, bool push)
|
||||
{
|
||||
assert(wid_ <= sizeof(unsigned long));
|
||||
assert(wid_ <= 8*sizeof(unsigned long));
|
||||
|
||||
unsigned long sum = 0;
|
||||
|
||||
|
|
@ -242,6 +291,11 @@ void vvp_cmp_gt::set(vvp_ipoint_t i, functor_t f, bool push)
|
|||
|
||||
/*
|
||||
* $Log: arith.cc,v $
|
||||
* Revision 1.5 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.4 2001/06/16 03:36:03 steve
|
||||
* Relax width restriction for structural comparators.
|
||||
*
|
||||
|
|
|
|||
19
vvp/arith.h
19
vvp/arith.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: arith.h,v 1.3 2001/06/15 04:07:58 steve Exp $"
|
||||
#ident "$Id: arith.h,v 1.4 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "functor.h"
|
||||
|
|
@ -47,6 +47,18 @@ class vvp_arith_ : public vvp_fobj_s {
|
|||
* in cause the 4-input summation to be calculated, and output
|
||||
* functors that are affected cause propagations.
|
||||
*/
|
||||
class vvp_arith_mult : public vvp_arith_ {
|
||||
|
||||
public:
|
||||
explicit vvp_arith_mult(vvp_ipoint_t b, unsigned wid);
|
||||
|
||||
void set(vvp_ipoint_t i, functor_t f, bool push);
|
||||
|
||||
private: // not implemented
|
||||
vvp_arith_mult(const vvp_arith_mult&);
|
||||
vvp_arith_mult& operator= (const vvp_arith_mult&);
|
||||
};
|
||||
|
||||
class vvp_arith_sum : public vvp_arith_ {
|
||||
|
||||
public:
|
||||
|
|
@ -96,6 +108,11 @@ class vvp_cmp_gt : public vvp_arith_ {
|
|||
};
|
||||
/*
|
||||
* $Log: arith.h,v $
|
||||
* Revision 1.4 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.3 2001/06/15 04:07:58 steve
|
||||
* Add .cmp statements for structural comparison.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.27 2001/05/24 04:20:10 steve Exp $"
|
||||
#ident "$Id: codes.h,v 1.28 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
|
||||
|
|
@ -63,6 +63,7 @@ extern bool of_LOAD(vthread_t thr, vvp_code_t code);
|
|||
extern bool of_LOAD_MEM(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_MOD(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_NOOP(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_NORR(vthread_t thr, vvp_code_t code);
|
||||
extern bool of_OR(vthread_t thr, vvp_code_t code);
|
||||
|
|
@ -128,6 +129,11 @@ extern vvp_code_t codespace_index(vvp_cpoint_t ptr);
|
|||
|
||||
/*
|
||||
* $Log: codes.h,v $
|
||||
* Revision 1.28 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.27 2001/05/24 04:20:10 steve
|
||||
* Add behavioral modulus.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.76 2001/06/15 04:07:58 steve Exp $"
|
||||
#ident "$Id: compile.cc,v 1.77 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "arith.h"
|
||||
|
|
@ -102,6 +102,7 @@ const static struct opcode_table_s opcode_table[] = {
|
|||
{ "%load/m", of_LOAD_MEM,2, {OA_BIT1, OA_MEM_PTR, OA_NONE} },
|
||||
{ "%mod", of_MOD, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
||||
{ "%mov", of_MOV, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
||||
{ "%mul", of_MUL, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
||||
{ "%noop", of_NOOP, 0, {OA_NONE, OA_NONE, OA_NONE} },
|
||||
{ "%nor/r", of_NORR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
||||
{ "%or", of_OR, 3, {OA_BIT1, OA_BIT2, OA_NUMBER} },
|
||||
|
|
@ -433,6 +434,26 @@ static void connect_arith_inputs(vvp_ipoint_t fdx, long wid,
|
|||
free(argv);
|
||||
}
|
||||
|
||||
void compile_arith_mult(char*label, long wid,
|
||||
unsigned argc, struct symb_s*argv)
|
||||
{
|
||||
assert( wid > 0 );
|
||||
|
||||
if (argc != 2*wid) {
|
||||
fprintf(stderr, "%s; .arith has wrong number of symbols\n", label);
|
||||
compile_errors += 1;
|
||||
free(label);
|
||||
return;
|
||||
}
|
||||
|
||||
vvp_ipoint_t fdx = functor_allocate(wid);
|
||||
define_functor_symbol(label, fdx);
|
||||
|
||||
vvp_arith_mult*arith = new vvp_arith_mult(fdx, wid);
|
||||
|
||||
connect_arith_inputs(fdx, wid, arith, argc, argv);
|
||||
}
|
||||
|
||||
void compile_arith_sub(char*label, long wid, unsigned argc, struct symb_s*argv)
|
||||
{
|
||||
assert( wid > 0 );
|
||||
|
|
@ -1380,6 +1401,11 @@ vvp_ipoint_t debug_lookup_functor(const char*name)
|
|||
|
||||
/*
|
||||
* $Log: compile.cc,v $
|
||||
* Revision 1.77 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.76 2001/06/15 04:07:58 steve
|
||||
* Add .cmp statements for structural comparison.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: compile.h,v 1.27 2001/06/15 04:07:58 steve Exp $"
|
||||
#ident "$Id: compile.h,v 1.28 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <stdio.h>
|
||||
|
|
@ -73,6 +73,8 @@ extern void compile_resolver(char*label, char*type,
|
|||
* This is called by the parser to make the various arithmetic and
|
||||
* comparison functors.
|
||||
*/
|
||||
extern void compile_arith_mult(char*label, long width,
|
||||
unsigned argc, struct symb_s*argv);
|
||||
extern void compile_arith_sum(char*label, long width,
|
||||
unsigned argc, struct symb_s*argv);
|
||||
extern void compile_arith_sub(char*label, long width,
|
||||
|
|
@ -196,6 +198,11 @@ extern void compile_net(char*label, char*name,
|
|||
|
||||
/*
|
||||
* $Log: compile.h,v $
|
||||
* Revision 1.28 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.27 2001/06/15 04:07:58 steve
|
||||
* Add .cmp statements for structural comparison.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: lexor.lex,v 1.21 2001/06/15 04:07:58 steve Exp $"
|
||||
#ident "$Id: lexor.lex,v 1.22 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "parse_misc.h"
|
||||
|
|
@ -65,8 +65,9 @@
|
|||
|
||||
|
||||
/* These are some keywords that are recognized. */
|
||||
".arith/sub" { return K_ARITH_SUB; }
|
||||
".arith/sum" { return K_ARITH_SUM; }
|
||||
".arith/mult" { return K_ARITH_MULT; }
|
||||
".arith/sub" { return K_ARITH_SUB; }
|
||||
".arith/sum" { return K_ARITH_SUM; }
|
||||
".cmp/ge" { return K_CMP_GE; }
|
||||
".cmp/gt" { return K_CMP_GT; }
|
||||
".event" { return K_EVENT; }
|
||||
|
|
@ -144,6 +145,11 @@ int yywrap()
|
|||
|
||||
/*
|
||||
* $Log: lexor.lex,v $
|
||||
* Revision 1.22 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.21 2001/06/15 04:07:58 steve
|
||||
* Add .cmp statements for structural comparison.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2001 Stephen Williams (steve@icarus.com)
|
||||
*
|
||||
* $Id: opcodes.txt,v 1.22 2001/05/24 04:20:10 steve Exp $
|
||||
* $Id: opcodes.txt,v 1.23 2001/06/16 23:45:05 steve Exp $
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -244,6 +244,14 @@ is one of the 4 constant bits, the effect is to replicate the value
|
|||
into the destination vector. This is useful for filling a vector.
|
||||
|
||||
|
||||
* %mul <bit-l>, <bit-r>, <wid>
|
||||
|
||||
This instruction multiplies the left vector by the right vector, the
|
||||
vectors having the width <wid>. If any of the bits of either vector
|
||||
are x or z, the result is x. Otherwise, the result is the arithmetic
|
||||
product.
|
||||
|
||||
|
||||
* %nor/r <dst>, <src>, <wid>
|
||||
|
||||
The %nor/r instruction is a reduction nor. That is, the <src> is a
|
||||
|
|
|
|||
14
vvp/parse.y
14
vvp/parse.y
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT)
|
||||
#ident "$Id: parse.y,v 1.31 2001/06/15 04:07:58 steve Exp $"
|
||||
#ident "$Id: parse.y,v 1.32 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "parse_misc.h"
|
||||
|
|
@ -54,7 +54,7 @@ extern FILE*yyin;
|
|||
};
|
||||
|
||||
|
||||
%token K_ARITH_SUB K_ARITH_SUM K_CMP_GE K_CMP_GT
|
||||
%token K_ARITH_MULT K_ARITH_SUB K_ARITH_SUM K_CMP_GE K_CMP_GT
|
||||
%token K_EVENT K_EVENT_OR K_FUNCTOR K_NET K_NET_S
|
||||
%token K_RESOLV K_SCOPE K_THREAD
|
||||
%token K_UDP K_UDP_C K_UDP_S
|
||||
|
|
@ -157,6 +157,11 @@ statement
|
|||
/* Arithmetic statements generate functor arrays of a given width
|
||||
that take like size input vectors. */
|
||||
|
||||
| T_LABEL K_ARITH_MULT T_NUMBER ',' symbols ';'
|
||||
{ struct symbv_s obj = $5;
|
||||
compile_arith_mult($1, $3, obj.cnt, obj.vect);
|
||||
}
|
||||
|
||||
| T_LABEL K_ARITH_SUB T_NUMBER ',' symbols ';'
|
||||
{ struct symbv_s obj = $5;
|
||||
compile_arith_sub($1, $3, obj.cnt, obj.vect);
|
||||
|
|
@ -469,6 +474,11 @@ int compile_design(const char*path)
|
|||
|
||||
/*
|
||||
* $Log: parse.y,v $
|
||||
* Revision 1.32 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.31 2001/06/15 04:07:58 steve
|
||||
* Add .cmp statements for structural comparison.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.42 2001/05/30 03:02:35 steve Exp $"
|
||||
#ident "$Id: vthread.cc,v 1.43 2001/06/16 23:45:05 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vthread.h"
|
||||
|
|
@ -820,6 +820,46 @@ bool of_MOV(vthread_t thr, vvp_code_t cp)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool of_MUL(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
assert(cp->bit_idx1 >= 4);
|
||||
assert(cp->number <= 8*sizeof(unsigned long));
|
||||
|
||||
unsigned idx1 = cp->bit_idx1;
|
||||
unsigned idx2 = cp->bit_idx2;
|
||||
unsigned long lv = 0, rv = 0;
|
||||
|
||||
for (unsigned idx = 0 ; idx < cp->number ; idx += 1) {
|
||||
unsigned lb = thr_get_bit(thr, idx1);
|
||||
unsigned rb = thr_get_bit(thr, idx2);
|
||||
|
||||
if ((lb | rb) & 2)
|
||||
goto x_out;
|
||||
|
||||
lv |= lb << idx;
|
||||
rv |= rb << idx;
|
||||
|
||||
idx1 += 1;
|
||||
if (idx2 >= 4)
|
||||
idx2 += 1;
|
||||
}
|
||||
|
||||
lv *= rv;
|
||||
|
||||
for (unsigned idx = 0 ; idx < cp->number ; idx += 1) {
|
||||
thr_put_bit(thr, cp->bit_idx1+idx, (lv&1) ? 1 : 0);
|
||||
lv >>= 1;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
x_out:
|
||||
for (unsigned idx = 0 ; idx < cp->number ; idx += 1)
|
||||
thr_put_bit(thr, cp->bit_idx1+idx, 2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool of_NOOP(vthread_t thr, vvp_code_t cp)
|
||||
{
|
||||
return true;
|
||||
|
|
@ -1047,6 +1087,11 @@ bool of_ZOMBIE(vthread_t thr, vvp_code_t)
|
|||
|
||||
/*
|
||||
* $Log: vthread.cc,v $
|
||||
* Revision 1.43 2001/06/16 23:45:05 steve
|
||||
* Add support for structural multiply in t-dll.
|
||||
* Add code generators and vvp support for both
|
||||
* structural and behavioral multiply.
|
||||
*
|
||||
* Revision 1.42 2001/05/30 03:02:35 steve
|
||||
* Propagate strength-values instead of drive strengths.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue