Add support for signed reg variables,
simulate in t-vvm signed comparisons.
This commit is contained in:
parent
084a464cf1
commit
5dbea64759
18
PWire.cc
18
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 <assert.h>
|
||||
|
||||
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<PExpr*>(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.
|
||||
*
|
||||
|
|
|
|||
10
PWire.h
10
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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
27
netlist.cc
27
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 <cassert>
|
||||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
16
netlist.h
16
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.
|
||||
*
|
||||
|
|
|
|||
7
parse.y
7
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;
|
||||
|
|
|
|||
22
pform.cc
22
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<string>*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<PExpr*>*range)
|
||||
static void pform_set_net_range(const char*name,
|
||||
const svector<PExpr*>*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<PExpr*>*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<char*>*names, svector<PExpr*>*range)
|
||||
void pform_set_net_range(list<char*>*names,
|
||||
svector<PExpr*>*range,
|
||||
bool signed_flag)
|
||||
{
|
||||
assert(range->count() == 2);
|
||||
|
||||
|
|
@ -352,7 +357,7 @@ void pform_set_net_range(list<char*>*names, svector<PExpr*>*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<char*>*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<char*>*names)
|
||||
|
|
@ -1002,6 +1008,10 @@ int pform_parse(const char*path, map<string,Module*>&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.
|
||||
*
|
||||
|
|
|
|||
8
pform.h
8
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<char*>*names, svector<PExpr*>*,
|
||||
NetNet::PortType);
|
||||
extern void pform_set_net_range(list<char*>*names, svector<PExpr*>*);
|
||||
extern void pform_set_net_range(list<char*>*names, svector<PExpr*>*, bool);
|
||||
extern void pform_set_reg_idx(const string&name, PExpr*l, PExpr*r);
|
||||
extern void pform_set_reg_integer(list<char*>*names);
|
||||
extern void pform_set_reg_time(list<char*>*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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
42
t-vvm.cc
42
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 <iostream>
|
||||
|
|
@ -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)
|
||||
*
|
||||
|
|
|
|||
118
vvm/vvm_func.cc
118
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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue