Do sign extension of structuran nets.
This commit is contained in:
parent
b6fd4f610b
commit
739a1839ed
|
|
@ -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: design_dump.cc,v 1.159 2005/05/17 20:56:55 steve Exp $"
|
#ident "$Id: design_dump.cc,v 1.160 2005/05/24 01:44:27 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -388,6 +388,14 @@ void NetReplicate::dump_node(ostream&o, unsigned ind) const
|
||||||
dump_obj_attr(o, ind+4);
|
dump_obj_attr(o, ind+4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetSignExtend::dump_node(ostream&o, unsigned ind) const
|
||||||
|
{
|
||||||
|
o << setw(ind) << "" << "NetSignExtend: "
|
||||||
|
<< name() << " output width=" << width_ << endl;
|
||||||
|
dump_node_pins(o, ind+4);
|
||||||
|
dump_obj_attr(o, ind+4);
|
||||||
|
}
|
||||||
|
|
||||||
void NetUReduce::dump_node(ostream&o, unsigned ind) const
|
void NetUReduce::dump_node(ostream&o, unsigned ind) const
|
||||||
{
|
{
|
||||||
o << setw(ind) << "" << "reduction logic: ";
|
o << setw(ind) << "" << "reduction logic: ";
|
||||||
|
|
@ -1143,6 +1151,9 @@ void Design::dump(ostream&o) const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: design_dump.cc,v $
|
* $Log: design_dump.cc,v $
|
||||||
|
* Revision 1.160 2005/05/24 01:44:27 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.159 2005/05/17 20:56:55 steve
|
* Revision 1.159 2005/05/17 20:56:55 steve
|
||||||
* Parameters cannot have their width changed.
|
* Parameters cannot have their width changed.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
18
elab_net.cc
18
elab_net.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: elab_net.cc,v 1.164 2005/05/19 03:51:38 steve Exp $"
|
#ident "$Id: elab_net.cc,v 1.165 2005/05/24 01:44:27 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -901,20 +901,27 @@ NetNet* PEBinary::elaborate_net_mul_(Design*des, NetScope*scope,
|
||||||
NetNet*rsig = right_->elaborate_net(des, scope, lwidth, 0, 0, 0);
|
NetNet*rsig = right_->elaborate_net(des, scope, lwidth, 0, 0, 0);
|
||||||
if (rsig == 0) return 0;
|
if (rsig == 0) return 0;
|
||||||
|
|
||||||
|
// The mult is signed if both its operands are signed.
|
||||||
|
bool arith_is_signed = lsig->get_signed() && rsig->get_signed();
|
||||||
|
|
||||||
unsigned rwidth = lwidth;
|
unsigned rwidth = lwidth;
|
||||||
if (rwidth == 0) {
|
if (rwidth == 0) {
|
||||||
rwidth = lsig->pin_count() + rsig->pin_count();
|
rwidth = lsig->vector_width() + rsig->vector_width();
|
||||||
lwidth = rwidth;
|
lwidth = rwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arith_is_signed) {
|
||||||
|
lsig = pad_to_width_signed(des, lsig, rwidth);
|
||||||
|
rsig = pad_to_width_signed(des, rsig, rwidth);
|
||||||
|
}
|
||||||
|
|
||||||
NetMult*mult = new NetMult(scope, scope->local_symbol(), rwidth,
|
NetMult*mult = new NetMult(scope, scope->local_symbol(), rwidth,
|
||||||
lsig->vector_width(),
|
lsig->vector_width(),
|
||||||
rsig->vector_width());
|
rsig->vector_width());
|
||||||
mult->set_line(*this);
|
mult->set_line(*this);
|
||||||
des->add_node(mult);
|
des->add_node(mult);
|
||||||
|
|
||||||
// The mult is signed if both its operands are signed.
|
mult->set_signed( arith_is_signed );
|
||||||
mult->set_signed( lsig->get_signed() && rsig->get_signed() );
|
|
||||||
|
|
||||||
connect(mult->pin_DataA(), lsig->pin(0));
|
connect(mult->pin_DataA(), lsig->pin(0));
|
||||||
connect(mult->pin_DataB(), rsig->pin(0));
|
connect(mult->pin_DataB(), rsig->pin(0));
|
||||||
|
|
@ -2461,6 +2468,9 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elab_net.cc,v $
|
* $Log: elab_net.cc,v $
|
||||||
|
* Revision 1.165 2005/05/24 01:44:27 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.164 2005/05/19 03:51:38 steve
|
* Revision 1.164 2005/05/19 03:51:38 steve
|
||||||
* Make sure comparison widths match.
|
* Make sure comparison widths match.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
17
elaborate.cc
17
elaborate.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: elaborate.cc,v 1.323 2005/05/17 20:56:55 steve Exp $"
|
#ident "$Id: elaborate.cc,v 1.324 2005/05/24 01:44:27 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -157,9 +157,15 @@ void PGAssign::elaborate(Design*des, NetScope*scope) const
|
||||||
it to the desired width. */
|
it to the desired width. */
|
||||||
if (cnt < lval->vector_width()) {
|
if (cnt < lval->vector_width()) {
|
||||||
if (lval->get_signed() && rid->get_signed()) {
|
if (lval->get_signed() && rid->get_signed()) {
|
||||||
cerr << get_line() << ": internal error: "
|
|
||||||
<< "Forgot how to sign-extend r-value "
|
unsigned use_width = lval->vector_width();
|
||||||
<< "to l-value." << endl;
|
|
||||||
|
if (debug_elaborate)
|
||||||
|
cerr << get_line() << ": debug: PGassign "
|
||||||
|
<< "Generate sign-extend node." << endl;
|
||||||
|
|
||||||
|
rid = pad_to_width_signed(des, rid, use_width);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (debug_elaborate)
|
if (debug_elaborate)
|
||||||
|
|
@ -2965,6 +2971,9 @@ Design* elaborate(list<perm_string>roots)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: elaborate.cc,v $
|
* $Log: elaborate.cc,v $
|
||||||
|
* Revision 1.324 2005/05/24 01:44:27 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.323 2005/05/17 20:56:55 steve
|
* Revision 1.323 2005/05/17 20:56:55 steve
|
||||||
* Parameters cannot have their width changed.
|
* Parameters cannot have their width changed.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
10
emit.cc
10
emit.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: emit.cc,v 1.83 2005/02/08 00:12:36 steve Exp $"
|
#ident "$Id: emit.cc,v 1.84 2005/05/24 01:44:27 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -131,6 +131,11 @@ bool NetReplicate::emit_node(struct target_t*tgt) const
|
||||||
return tgt->replicate(this);
|
return tgt->replicate(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NetSignExtend::emit_node(struct target_t*tgt) const
|
||||||
|
{
|
||||||
|
return tgt->sign_extend(this);
|
||||||
|
}
|
||||||
|
|
||||||
bool NetUReduce::emit_node(struct target_t*tgt) const
|
bool NetUReduce::emit_node(struct target_t*tgt) const
|
||||||
{
|
{
|
||||||
return tgt->ureduce(this);
|
return tgt->ureduce(this);
|
||||||
|
|
@ -523,6 +528,9 @@ int emit(const Design*des, const char*type)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: emit.cc,v $
|
* $Log: emit.cc,v $
|
||||||
|
* Revision 1.84 2005/05/24 01:44:27 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.83 2005/02/08 00:12:36 steve
|
* Revision 1.83 2005/02/08 00:12:36 steve
|
||||||
* Add the NetRepeat node, and code generator support.
|
* Add the NetRepeat node, and code generator support.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
14
functor.cc
14
functor.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: functor.cc,v 1.33 2005/02/03 04:56:20 steve Exp $"
|
#ident "$Id: functor.cc,v 1.34 2005/05/24 01:44:27 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -79,6 +79,10 @@ void functor_t::lpm_mux(class Design*, class NetMux*)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void functor_t::sign_extend(class Design*, class NetSignExtend*)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void functor_t::lpm_ureduce(class Design*, class NetUReduce*)
|
void functor_t::lpm_ureduce(class Design*, class NetUReduce*)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -210,6 +214,11 @@ void NetMux::functor_node(Design*des, functor_t*fun)
|
||||||
fun->lpm_mux(des, this);
|
fun->lpm_mux(des, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetSignExtend::functor_node(Design*des, functor_t*fun)
|
||||||
|
{
|
||||||
|
fun->sign_extend(des, this);
|
||||||
|
}
|
||||||
|
|
||||||
void NetUReduce::functor_node(Design*des, functor_t*fun)
|
void NetUReduce::functor_node(Design*des, functor_t*fun)
|
||||||
{
|
{
|
||||||
fun->lpm_ureduce(des, this);
|
fun->lpm_ureduce(des, this);
|
||||||
|
|
@ -276,6 +285,9 @@ int proc_match_t::event_wait(NetEvWait*)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: functor.cc,v $
|
* $Log: functor.cc,v $
|
||||||
|
* Revision 1.34 2005/05/24 01:44:27 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.33 2005/02/03 04:56:20 steve
|
* Revision 1.33 2005/02/03 04:56:20 steve
|
||||||
* laborate reduction gates into LPM_RED_ nodes.
|
* laborate reduction gates into LPM_RED_ nodes.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,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: functor.h,v 1.21 2005/02/03 04:56:20 steve Exp $"
|
#ident "$Id: functor.h,v 1.22 2005/05/24 01:44:27 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -80,6 +80,8 @@ struct functor_t {
|
||||||
|
|
||||||
/* This method is called for each unary reduction gate. */
|
/* This method is called for each unary reduction gate. */
|
||||||
virtual void lpm_ureduce(class Design*des, class NetUReduce*);
|
virtual void lpm_ureduce(class Design*des, class NetUReduce*);
|
||||||
|
|
||||||
|
virtual void sign_extend(class Design*des, class NetSignExtend*);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct proc_match_t {
|
struct proc_match_t {
|
||||||
|
|
@ -95,6 +97,9 @@ struct proc_match_t {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: functor.h,v $
|
* $Log: functor.h,v $
|
||||||
|
* Revision 1.22 2005/05/24 01:44:27 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.21 2005/02/03 04:56:20 steve
|
* Revision 1.21 2005/02/03 04:56:20 steve
|
||||||
* laborate reduction gates into LPM_RED_ nodes.
|
* laborate reduction gates into LPM_RED_ nodes.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
11
ivl_target.h
11
ivl_target.h
|
|
@ -19,7 +19,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: ivl_target.h,v 1.154 2005/05/08 23:44:08 steve Exp $"
|
#ident "$Id: ivl_target.h,v 1.155 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
@ -247,6 +247,7 @@ typedef enum ivl_lpm_type_e {
|
||||||
IVL_LPM_REPEAT = 26,
|
IVL_LPM_REPEAT = 26,
|
||||||
IVL_LPM_SHIFTL = 6,
|
IVL_LPM_SHIFTL = 6,
|
||||||
IVL_LPM_SHIFTR = 7,
|
IVL_LPM_SHIFTR = 7,
|
||||||
|
IVL_LPM_SIGN_EXT=27,
|
||||||
IVL_LPM_SUB = 8,
|
IVL_LPM_SUB = 8,
|
||||||
IVL_LPM_RAM = 9,
|
IVL_LPM_RAM = 9,
|
||||||
IVL_LPM_UFUNC = 14
|
IVL_LPM_UFUNC = 14
|
||||||
|
|
@ -933,6 +934,11 @@ extern const char* ivl_udp_name(ivl_udp_t net);
|
||||||
* repeated to get the desired width. The ivl core assures that the
|
* repeated to get the desired width. The ivl core assures that the
|
||||||
* input vector is exactly ivl_lpm_width() / ivl_lpm_size() bits.
|
* input vector is exactly ivl_lpm_width() / ivl_lpm_size() bits.
|
||||||
*
|
*
|
||||||
|
* - Sign Exend (IVL_LPM_SIGN_EXT)
|
||||||
|
* This node takes a single input and generates a single output. The
|
||||||
|
* input must be signed, and the output will be a vector sign extended
|
||||||
|
* to the desired width. The ivl_lpm_width() value is the output
|
||||||
|
* width, the input will be whatever it wants to be.
|
||||||
* - Shifts (IVL_LPM_SHIFTL/SHIFTR)
|
* - Shifts (IVL_LPM_SHIFTL/SHIFTR)
|
||||||
* This node takes two inputs, a vector and a shift distance. The
|
* This node takes two inputs, a vector and a shift distance. The
|
||||||
* ivl_lpm_data(0) nexus is the vector input, and the ivl_lpm_data(1)
|
* ivl_lpm_data(0) nexus is the vector input, and the ivl_lpm_data(1)
|
||||||
|
|
@ -1658,6 +1664,9 @@ _END_DECL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: ivl_target.h,v $
|
* $Log: ivl_target.h,v $
|
||||||
|
* Revision 1.155 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.154 2005/05/08 23:44:08 steve
|
* Revision 1.154 2005/05/08 23:44:08 steve
|
||||||
* Add support for variable part select.
|
* Add support for variable part select.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
23
netlist.cc
23
netlist.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: netlist.cc,v 1.243 2005/05/08 23:44:08 steve Exp $"
|
#ident "$Id: netlist.cc,v 1.244 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -1474,6 +1474,24 @@ const Link& NetRamDq::pin_Q() const
|
||||||
return pin(5);
|
return pin(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetSignExtend::NetSignExtend(NetScope*s, perm_string n, unsigned w)
|
||||||
|
: NetNode(s, n, 2), width_(w)
|
||||||
|
{
|
||||||
|
pin(0).set_dir(Link::OUTPUT);
|
||||||
|
pin(1).set_dir(Link::INPUT);
|
||||||
|
pin(0).set_name(perm_string::literal("O"), 0);
|
||||||
|
pin(1).set_name(perm_string::literal("I"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetSignExtend::~NetSignExtend()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned NetSignExtend::width() const
|
||||||
|
{
|
||||||
|
return width_;
|
||||||
|
}
|
||||||
|
|
||||||
NetBUFZ::NetBUFZ(NetScope*s, perm_string n, unsigned w)
|
NetBUFZ::NetBUFZ(NetScope*s, perm_string n, unsigned w)
|
||||||
: NetNode(s, n, 2), width_(w)
|
: NetNode(s, n, 2), width_(w)
|
||||||
{
|
{
|
||||||
|
|
@ -2185,6 +2203,9 @@ const NetProc*NetTaskDef::proc() const
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.cc,v $
|
* $Log: netlist.cc,v $
|
||||||
|
* Revision 1.244 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.243 2005/05/08 23:44:08 steve
|
* Revision 1.243 2005/05/08 23:44:08 steve
|
||||||
* Add support for variable part select.
|
* Add support for variable part select.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
28
netlist.h
28
netlist.h
|
|
@ -19,7 +19,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: netlist.h,v 1.343 2005/05/17 20:56:55 steve Exp $"
|
#ident "$Id: netlist.h,v 1.344 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -1364,6 +1364,29 @@ class NetLogic : public NetNode {
|
||||||
unsigned width_;
|
unsigned width_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This class represents a structural sign extension. The pin-0 is a
|
||||||
|
* vector of the input pin-1 sign-extended. The input is taken to be
|
||||||
|
* signed. This generally matches a hardware implementation of
|
||||||
|
* replicating the top bit enough times to create the desired output
|
||||||
|
* width.
|
||||||
|
*/
|
||||||
|
class NetSignExtend : public NetNode {
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit NetSignExtend(NetScope*s, perm_string n, unsigned wid);
|
||||||
|
~NetSignExtend();
|
||||||
|
|
||||||
|
unsigned width() const;
|
||||||
|
|
||||||
|
virtual void dump_node(ostream&, unsigned ind) const;
|
||||||
|
virtual bool emit_node(struct target_t*) const;
|
||||||
|
virtual void functor_node(Design*, functor_t*);
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned width_;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This class represents *reduction* logic operators. Certain boolean
|
* This class represents *reduction* logic operators. Certain boolean
|
||||||
* logic operators have reduction forms which take in a vector and
|
* logic operators have reduction forms which take in a vector and
|
||||||
|
|
@ -3444,6 +3467,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netlist.h,v $
|
* $Log: netlist.h,v $
|
||||||
|
* Revision 1.344 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.343 2005/05/17 20:56:55 steve
|
* Revision 1.343 2005/05/17 20:56:55 steve
|
||||||
* Parameters cannot have their width changed.
|
* Parameters cannot have their width changed.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,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: netmisc.h,v 1.21 2005/04/24 23:44:02 steve Exp $"
|
#ident "$Id: netmisc.h,v 1.22 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -50,6 +50,8 @@ extern NetScope* symbol_search(Design*des, NetScope*start, hname_t path,
|
||||||
extern NetExpr*pad_to_width(NetExpr*expr, unsigned wid);
|
extern NetExpr*pad_to_width(NetExpr*expr, unsigned wid);
|
||||||
extern NetNet*pad_to_width(Design*des, NetNet*n, unsigned w);
|
extern NetNet*pad_to_width(Design*des, NetNet*n, unsigned w);
|
||||||
|
|
||||||
|
extern NetNet*pad_to_width_signed(Design*des, NetNet*n, unsigned w);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function transforms an expression by cropping the high bits
|
* This function transforms an expression by cropping the high bits
|
||||||
* off with a part select. The result has the width w passed in. This
|
* off with a part select. The result has the width w passed in. This
|
||||||
|
|
@ -99,6 +101,9 @@ extern NetExpr* elab_and_eval(Design*des, NetScope*scope, const PExpr*pe);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: netmisc.h,v $
|
* $Log: netmisc.h,v $
|
||||||
|
* Revision 1.22 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.21 2005/04/24 23:44:02 steve
|
* Revision 1.21 2005/04/24 23:44:02 steve
|
||||||
* Update DFF support to new data flow.
|
* Update DFF support to new data flow.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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: pad_to_width.cc,v 1.17 2005/04/24 23:44:02 steve Exp $"
|
#ident "$Id: pad_to_width.cc,v 1.18 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -110,6 +110,29 @@ NetNet*pad_to_width(Design*des, NetNet*net, unsigned wid)
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetNet*pad_to_width_signed(Design*des, NetNet*net, unsigned wid)
|
||||||
|
{
|
||||||
|
NetScope*scope = net->scope();
|
||||||
|
|
||||||
|
if (net->vector_width() >= wid)
|
||||||
|
return net;
|
||||||
|
|
||||||
|
NetSignExtend*se
|
||||||
|
= new NetSignExtend(scope, scope->local_symbol(), wid);
|
||||||
|
se->set_line(*net);
|
||||||
|
des->add_node(se);
|
||||||
|
|
||||||
|
NetNet*tmp = new NetNet(scope, scope->local_symbol(), NetNet::WIRE, wid);
|
||||||
|
tmp->set_line(*net);
|
||||||
|
tmp->local_flag(true);
|
||||||
|
tmp->set_signed(true);
|
||||||
|
|
||||||
|
connect(tmp->pin(0), se->pin(0));
|
||||||
|
connect(se->pin(1), net->pin(0));
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
NetNet*crop_to_width(Design*des, NetNet*net, unsigned wid)
|
NetNet*crop_to_width(Design*des, NetNet*net, unsigned wid)
|
||||||
{
|
{
|
||||||
NetScope*scope = net->scope();
|
NetScope*scope = net->scope();
|
||||||
|
|
@ -132,6 +155,9 @@ NetNet*crop_to_width(Design*des, NetNet*net, unsigned wid)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: pad_to_width.cc,v $
|
* $Log: pad_to_width.cc,v $
|
||||||
|
* Revision 1.18 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.17 2005/04/24 23:44:02 steve
|
* Revision 1.17 2005/04/24 23:44:02 steve
|
||||||
* Update DFF support to new data flow.
|
* Update DFF support to new data flow.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
10
t-dll-api.cc
10
t-dll-api.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: t-dll-api.cc,v 1.126 2005/05/08 23:44:08 steve Exp $"
|
#ident "$Id: t-dll-api.cc,v 1.127 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -803,6 +803,7 @@ extern "C" ivl_nexus_t ivl_lpm_data(ivl_lpm_t net, unsigned idx)
|
||||||
case IVL_LPM_RE_NAND:
|
case IVL_LPM_RE_NAND:
|
||||||
case IVL_LPM_RE_NOR:
|
case IVL_LPM_RE_NOR:
|
||||||
case IVL_LPM_RE_XNOR:
|
case IVL_LPM_RE_XNOR:
|
||||||
|
case IVL_LPM_SIGN_EXT:
|
||||||
assert(idx == 0);
|
assert(idx == 0);
|
||||||
return net->u_.reduce.a;
|
return net->u_.reduce.a;
|
||||||
|
|
||||||
|
|
@ -982,6 +983,7 @@ extern "C" ivl_nexus_t ivl_lpm_q(ivl_lpm_t net, unsigned idx)
|
||||||
case IVL_LPM_RE_NAND:
|
case IVL_LPM_RE_NAND:
|
||||||
case IVL_LPM_RE_NOR:
|
case IVL_LPM_RE_NOR:
|
||||||
case IVL_LPM_RE_XNOR:
|
case IVL_LPM_RE_XNOR:
|
||||||
|
case IVL_LPM_SIGN_EXT:
|
||||||
assert(idx == 0);
|
assert(idx == 0);
|
||||||
return net->u_.reduce.q;
|
return net->u_.reduce.q;
|
||||||
|
|
||||||
|
|
@ -1078,6 +1080,8 @@ extern "C" int ivl_lpm_signed(ivl_lpm_t net)
|
||||||
case IVL_LPM_SHIFTL:
|
case IVL_LPM_SHIFTL:
|
||||||
case IVL_LPM_SHIFTR:
|
case IVL_LPM_SHIFTR:
|
||||||
return net->u_.shift.signed_flag;
|
return net->u_.shift.signed_flag;
|
||||||
|
case IVL_LPM_SIGN_EXT: // Sign extend is always signed.
|
||||||
|
return 1;
|
||||||
case IVL_LPM_UFUNC:
|
case IVL_LPM_UFUNC:
|
||||||
return 0;
|
return 0;
|
||||||
case IVL_LPM_CONCAT: // Concatenations are always unsigned
|
case IVL_LPM_CONCAT: // Concatenations are always unsigned
|
||||||
|
|
@ -1140,6 +1144,7 @@ extern "C" unsigned ivl_lpm_width(ivl_lpm_t net)
|
||||||
case IVL_LPM_RE_NAND:
|
case IVL_LPM_RE_NAND:
|
||||||
case IVL_LPM_RE_NOR:
|
case IVL_LPM_RE_NOR:
|
||||||
case IVL_LPM_RE_XNOR:
|
case IVL_LPM_RE_XNOR:
|
||||||
|
case IVL_LPM_SIGN_EXT:
|
||||||
return net->u_.reduce.width;
|
return net->u_.reduce.width;
|
||||||
case IVL_LPM_SHIFTL:
|
case IVL_LPM_SHIFTL:
|
||||||
case IVL_LPM_SHIFTR:
|
case IVL_LPM_SHIFTR:
|
||||||
|
|
@ -2035,6 +2040,9 @@ extern "C" ivl_variable_type_t ivl_variable_type(ivl_variable_t net)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-dll-api.cc,v $
|
* $Log: t-dll-api.cc,v $
|
||||||
|
* Revision 1.127 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.126 2005/05/08 23:44:08 steve
|
* Revision 1.126 2005/05/08 23:44:08 steve
|
||||||
* Add support for variable part select.
|
* Add support for variable part select.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
33
t-dll.cc
33
t-dll.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: t-dll.cc,v 1.149 2005/05/08 23:44:08 steve Exp $"
|
#ident "$Id: t-dll.cc,v 1.150 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -904,6 +904,34 @@ void dll_target::logic(const NetLogic*net)
|
||||||
scope_add_logic(scope, obj);
|
scope_add_logic(scope, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool dll_target::sign_extend(const NetSignExtend*net)
|
||||||
|
{
|
||||||
|
struct ivl_lpm_s*obj = new struct ivl_lpm_s;
|
||||||
|
obj->type = IVL_LPM_SIGN_EXT;
|
||||||
|
obj->u_.reduce.width = net->width();
|
||||||
|
obj->name = net->name();
|
||||||
|
obj->scope = find_scope(des_, net->scope());
|
||||||
|
assert(obj->scope);
|
||||||
|
|
||||||
|
const Nexus*nex;
|
||||||
|
|
||||||
|
nex = net->pin(0).nexus();
|
||||||
|
assert(nex->t_cookie());
|
||||||
|
|
||||||
|
obj->u_.reduce.q = (ivl_nexus_t) nex->t_cookie();
|
||||||
|
nexus_lpm_add(obj->u_.reduce.q, obj, 0, IVL_DR_STRONG, IVL_DR_STRONG);
|
||||||
|
|
||||||
|
nex = net->pin(1).nexus();
|
||||||
|
assert(nex->t_cookie());
|
||||||
|
|
||||||
|
obj->u_.reduce.a = (ivl_nexus_t) nex->t_cookie();
|
||||||
|
nexus_lpm_add(obj->u_.reduce.a, obj, 1, IVL_DR_HiZ, IVL_DR_HiZ);
|
||||||
|
|
||||||
|
scope_add_lpm(obj->scope, obj);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool dll_target::ureduce(const NetUReduce*net)
|
bool dll_target::ureduce(const NetUReduce*net)
|
||||||
{
|
{
|
||||||
struct ivl_lpm_s*obj = new struct ivl_lpm_s;
|
struct ivl_lpm_s*obj = new struct ivl_lpm_s;
|
||||||
|
|
@ -2080,6 +2108,9 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-dll.cc,v $
|
* $Log: t-dll.cc,v $
|
||||||
|
* Revision 1.150 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.149 2005/05/08 23:44:08 steve
|
* Revision 1.149 2005/05/08 23:44:08 steve
|
||||||
* Add support for variable part select.
|
* Add support for variable part select.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
8
t-dll.h
8
t-dll.h
|
|
@ -19,7 +19,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: t-dll.h,v 1.125 2005/05/08 23:44:08 steve Exp $"
|
#ident "$Id: t-dll.h,v 1.126 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "target.h"
|
# include "target.h"
|
||||||
|
|
@ -90,6 +90,7 @@ struct dll_target : public target_t, public expr_scan_t {
|
||||||
bool net_function(const NetUserFunc*);
|
bool net_function(const NetUserFunc*);
|
||||||
bool net_const(const NetConst*);
|
bool net_const(const NetConst*);
|
||||||
void net_probe(const NetEvProbe*);
|
void net_probe(const NetEvProbe*);
|
||||||
|
bool sign_extend(const NetSignExtend*);
|
||||||
|
|
||||||
bool process(const NetProcTop*);
|
bool process(const NetProcTop*);
|
||||||
void scope(const NetScope*);
|
void scope(const NetScope*);
|
||||||
|
|
@ -347,7 +348,7 @@ struct ivl_lpm_s {
|
||||||
ivl_nexus_t q, a, s;
|
ivl_nexus_t q, a, s;
|
||||||
} part;
|
} part;
|
||||||
|
|
||||||
// IVL_LPM_RE_* and IVL_LPM_REPEAT use this.
|
// IVL_LPM_RE_* and IVL_LPM_SIGN_EXT use this.
|
||||||
struct ivl_lpm_reduce_s {
|
struct ivl_lpm_reduce_s {
|
||||||
unsigned width;
|
unsigned width;
|
||||||
ivl_nexus_t q, a;
|
ivl_nexus_t q, a;
|
||||||
|
|
@ -685,6 +686,9 @@ struct ivl_variable_s {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: t-dll.h,v $
|
* $Log: t-dll.h,v $
|
||||||
|
* Revision 1.126 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.125 2005/05/08 23:44:08 steve
|
* Revision 1.125 2005/05/08 23:44:08 steve
|
||||||
* Add support for variable part select.
|
* Add support for variable part select.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
12
target.cc
12
target.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: target.cc,v 1.74 2005/02/08 00:12:36 steve Exp $"
|
#ident "$Id: target.cc,v 1.75 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -194,6 +194,13 @@ void target_t::net_probe(const NetEvProbe*net)
|
||||||
net->dump_node(cerr, 4);
|
net->dump_node(cerr, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool target_t::sign_extend(const NetSignExtend*net)
|
||||||
|
{
|
||||||
|
cerr << "target (" << typeid(*this).name() << "): "
|
||||||
|
"Unhandled NetSignExtend node." << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool target_t::process(const NetProcTop*top)
|
bool target_t::process(const NetProcTop*top)
|
||||||
{
|
{
|
||||||
return top->statement()->emit_proc(this);
|
return top->statement()->emit_proc(this);
|
||||||
|
|
@ -429,6 +436,9 @@ void expr_scan_t::expr_binary(const NetEBinary*ex)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: target.cc,v $
|
* $Log: target.cc,v $
|
||||||
|
* Revision 1.75 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.74 2005/02/08 00:12:36 steve
|
* Revision 1.74 2005/02/08 00:12:36 steve
|
||||||
* Add the NetRepeat node, and code generator support.
|
* Add the NetRepeat node, and code generator support.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
6
target.h
6
target.h
|
|
@ -19,7 +19,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: target.h,v 1.71 2005/02/08 00:12:36 steve Exp $"
|
#ident "$Id: target.h,v 1.72 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
|
@ -99,6 +99,7 @@ struct target_t {
|
||||||
virtual bool net_const(const NetConst*);
|
virtual bool net_const(const NetConst*);
|
||||||
virtual bool net_function(const NetUserFunc*);
|
virtual bool net_function(const NetUserFunc*);
|
||||||
virtual void net_probe(const NetEvProbe*);
|
virtual void net_probe(const NetEvProbe*);
|
||||||
|
virtual bool sign_extend(const NetSignExtend*);
|
||||||
|
|
||||||
/* Output a process (called for each process). It is up to the
|
/* Output a process (called for each process). It is up to the
|
||||||
target to recurse if desired. */
|
target to recurse if desired. */
|
||||||
|
|
@ -172,6 +173,9 @@ extern const struct target *target_table[];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: target.h,v $
|
* $Log: target.h,v $
|
||||||
|
* Revision 1.72 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.71 2005/02/08 00:12:36 steve
|
* Revision 1.71 2005/02/08 00:12:36 steve
|
||||||
* Add the NetRepeat node, and code generator support.
|
* Add the NetRepeat node, and code generator support.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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: stub.c,v 1.125 2005/05/18 03:46:01 steve Exp $"
|
#ident "$Id: stub.c,v 1.126 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
@ -739,6 +739,26 @@ static void show_lpm_shift(ivl_lpm_t net, const char*shift_dir)
|
||||||
ivl_nexus_name(nex), width_of_nexus(nex));
|
ivl_nexus_name(nex), width_of_nexus(nex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void show_lpm_sign_ext(ivl_lpm_t net)
|
||||||
|
{
|
||||||
|
unsigned width = ivl_lpm_width(net);
|
||||||
|
ivl_nexus_t nex_q = ivl_lpm_q(net,0);
|
||||||
|
ivl_nexus_t nex_a = ivl_lpm_data(net,0);
|
||||||
|
|
||||||
|
fprintf(out, " LPM_SIGN_EXT %s: <width=%u>\n",
|
||||||
|
ivl_lpm_basename(net), width);
|
||||||
|
|
||||||
|
fprintf(out, " Q: %s\n", ivl_nexus_name(nex_q));
|
||||||
|
fprintf(out, " D: %s <width=%u>\n",
|
||||||
|
ivl_nexus_name(nex_a), width_of_nexus(nex_a));
|
||||||
|
|
||||||
|
if (width != width_of_nexus(nex_q)) {
|
||||||
|
fprintf(out, " ERROR: Width of Q is %u, expecting %u\n",
|
||||||
|
width_of_nexus(nex_q), width);
|
||||||
|
stub_errors += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void show_lpm_sub(ivl_lpm_t net)
|
static void show_lpm_sub(ivl_lpm_t net)
|
||||||
{
|
{
|
||||||
unsigned width = ivl_lpm_width(net);
|
unsigned width = ivl_lpm_width(net);
|
||||||
|
|
@ -830,6 +850,10 @@ static void show_lpm(ivl_lpm_t net)
|
||||||
show_lpm_shift(net, "L");
|
show_lpm_shift(net, "L");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IVL_LPM_SIGN_EXT:
|
||||||
|
show_lpm_sign_ext(net);
|
||||||
|
break;
|
||||||
|
|
||||||
case IVL_LPM_SHIFTR:
|
case IVL_LPM_SHIFTR:
|
||||||
show_lpm_shift(net, "R");
|
show_lpm_shift(net, "R");
|
||||||
break;
|
break;
|
||||||
|
|
@ -1383,6 +1407,9 @@ int target_design(ivl_design_t des)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: stub.c,v $
|
* $Log: stub.c,v $
|
||||||
|
* Revision 1.126 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.125 2005/05/18 03:46:01 steve
|
* Revision 1.125 2005/05/18 03:46:01 steve
|
||||||
* Fixup structural GT comparators.
|
* Fixup structural GT comparators.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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: vvp_scope.c,v 1.127 2005/05/08 23:44:08 steve Exp $"
|
#ident "$Id: vvp_scope.c,v 1.128 2005/05/24 01:44:28 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "vvp_priv.h"
|
# include "vvp_priv.h"
|
||||||
|
|
@ -567,6 +567,7 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
||||||
case IVL_LPM_RE_XNOR:
|
case IVL_LPM_RE_XNOR:
|
||||||
case IVL_LPM_SHIFTL:
|
case IVL_LPM_SHIFTL:
|
||||||
case IVL_LPM_SHIFTR:
|
case IVL_LPM_SHIFTR:
|
||||||
|
case IVL_LPM_SIGN_EXT:
|
||||||
case IVL_LPM_SUB:
|
case IVL_LPM_SUB:
|
||||||
case IVL_LPM_MULT:
|
case IVL_LPM_MULT:
|
||||||
case IVL_LPM_MUX:
|
case IVL_LPM_MUX:
|
||||||
|
|
@ -1742,6 +1743,14 @@ static void draw_lpm_repeat(ivl_lpm_t net)
|
||||||
fprintf(vvp_out, ";\n");
|
fprintf(vvp_out, ";\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void draw_lpm_sign_ext(ivl_lpm_t net)
|
||||||
|
{
|
||||||
|
fprintf(vvp_out, "L_%p .extend/s %u, ", net,
|
||||||
|
ivl_lpm_width(net));
|
||||||
|
draw_input_from_net(ivl_lpm_data(net,0));
|
||||||
|
fprintf(vvp_out, ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
static void draw_lpm_in_scope(ivl_lpm_t net)
|
static void draw_lpm_in_scope(ivl_lpm_t net)
|
||||||
{
|
{
|
||||||
switch (ivl_lpm_type(net)) {
|
switch (ivl_lpm_type(net)) {
|
||||||
|
|
@ -1815,6 +1824,10 @@ static void draw_lpm_in_scope(ivl_lpm_t net)
|
||||||
draw_lpm_shiftl(net);
|
draw_lpm_shiftl(net);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case IVL_LPM_SIGN_EXT:
|
||||||
|
draw_lpm_sign_ext(net);
|
||||||
|
return;
|
||||||
|
|
||||||
case IVL_LPM_UFUNC:
|
case IVL_LPM_UFUNC:
|
||||||
draw_lpm_ufunc(net);
|
draw_lpm_ufunc(net);
|
||||||
return;
|
return;
|
||||||
|
|
@ -1942,6 +1955,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vvp_scope.c,v $
|
* $Log: vvp_scope.c,v $
|
||||||
|
* Revision 1.128 2005/05/24 01:44:28 steve
|
||||||
|
* Do sign extension of structuran nets.
|
||||||
|
*
|
||||||
* Revision 1.127 2005/05/08 23:44:08 steve
|
* Revision 1.127 2005/05/08 23:44:08 steve
|
||||||
* Add support for variable part select.
|
* Add support for variable part select.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue