From 93463b6ff5d85e7ee4f8e87ece54bdf85a7a6653 Mon Sep 17 00:00:00 2001 From: steve Date: Tue, 13 Feb 2001 03:38:55 +0000 Subject: [PATCH] Binary or and nor resilient to bit widths. --- vvm/vvm_func.cc | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/vvm/vvm_func.cc b/vvm/vvm_func.cc index d75d52518..8563aff82 100644 --- a/vvm/vvm_func.cc +++ b/vvm/vvm_func.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: vvm_func.cc,v 1.15 2001/02/10 01:57:18 steve Exp $" +#ident "$Id: vvm_func.cc,v 1.16 2001/02/13 03:38:55 steve Exp $" #endif # include "vvm_func.h" @@ -122,18 +122,28 @@ void vvm_binop_minus(vvm_bitset_t&v, const vvm_bitset_t&l, void vvm_binop_nor(vvm_bitset_t&v, const vvm_bitset_t&l, const vvm_bitset_t&r) { - assert(v.nbits <= l.nbits); - assert(v.nbits <= r.nbits); - for (unsigned idx = 0 ; idx < v.nbits ; idx += 1) + unsigned min = v.nbits; + if (r.nbits < min) min = r.nbits; + if (l.nbits < min) min = l.nbits; + + for (unsigned idx = 0 ; idx < min ; idx += 1) v[idx] = B_NOT(B_OR(l[idx], r[idx])); + + for (unsigned idx = min ; idx < v.nbits ; idx += 1) + v[idx] = B_NOT(r.nbits > min? r[idx] : l[idx]); } void vvm_binop_or(vvm_bitset_t&v, const vvm_bitset_t&l, const vvm_bitset_t&r) { - assert(v.nbits <= l.nbits); - assert(v.nbits <= r.nbits); - for (unsigned idx = 0 ; idx < v.nbits ; idx += 1) + unsigned min = v.nbits; + if (r.nbits < min) min = r.nbits; + if (l.nbits < min) min = l.nbits; + + for (unsigned idx = 0 ; idx < min ; idx += 1) v[idx] = B_OR(l[idx], r[idx]); + + for (unsigned idx = min ; idx < v.nbits ; idx += 1) + v[idx] = r.nbits > min? r[idx] : l[idx]; } /* @@ -629,6 +639,9 @@ void vvm_ternary(vvm_bitset_t&v, vpip_bit_t c, /* * $Log: vvm_func.cc,v $ + * Revision 1.16 2001/02/13 03:38:55 steve + * Binary or and nor resilient to bit widths. + * * Revision 1.15 2001/02/10 01:57:18 steve * Make the add func resilient to bit widths (PR#141) *