diff --git a/vvp/arith.cc b/vvp/arith.cc index 5548d360e..ad26a3e6a 100644 --- a/vvp/arith.cc +++ b/vvp/arith.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: arith.cc,v 1.28 2004/06/30 02:15:57 steve Exp $" +#ident "$Id: arith.cc,v 1.29 2004/09/22 16:44:07 steve Exp $" #endif # include "arith.h" @@ -472,58 +472,22 @@ void vvp_cmp_ne::set(vvp_ipoint_t i, bool push, unsigned val, unsigned) } -vvp_cmp_ge::vvp_cmp_ge(unsigned wid, bool flag) +vvp_cmp_gtge_base_::vvp_cmp_gtge_base_(unsigned wid, bool flag) : vvp_arith_(wid), signed_flag_(flag) { } - -void vvp_cmp_ge::set(vvp_ipoint_t i, bool push, unsigned val, unsigned) +void vvp_cmp_gtge_base_::set_base(vvp_ipoint_t i, + bool push, + unsigned val, + unsigned, + unsigned out_if_equal) { put(i, val); vvp_ipoint_t base = ipoint_make(i,0); - unsigned out_val = 1; - - for (unsigned idx = wid_ ; idx > 0 ; idx -= 1) { - vvp_ipoint_t ptr = ipoint_index(base,idx-1); - functor_t obj = functor_index(ptr); - - unsigned val = obj->ival; - if (val & 0x0a) { - out_val = 2; - break; - } - - unsigned a = (val & 0x01)? 1 : 0; - unsigned b = (val & 0x04)? 1 : 0; - - if (a > b) { - out_val = 1; - break; - } - - if (a < b) { - out_val = 0; - break; - } - } - - put_oval(out_val, push); -} - -vvp_cmp_gt::vvp_cmp_gt(unsigned wid, bool flag) -: vvp_arith_(wid), signed_flag_(flag) -{ -} - -void vvp_cmp_gt::set(vvp_ipoint_t i, bool push, unsigned val, unsigned) -{ - put(i, val); - vvp_ipoint_t base = ipoint_make(i,0); - - unsigned out_val = 0; + unsigned out_val = out_if_equal; unsigned idx = wid_; @@ -599,6 +563,29 @@ void vvp_cmp_gt::set(vvp_ipoint_t i, bool push, unsigned val, unsigned) } + +vvp_cmp_ge::vvp_cmp_ge(unsigned wid, bool flag) +: vvp_cmp_gtge_base_(wid, flag) +{ +} + + + +void vvp_cmp_ge::set(vvp_ipoint_t i, bool push, unsigned val, unsigned str) +{ + set_base(i, push, val, str, 1); +} + +vvp_cmp_gt::vvp_cmp_gt(unsigned wid, bool flag) +: vvp_cmp_gtge_base_(wid, flag) +{ +} + +void vvp_cmp_gt::set(vvp_ipoint_t i, bool push, unsigned val, unsigned str) +{ + set_base(i, push, val, str, 0); +} + void vvp_shiftl::set(vvp_ipoint_t i, bool push, unsigned val, unsigned) { put(i, val); @@ -700,6 +687,9 @@ void vvp_shiftr::set(vvp_ipoint_t i, bool push, unsigned val, unsigned) /* * $Log: arith.cc,v $ + * Revision 1.29 2004/09/22 16:44:07 steve + * Fix LPM GE to match LPM GT behavior. + * * Revision 1.28 2004/06/30 02:15:57 steve * Add signed LPM divide. * diff --git a/vvp/arith.h b/vvp/arith.h index 46480e06c..7ce2bc072 100644 --- a/vvp/arith.h +++ b/vvp/arith.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: arith.h,v 1.17 2004/06/30 02:15:57 steve Exp $" +#ident "$Id: arith.h,v 1.18 2004/09/22 16:44:07 steve Exp $" #endif # include "functor.h" @@ -121,24 +121,34 @@ class vvp_cmp_ne : public vvp_arith_ { }; -class vvp_cmp_ge : public vvp_arith_ { +class vvp_cmp_gtge_base_ : public vvp_arith_ { + + public: + explicit vvp_cmp_gtge_base_(unsigned wid, bool signed_flag); + + protected: + void set_base(vvp_ipoint_t i, bool push, unsigned val, unsigned str, + unsigned out_if_equal); + private: + bool signed_flag_; +}; + +class vvp_cmp_ge : public vvp_cmp_gtge_base_ { public: explicit vvp_cmp_ge(unsigned wid, bool signed_flag); void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str); private: - bool signed_flag_; }; -class vvp_cmp_gt : public vvp_arith_ { +class vvp_cmp_gt : public vvp_cmp_gtge_base_ { public: explicit vvp_cmp_gt(unsigned wid, bool signed_flag); void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str); private: - bool signed_flag_; }; class vvp_shiftl : public vvp_arith_ { @@ -159,6 +169,9 @@ class vvp_shiftr : public vvp_arith_ { /* * $Log: arith.h,v $ + * Revision 1.18 2004/09/22 16:44:07 steve + * Fix LPM GE to match LPM GT behavior. + * * Revision 1.17 2004/06/30 02:15:57 steve * Add signed LPM divide. *