diff --git a/PWire.cc b/PWire.cc index 13f41c9e7..7faa13207 100644 --- a/PWire.cc +++ b/PWire.cc @@ -17,14 +17,14 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: PWire.cc,v 1.3 2000/02/23 02:56:54 steve Exp $" +#ident "$Id: PWire.cc,v 1.4 2000/12/11 00:31:43 steve Exp $" #endif # include "PWire.h" # include PWire::PWire(const string&n, NetNet::Type t, NetNet::PortType pt) -: name_(n), type_(t), port_type_(pt), lidx_(0), ridx_(0) +: name_(n), type_(t), port_type_(pt), signed_(false), lidx_(0), ridx_(0) { } @@ -83,6 +83,16 @@ bool PWire::set_port_type(NetNet::PortType pt) } } +void PWire::set_signed(bool flag) +{ + signed_ = flag; +} + +bool PWire::get_signed() const +{ + return signed_; +} + void PWire::set_range(PExpr*m, PExpr*l) { msb_ = svector(msb_,m); @@ -100,6 +110,10 @@ void PWire::set_memory_idx(PExpr*ldx, PExpr*rdx) /* * $Log: PWire.cc,v $ + * Revision 1.4 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.3 2000/02/23 02:56:54 steve * Macintosh compilers do not support ident. * diff --git a/PWire.h b/PWire.h index d268e397e..d307a66a7 100644 --- a/PWire.h +++ b/PWire.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: PWire.h,v 1.8 2000/05/02 16:27:38 steve Exp $" +#ident "$Id: PWire.h,v 1.9 2000/12/11 00:31:43 steve Exp $" #endif # include "netlist.h" @@ -49,6 +49,9 @@ class PWire : public LineInfo { NetNet::PortType get_port_type() const; bool set_port_type(NetNet::PortType); + void set_signed(bool flag); + bool get_signed() const; + void set_range(PExpr*msb, PExpr*lsb); void set_memory_idx(PExpr*ldx, PExpr*rdx); @@ -64,6 +67,7 @@ class PWire : public LineInfo { string name_; NetNet::Type type_; NetNet::PortType port_type_; + bool signed_; // These members hold expressions for the bit width of the // wire. If they do not exist, the wire is 1 bit wide. @@ -82,6 +86,10 @@ class PWire : public LineInfo { /* * $Log: PWire.h,v $ + * Revision 1.9 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.8 2000/05/02 16:27:38 steve * Move signal elaboration to a seperate pass. * diff --git a/design_dump.cc b/design_dump.cc index 52c98f588..e6c908e17 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: design_dump.cc,v 1.106 2000/12/10 06:41:59 steve Exp $" +#ident "$Id: design_dump.cc,v 1.107 2000/12/11 00:31:43 steve Exp $" #endif /* @@ -73,6 +73,8 @@ void NetNet::dump_net(ostream&o, unsigned ind) const pin_count() << "]"; if (local_flag_) o << " (local)"; + if (signed_) + o << " signed"; o << " (eref=" << get_eref() << ")"; if (scope()) o << " scope=" << scope()->name(); @@ -996,6 +998,10 @@ void Design::dump(ostream&o) const /* * $Log: design_dump.cc,v $ + * Revision 1.107 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.106 2000/12/10 06:41:59 steve * Support delays on continuous assignment from idents. (PR#40) * diff --git a/elab_sig.cc b/elab_sig.cc index 98c118169..789748e3d 100644 --- a/elab_sig.cc +++ b/elab_sig.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: elab_sig.cc,v 1.6 2000/12/04 17:37:04 steve Exp $" +#ident "$Id: elab_sig.cc,v 1.7 2000/12/11 00:31:43 steve Exp $" #endif # include "Module.h" @@ -341,12 +341,17 @@ void PWire::elaborate_sig(Design*des, NetScope*scope) const NetNet*sig = new NetNet(scope, path + "." +basename, wtype, msb, lsb); sig->set_line(*this); sig->port_type(port_type_); + sig->set_signed(get_signed()); sig->set_attributes(attributes); } } /* * $Log: elab_sig.cc,v $ + * Revision 1.7 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.6 2000/12/04 17:37:04 steve * Add Attrib class for holding NetObj attributes. * diff --git a/netlist.cc b/netlist.cc index 5daf62c45..454f248f2 100644 --- a/netlist.cc +++ b/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.150 2000/12/05 06:29:33 steve Exp $" +#ident "$Id: netlist.cc,v 1.151 2000/12/11 00:31:43 steve Exp $" #endif # include @@ -303,7 +303,7 @@ NetNode* NetNode::next_node() NetNet::NetNet(NetScope*s, const string&n, Type t, unsigned npins) : NetObj(s, n, npins), sig_next_(0), sig_prev_(0), - type_(t), port_type_(NOT_A_PORT), msb_(npins-1), lsb_(0), + type_(t), port_type_(NOT_A_PORT), signed_(false), msb_(npins-1), lsb_(0), local_flag_(false), eref_count_(0) { assert(s); @@ -336,8 +336,8 @@ NetNet::NetNet(NetScope*s, const string&n, Type t, unsigned npins) NetNet::NetNet(NetScope*s, const string&n, Type t, long ms, long ls) : NetObj(s, n, ((ms>ls)?ms-ls:ls-ms) + 1), sig_next_(0), sig_prev_(0), type_(t), - port_type_(NOT_A_PORT), msb_(ms), lsb_(ls), local_flag_(false), - eref_count_(0) + port_type_(NOT_A_PORT), signed_(false), msb_(ms), lsb_(ls), + local_flag_(false), eref_count_(0) { assert(s); @@ -394,6 +394,16 @@ void NetNet::port_type(NetNet::PortType t) port_type_ = t; } +bool NetNet::get_signed() const +{ + return signed_; +} + +void NetNet::set_signed(bool flag) +{ + signed_ = flag; +} + long NetNet::lsb() const { return lsb_; @@ -2163,6 +2173,11 @@ string NetESignal::name() const return net_->name(); } +bool NetESignal::has_sign() const +{ + return net_->get_signed(); +} + unsigned NetESignal::pin_count() const { return net_->pin_count(); @@ -2465,6 +2480,10 @@ bool NetUDP::sequ_glob_(string input, char output) /* * $Log: netlist.cc,v $ + * Revision 1.151 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.150 2000/12/05 06:29:33 steve * Make signal attributes available to ivl_target API. * diff --git a/netlist.h b/netlist.h index 8d3fb5c2d..5f79fcc90 100644 --- a/netlist.h +++ b/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.185 2000/12/05 06:29:33 steve Exp $" +#ident "$Id: netlist.h,v 1.186 2000/12/11 00:31:43 steve Exp $" #endif /* @@ -334,6 +334,11 @@ class NetNet : public NetObj, public LineInfo { PortType port_type() const; void port_type(PortType t); + /* If a NetNet is signed, then its value is to be treated as + signed. Otherwise, it is unsigned. */ + bool get_signed() const; + void set_signed(bool); + /* These methods return the msb and lsb indices for the most significant and least significant bits. These are signed longs, and may be different from pin numbers. For example, @@ -366,6 +371,7 @@ class NetNet : public NetObj, public LineInfo { private: Type type_; PortType port_type_; + bool signed_; long msb_, lsb_; @@ -2477,6 +2483,10 @@ class NetESignal : public NetExpr { NetESignal(NetNet*n); ~NetESignal(); + // a NetESignal expression is signed if the NetNet that it + // refers to is signed. + bool has_sign() const; + string name() const; virtual bool set_width(unsigned); @@ -2825,6 +2835,10 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.186 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.185 2000/12/05 06:29:33 steve * Make signal attributes available to ivl_target API. * diff --git a/parse.y b/parse.y index 972a3df9c..4da7d41e7 100644 --- a/parse.y +++ b/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: parse.y,v 1.112 2000/12/10 22:01:36 steve Exp $" +#ident "$Id: parse.y,v 1.113 2000/12/11 00:31:43 steve Exp $" #endif # include "parse_misc.h" @@ -195,13 +195,12 @@ source_file rule has presumably set up the scope. */ block_item_decl : K_reg range register_variable_list ';' - { pform_set_net_range($3, $2); + { pform_set_net_range($3, $2, false); } | K_reg register_variable_list ';' { delete $2; } | K_reg K_signed range register_variable_list ';' - { pform_set_net_range($4, $3); - yyerror(@2, "sorry: signed reg not supported."); + { pform_set_net_range($4, $3, true); } | K_reg K_signed register_variable_list ';' { delete $3; diff --git a/pform.cc b/pform.cc index 78b0e0940..6cf5953e0 100644 --- a/pform.cc +++ b/pform.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: pform.cc,v 1.67 2000/11/30 17:31:42 steve Exp $" +#ident "$Id: pform.cc,v 1.68 2000/12/11 00:31:43 steve Exp $" #endif # include "compiler.h" @@ -328,7 +328,9 @@ void pform_make_udp(const char*name, list*parms, * only called by the parser within the scope of the net declaration, * and the name that I receive only has the tail component. */ -static void pform_set_net_range(const char*name, const svector*range) +static void pform_set_net_range(const char*name, + const svector*range, + bool signed_flag) { assert(range); assert(range->count() == 2); @@ -342,9 +344,12 @@ static void pform_set_net_range(const char*name, const svector*range) assert((*range)[0]); assert((*range)[1]); cur->set_range((*range)[0], (*range)[1]); + cur->set_signed(signed_flag); } -void pform_set_net_range(list*names, svector*range) +void pform_set_net_range(list*names, + svector*range, + bool signed_flag) { assert(range->count() == 2); @@ -352,7 +357,7 @@ void pform_set_net_range(list*names, svector*range) ; cur != names->end() ; cur ++ ) { char*txt = *cur; - pform_set_net_range(txt, range); + pform_set_net_range(txt, range, signed_flag); free(txt); } @@ -676,7 +681,7 @@ void pform_makewire(const vlltype&li, char*txt = *cur; pform_makewire(li, txt, type); if (range) - pform_set_net_range(txt, range); + pform_set_net_range(txt, range, false); free(txt); } @@ -878,7 +883,7 @@ void pform_set_port_type(list*names, char*txt = *cur; pform_set_port_type(txt, pt); if (range) - pform_set_net_range(txt, range); + pform_set_net_range(txt, range, false); free(txt); } @@ -902,6 +907,7 @@ static void pform_set_reg_integer(const char*nm) cur->set_range(new PENumber(new verinum(INTEGER_WIDTH-1, INTEGER_WIDTH)), new PENumber(new verinum(0UL, INTEGER_WIDTH))); + cur->set_signed(true); } void pform_set_reg_integer(list*names) @@ -1002,6 +1008,10 @@ int pform_parse(const char*path, map&modules, /* * $Log: pform.cc,v $ + * Revision 1.68 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.67 2000/11/30 17:31:42 steve * Change LineInfo to store const C strings. * diff --git a/pform.h b/pform.h index 2e5f248de..4df816619 100644 --- a/pform.h +++ b/pform.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: pform.h,v 1.44 2000/11/30 17:31:42 steve Exp $" +#ident "$Id: pform.h,v 1.45 2000/12/11 00:31:43 steve Exp $" #endif # include "netlist.h" @@ -137,7 +137,7 @@ extern void pform_make_reginit(const struct vlltype&li, const string&name, PExpr*expr); extern void pform_set_port_type(list*names, svector*, NetNet::PortType); -extern void pform_set_net_range(list*names, svector*); +extern void pform_set_net_range(list*names, svector*, bool); extern void pform_set_reg_idx(const string&name, PExpr*l, PExpr*r); extern void pform_set_reg_integer(list*names); extern void pform_set_reg_time(list*names); @@ -202,6 +202,10 @@ extern void pform_dump(ostream&out, Module*mod); /* * $Log: pform.h,v $ + * Revision 1.45 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.44 2000/11/30 17:31:42 steve * Change LineInfo to store const C strings. * diff --git a/pform_dump.cc b/pform_dump.cc index 821313308..00d2bd9ea 100644 --- a/pform_dump.cc +++ b/pform_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: pform_dump.cc,v 1.64 2000/12/10 22:01:36 steve Exp $" +#ident "$Id: pform_dump.cc,v 1.65 2000/12/11 00:31:43 steve Exp $" #endif /* @@ -219,6 +219,10 @@ void PWire::dump(ostream&out) const break; } + if (signed_) { + out << " signed"; + } + assert(msb_.count() == lsb_.count()); for (unsigned idx = 0 ; idx < msb_.count() ; idx += 1) { assert(msb_[idx]); @@ -806,6 +810,10 @@ void PUdp::dump(ostream&out) const /* * $Log: pform_dump.cc,v $ + * Revision 1.65 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.64 2000/12/10 22:01:36 steve * Support decimal constants in behavioral delays. * diff --git a/t-vvm.cc b/t-vvm.cc index 0ca2809a7..68953639b 100644 --- a/t-vvm.cc +++ b/t-vvm.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-vvm.cc,v 1.188 2000/12/10 06:41:59 steve Exp $" +#ident "$Id: t-vvm.cc,v 1.189 2000/12/11 00:31:43 steve Exp $" #endif # include @@ -706,16 +706,26 @@ void vvm_proc_rval::expr_binary(const NetEBinary*expr) << lres << "," << rres << ");" << endl; break; case 'G': // >= - tgt_->defn << " " << result << "[0] = vvm_binop_ge(" - << lres << "," << rres << ");" << endl; + if (expr->left()->has_sign() && expr->right()->has_sign()) { + tgt_->defn << " " << result << "[0] = vvm_binop_ge_s(" + << lres << "," << rres << ");" << endl; + } else { + tgt_->defn << " " << result << "[0] = vvm_binop_ge(" + << lres << "," << rres << ");" << endl; + } break; case 'l': // left shift(<<) tgt_->defn << " " << "vvm_binop_shiftl(" << result << ", " << lres << "," << rres << ");" << endl; break; case 'L': // <= - tgt_->defn << " " << result << "[0] = vvm_binop_le(" - << lres << "," << rres << ");" << endl; + if (expr->left()->has_sign() && expr->right()->has_sign()) { + tgt_->defn << " " << result << "[0] = vvm_binop_le_s(" + << lres << "," << rres << ");" << endl; + } else { + tgt_->defn << " " << result << "[0] = vvm_binop_le(" + << lres << "," << rres << ");" << endl; + } break; case 'N': // !== tgt_->defn << " " << result << "[0] = vvm_binop_nee(" @@ -726,12 +736,22 @@ void vvm_proc_rval::expr_binary(const NetEBinary*expr) << lres << "," << rres << ");" << endl; break; case '<': - tgt_->defn << " " << result << "[0] = vvm_binop_lt(" - << lres << "," << rres << ");" << endl; + if (expr->left()->has_sign() && expr->right()->has_sign()) { + tgt_->defn << " " << result << "[0] = vvm_binop_lt_s(" + << lres << "," << rres << ");" << endl; + } else { + tgt_->defn << " " << result << "[0] = vvm_binop_lt(" + << lres << "," << rres << ");" << endl; + } break; case '>': - tgt_->defn << " " << result << "[0] = vvm_binop_gt(" - << lres << "," << rres << ");" << endl; + if (expr->left()->has_sign() && expr->right()->has_sign()) { + tgt_->defn << " " << result << "[0] = vvm_binop_gt_s(" + << lres << "," << rres << ");" << endl; + } else { + tgt_->defn << " " << result << "[0] = vvm_binop_gt(" + << lres << "," << rres << ");" << endl; + } break; case 'o': // logical or (||) tgt_->defn << " " << result << "[0] = vvm_binop_lor(" @@ -3370,6 +3390,10 @@ extern const struct target tgt_vvm = { }; /* * $Log: t-vvm.cc,v $ + * Revision 1.189 2000/12/11 00:31:43 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.188 2000/12/10 06:41:59 steve * Support delays on continuous assignment from idents. (PR#40) * diff --git a/vvm/vvm_func.cc b/vvm/vvm_func.cc index 721f5bdac..7bd46d146 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.12 2000/07/06 18:12:28 steve Exp $" +#ident "$Id: vvm_func.cc,v 1.13 2000/12/11 00:31:44 steve Exp $" #endif # include "vvm_func.h" @@ -385,6 +385,34 @@ vpip_bit_t vvm_binop_lt(const vvm_bitset_t&l, const vvm_bitset_t&r) return result; } +/* + * This is the < operator that applies to signed operands. + */ +vpip_bit_t vvm_binop_lt_s(const vvm_bitset_t&l, const vvm_bitset_t&r) +{ + vpip_bit_t l_pad = l.get_bit(l.get_width()-1); + vpip_bit_t r_pad = r.get_bit(r.get_width()-1); + + /* If l>=0 and r>=0, return $unsigned(l) < $unsigned(r) */ + if (B_IS0(l_pad) && B_IS0(r_pad)) + return vvm_binop_lt(l, r); + + /* If l < 0 and r < 0, return $unsigned(r) < $unsigned(l) */ + if (B_IS1(l_pad) && B_IS1(r_pad)) + return vvm_binop_lt(r, l); + + /* If l >= 0 and r < 0, return false; */ + if (B_IS0(l_pad) && B_IS1(r_pad)) + return St0; + + /* if l < 0 and r >= 0, return true; */ + if (B_IS1(l_pad) && B_IS0(r_pad)) + return St1; + + /* Otherwise, one or the other side is unknown. Return X. */ + return StX; +} + vpip_bit_t vvm_binop_le(const vvm_bitset_t&l, const vvm_bitset_t&r) { vpip_bit_t result = St1; @@ -406,6 +434,34 @@ vpip_bit_t vvm_binop_le(const vvm_bitset_t&l, const vvm_bitset_t&r) return result; } +/* + * This is the <= operator that applies to signed operands. + */ +vpip_bit_t vvm_binop_le_s(const vvm_bitset_t&l, const vvm_bitset_t&r) +{ + vpip_bit_t l_pad = l.get_bit(l.get_width()-1); + vpip_bit_t r_pad = r.get_bit(r.get_width()-1); + + /* If l>=0 and r>=0, return $unsigned(l) <= $unsigned(r) */ + if (B_IS0(l_pad) && B_IS0(r_pad)) + return vvm_binop_le(l, r); + + /* If l < 0 and r < 0, return $unsigned(r) <= $unsigned(l) */ + if (B_IS1(l_pad) && B_IS1(r_pad)) + return vvm_binop_le(r, l); + + /* If l >= 0 and r < 0, return false; */ + if (B_IS0(l_pad) && B_IS1(r_pad)) + return St0; + + /* if l < 0 and r >= 0, return true; */ + if (B_IS1(l_pad) && B_IS0(r_pad)) + return St1; + + /* Otherwise, one or the other side is unknown. Return X. */ + return StX; +} + vpip_bit_t vvm_binop_gt(const vvm_bitset_t&l, const vvm_bitset_t&r) { vpip_bit_t result = St0; @@ -430,6 +486,34 @@ vpip_bit_t vvm_binop_gt(const vvm_bitset_t&l, const vvm_bitset_t&r) return result; } +/* + * This is the > operator that applies to signed operands. + */ +vpip_bit_t vvm_binop_gt_s(const vvm_bitset_t&l, const vvm_bitset_t&r) +{ + vpip_bit_t l_pad = l.get_bit(l.get_width()-1); + vpip_bit_t r_pad = r.get_bit(r.get_width()-1); + + /* If l>=0 and r>=0, return $unsigned(l) > $unsigned(r) */ + if (B_IS0(l_pad) && B_IS0(r_pad)) + return vvm_binop_gt(l, r); + + /* If l < 0 and r < 0, return $unsigned(r) > $unsigned(l) */ + if (B_IS1(l_pad) && B_IS1(r_pad)) + return vvm_binop_gt(r, l); + + /* If l >= 0 and r < 0, return true; */ + if (B_IS0(l_pad) && B_IS1(r_pad)) + return St1; + + /* if l < 0 and r >= 0, return false; */ + if (B_IS1(l_pad) && B_IS0(r_pad)) + return St0; + + /* Otherwise, one or the other side is unknown. Return X. */ + return StX; +} + vpip_bit_t vvm_binop_ge(const vvm_bitset_t&l, const vvm_bitset_t&r) { vpip_bit_t result = St1; @@ -453,6 +537,34 @@ vpip_bit_t vvm_binop_ge(const vvm_bitset_t&l, const vvm_bitset_t&r) return result; } +/* + * This is the >= operator that applies to signed operands. + */ +vpip_bit_t vvm_binop_ge_s(const vvm_bitset_t&l, const vvm_bitset_t&r) +{ + vpip_bit_t l_pad = l.get_bit(l.get_width()-1); + vpip_bit_t r_pad = r.get_bit(r.get_width()-1); + + /* If l>=0 and r>=0, return $unsigned(l) >= $unsigned(r) */ + if (B_IS0(l_pad) && B_IS0(r_pad)) + return vvm_binop_ge(l, r); + + /* If l < 0 and r < 0, return $unsigned(r) >= $unsigned(l) */ + if (B_IS1(l_pad) && B_IS1(r_pad)) + return vvm_binop_ge(r, l); + + /* If l >= 0 and r < 0, return true; */ + if (B_IS0(l_pad) && B_IS1(r_pad)) + return St1; + + /* if l < 0 and r >= 0, return false; */ + if (B_IS1(l_pad) && B_IS0(r_pad)) + return St0; + + /* Otherwise, one or the other side is unknown. Return X. */ + return StX; +} + vpip_bit_t vvm_binop_land(const vvm_bitset_t&l, const vvm_bitset_t&r) { vpip_bit_t res1 = vvm_unop_or(l); @@ -495,6 +607,10 @@ void vvm_ternary(vvm_bitset_t&v, vpip_bit_t c, /* * $Log: vvm_func.cc,v $ + * Revision 1.13 2000/12/11 00:31:44 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.12 2000/07/06 18:12:28 steve * unop_not can take out width same as in width. * diff --git a/vvm/vvm_func.h b/vvm/vvm_func.h index 50cba3d20..9689ed774 100644 --- a/vvm/vvm_func.h +++ b/vvm/vvm_func.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: vvm_func.h,v 1.29 2000/05/19 04:22:56 steve Exp $" +#ident "$Id: vvm_func.h,v 1.30 2000/12/11 00:31:44 steve Exp $" #endif # include "vvm.h" @@ -184,17 +184,21 @@ extern vpip_bit_t vvm_binop_xeq(const vvm_bitset_t&l, const vvm_bitset_t&r); extern vpip_bit_t vvm_binop_zeq(const vvm_bitset_t&l, const vvm_bitset_t&r); -extern vpip_bit_t vvm_binop_lt(const vvm_bitset_t&l, const vvm_bitset_t&r); - /* - * The <= operator takes operands of natural width and returns a - * single bit. The result is V1 if l <= r, otherwise V0; + * The _s variants are signed versions. That is, it assumes the + * operands are signed values and does the comparison on that basis. */ +extern vpip_bit_t vvm_binop_lt(const vvm_bitset_t&l, const vvm_bitset_t&r); +extern vpip_bit_t vvm_binop_lt_s(const vvm_bitset_t&l, const vvm_bitset_t&r); + extern vpip_bit_t vvm_binop_le(const vvm_bitset_t&l, const vvm_bitset_t&r); +extern vpip_bit_t vvm_binop_le_s(const vvm_bitset_t&l, const vvm_bitset_t&r); extern vpip_bit_t vvm_binop_gt(const vvm_bitset_t&l, const vvm_bitset_t&r); +extern vpip_bit_t vvm_binop_gt_s(const vvm_bitset_t&l, const vvm_bitset_t&r); extern vpip_bit_t vvm_binop_ge(const vvm_bitset_t&l, const vvm_bitset_t&r); +extern vpip_bit_t vvm_binop_ge_s(const vvm_bitset_t&l, const vvm_bitset_t&r); extern vpip_bit_t vvm_binop_land(const vvm_bitset_t&l, const vvm_bitset_t&r); @@ -206,6 +210,10 @@ extern void vvm_ternary(vvm_bitset_t&v, vpip_bit_t c, /* * $Log: vvm_func.h,v $ + * Revision 1.30 2000/12/11 00:31:44 steve + * Add support for signed reg variables, + * simulate in t-vvm signed comparisons. + * * Revision 1.29 2000/05/19 04:22:56 steve * Add the integer modulus function. *