Get .arith/sub working.
This commit is contained in:
parent
e6cdd32c19
commit
84b3e8e2dc
15
vvp/arith.cc
15
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
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: arith.cc,v 1.36 2005/01/28 05:34:25 steve Exp $"
|
#ident "$Id: arith.cc,v 1.37 2005/01/30 05:06:49 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "arith.h"
|
# include "arith.h"
|
||||||
|
|
@ -361,10 +361,10 @@ vvp_arith_sub::~vvp_arith_sub()
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Subtraction works by adding the 2s complement of the B, C and D
|
* Subtraction works by adding the 2s complement of the B input from
|
||||||
* inputs from the A input. The 2s complement is the 1s complement
|
* the A input. The 2s complement is the 1s complement plus one, so we
|
||||||
* plus one, so we further reduce the operation to adding in the
|
* further reduce the operation to adding in the inverted value and
|
||||||
* inverted value and adding a correction.
|
* adding a correction.
|
||||||
*/
|
*/
|
||||||
void vvp_arith_sub::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit)
|
void vvp_arith_sub::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit)
|
||||||
{
|
{
|
||||||
|
|
@ -381,7 +381,7 @@ void vvp_arith_sub::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit)
|
||||||
vvp_bit4_t carry = BIT4_1;
|
vvp_bit4_t carry = BIT4_1;
|
||||||
for (unsigned idx = 0 ; idx < wid_ ; idx += 1) {
|
for (unsigned idx = 0 ; idx < wid_ ; idx += 1) {
|
||||||
vvp_bit4_t a = (idx >= op_a_.size())? pad : op_a_.value(idx);
|
vvp_bit4_t a = (idx >= op_a_.size())? pad : op_a_.value(idx);
|
||||||
vvp_bit4_t b = (idx >= op_b_.size())? pad : op_b_.value(idx);
|
vvp_bit4_t b = (idx >= op_b_.size())? pad : ~op_b_.value(idx);
|
||||||
vvp_bit4_t cur = add_with_carry(a, b, carry);
|
vvp_bit4_t cur = add_with_carry(a, b, carry);
|
||||||
|
|
||||||
if (cur == BIT4_X) {
|
if (cur == BIT4_X) {
|
||||||
|
|
@ -652,6 +652,9 @@ void vvp_shiftr::set(vvp_ipoint_t i, bool push, unsigned val, unsigned)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: arith.cc,v $
|
* $Log: arith.cc,v $
|
||||||
|
* Revision 1.37 2005/01/30 05:06:49 steve
|
||||||
|
* Get .arith/sub working.
|
||||||
|
*
|
||||||
* Revision 1.36 2005/01/28 05:34:25 steve
|
* Revision 1.36 2005/01/28 05:34:25 steve
|
||||||
* Add vector4 implementation of .arith/mult.
|
* Add vector4 implementation of .arith/mult.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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: compile.cc,v 1.184 2005/01/29 17:53:25 steve Exp $"
|
#ident "$Id: compile.cc,v 1.185 2005/01/30 05:06:49 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "arith.h"
|
# include "arith.h"
|
||||||
|
|
@ -885,21 +885,13 @@ void compile_arith_sub(char*label, long wid, unsigned argc, struct symb_s*argv)
|
||||||
{
|
{
|
||||||
assert( wid > 0 );
|
assert( wid > 0 );
|
||||||
|
|
||||||
if ((argc % wid) != 0) {
|
if (argc != 2) {
|
||||||
fprintf(stderr, "%s; .arith has wrong number of symbols\n", label);
|
fprintf(stderr, "%s .arith has wrong number of symbols\n", label);
|
||||||
compile_errors += 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned opcount = argc / wid;
|
|
||||||
if (opcount > 4) {
|
|
||||||
fprintf(stderr, "%s; .arith has too many operands.\n", label);
|
|
||||||
compile_errors += 1;
|
compile_errors += 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vvp_arith_ *arith = new vvp_arith_sub(wid);
|
vvp_arith_ *arith = new vvp_arith_sub(wid);
|
||||||
|
|
||||||
make_arith(arith, label, wid, argc, argv);
|
make_arith(arith, label, wid, argc, argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1585,6 +1577,9 @@ void compile_param_string(char*label, char*name, char*str, char*value)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.cc,v $
|
* $Log: compile.cc,v $
|
||||||
|
* Revision 1.185 2005/01/30 05:06:49 steve
|
||||||
|
* Get .arith/sub working.
|
||||||
|
*
|
||||||
* Revision 1.184 2005/01/29 17:53:25 steve
|
* Revision 1.184 2005/01/29 17:53:25 steve
|
||||||
* Use scheduler to initialize constant functor inputs.
|
* Use scheduler to initialize constant functor inputs.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#ident "$Id: vvp_net.cc,v 1.10 2005/01/29 17:52:06 steve Exp $"
|
#ident "$Id: vvp_net.cc,v 1.11 2005/01/30 05:06:49 steve Exp $"
|
||||||
|
|
||||||
# include "vvp_net.h"
|
# include "vvp_net.h"
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
|
|
@ -72,6 +72,18 @@ vvp_bit4_t operator & (vvp_bit4_t a, vvp_bit4_t b)
|
||||||
return BIT4_1;
|
return BIT4_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vvp_bit4_t operator ~ (vvp_bit4_t a)
|
||||||
|
{
|
||||||
|
switch (a) {
|
||||||
|
case BIT4_0:
|
||||||
|
return BIT4_1;
|
||||||
|
case BIT4_1:
|
||||||
|
return BIT4_0;
|
||||||
|
default:
|
||||||
|
return BIT4_X;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vvp_send_vec4(vvp_net_ptr_t ptr, vvp_vector4_t val)
|
void vvp_send_vec4(vvp_net_ptr_t ptr, vvp_vector4_t val)
|
||||||
{
|
{
|
||||||
while (struct vvp_net_t*cur = ptr.ptr()) {
|
while (struct vvp_net_t*cur = ptr.ptr()) {
|
||||||
|
|
@ -852,6 +864,9 @@ vvp_bit4_t compare_gtge_signed(const vvp_vector4_t&a,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vvp_net.cc,v $
|
* $Log: vvp_net.cc,v $
|
||||||
|
* Revision 1.11 2005/01/30 05:06:49 steve
|
||||||
|
* Get .arith/sub working.
|
||||||
|
*
|
||||||
* Revision 1.10 2005/01/29 17:52:06 steve
|
* Revision 1.10 2005/01/29 17:52:06 steve
|
||||||
* move AND to buitin instead of table.
|
* move AND to buitin instead of table.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#ident "$Id: vvp_net.h,v 1.10 2005/01/29 17:52:06 steve Exp $"
|
#ident "$Id: vvp_net.h,v 1.11 2005/01/30 05:06:49 steve Exp $"
|
||||||
|
|
||||||
# include <assert.h>
|
# include <assert.h>
|
||||||
|
|
||||||
|
|
@ -52,7 +52,9 @@ enum vvp_bit4_t {
|
||||||
extern vvp_bit4_t add_with_carry(vvp_bit4_t a, vvp_bit4_t b, vvp_bit4_t&c);
|
extern vvp_bit4_t add_with_carry(vvp_bit4_t a, vvp_bit4_t b, vvp_bit4_t&c);
|
||||||
/* Return TRUE if the bit is BIT4_X or BIT4_Z */
|
/* Return TRUE if the bit is BIT4_X or BIT4_Z */
|
||||||
extern bool bit4_is_xz(vvp_bit4_t a);
|
extern bool bit4_is_xz(vvp_bit4_t a);
|
||||||
/* Some common boolean operators */
|
/* Some common boolean operators. These implement the Verilog rules
|
||||||
|
for 4-value bit operations. */
|
||||||
|
extern vvp_bit4_t operator ~ (vvp_bit4_t a);
|
||||||
extern vvp_bit4_t operator & (vvp_bit4_t a, vvp_bit4_t b);
|
extern vvp_bit4_t operator & (vvp_bit4_t a, vvp_bit4_t b);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -507,6 +509,9 @@ class vvp_fun_signal : public vvp_net_fun_t {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vvp_net.h,v $
|
* $Log: vvp_net.h,v $
|
||||||
|
* Revision 1.11 2005/01/30 05:06:49 steve
|
||||||
|
* Get .arith/sub working.
|
||||||
|
*
|
||||||
* Revision 1.10 2005/01/29 17:52:06 steve
|
* Revision 1.10 2005/01/29 17:52:06 steve
|
||||||
* move AND to buitin instead of table.
|
* move AND to buitin instead of table.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue