Implement LPM_COMPARE nodes as two-input vector functors.
This commit is contained in:
parent
1c3668ea7f
commit
bf6a5d0f50
8
cprop.cc
8
cprop.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: cprop.cc,v 1.48 2004/12/11 02:31:25 steve Exp $"
|
||||
#ident "$Id: cprop.cc,v 1.49 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -73,6 +73,8 @@ void cprop_functor::lpm_compare(Design*des, NetCompare*obj)
|
|||
|
||||
void cprop_functor::lpm_compare_eq_(Design*des, NetCompare*obj)
|
||||
{
|
||||
#if 0
|
||||
/* XXXX Need to reimplement this code to account for vectors. */
|
||||
NetScope*scope = obj->scope();
|
||||
|
||||
unsigned const_count = 0;
|
||||
|
|
@ -191,6 +193,7 @@ void cprop_functor::lpm_compare_eq_(Design*des, NetCompare*obj)
|
|||
delete obj;
|
||||
des->add_node(tmp);
|
||||
count += 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void cprop_functor::lpm_ff(Design*des, NetFF*obj)
|
||||
|
|
@ -958,6 +961,9 @@ void cprop(Design*des)
|
|||
|
||||
/*
|
||||
* $Log: cprop.cc,v $
|
||||
* Revision 1.49 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.48 2004/12/11 02:31:25 steve
|
||||
* Rework of internals to carry vectors through nexus instead
|
||||
* of single bits. Make the ivl, tgt-vvp and vvp initial changes
|
||||
|
|
|
|||
84
elab_net.cc
84
elab_net.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: elab_net.cc,v 1.141 2005/01/13 00:23:10 steve Exp $"
|
||||
#ident "$Id: elab_net.cc,v 1.142 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -581,41 +581,23 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
|||
delete rexp;
|
||||
}
|
||||
|
||||
unsigned dwidth = lsig->pin_count();
|
||||
if (rsig->pin_count() > dwidth) dwidth = rsig->pin_count();
|
||||
unsigned dwidth = lsig->vector_width();
|
||||
if (rsig->vector_width() > dwidth) dwidth = rsig->vector_width();
|
||||
|
||||
/* Operands of binary compare need to be padded to equal
|
||||
size. Figure the pad bit needed to extend the narrowest
|
||||
vector. */
|
||||
NetNet*padbit = 0;
|
||||
if (lsig->pin_count() != rsig->pin_count()) {
|
||||
unsigned lwid = lsig->pin_count();
|
||||
unsigned rwid = rsig->pin_count();
|
||||
if (lsig->vector_width() < dwidth)
|
||||
lsig = pad_to_width(des, lsig, dwidth);
|
||||
if (rsig->vector_width() < dwidth)
|
||||
rsig = pad_to_width(des, rsig, dwidth);
|
||||
|
||||
padbit = new NetNet(scope, scope->local_symbol(), NetNet::WIRE);
|
||||
padbit->local_flag(true);
|
||||
|
||||
if (lsig->get_signed() && (lwid < rwid)) {
|
||||
|
||||
connect(padbit->pin(0), lsig->pin(lwid-1));
|
||||
|
||||
} else if (rsig->get_signed() && (rwid < lwid)) {
|
||||
|
||||
connect(padbit->pin(0), rsig->pin(rwid-1));
|
||||
|
||||
} else {
|
||||
NetConst*tmp = new NetConst(scope, scope->local_symbol(),
|
||||
verinum::V0);
|
||||
des->add_node(tmp);
|
||||
connect(tmp->pin(0), padbit->pin(0));
|
||||
}
|
||||
}
|
||||
|
||||
NetNet*osig = new NetNet(scope, scope->local_symbol(), NetNet::WIRE);
|
||||
osig->set_line(*this);
|
||||
osig->local_flag(true);
|
||||
|
||||
NetNode*gate;
|
||||
//NetNode*gate_t;
|
||||
|
||||
switch (op_) {
|
||||
case '<':
|
||||
|
|
@ -624,14 +606,8 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
|||
case 'G': {
|
||||
NetCompare*cmp = new
|
||||
NetCompare(scope, scope->local_symbol(), dwidth);
|
||||
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1)
|
||||
connect(cmp->pin_DataA(idx), lsig->pin(idx));
|
||||
for (unsigned idx = lsig->pin_count(); idx < dwidth ; idx += 1)
|
||||
connect(cmp->pin_DataA(idx), padbit->pin(0));
|
||||
for (unsigned idx = 0 ; idx < rsig->pin_count() ; idx += 1)
|
||||
connect(cmp->pin_DataB(idx), rsig->pin(idx));
|
||||
for (unsigned idx = rsig->pin_count(); idx < dwidth ; idx += 1)
|
||||
connect(cmp->pin_DataB(idx), padbit->pin(0));
|
||||
connect(cmp->pin_DataA(), lsig->pin(0));
|
||||
connect(cmp->pin_DataB(), rsig->pin(0));
|
||||
|
||||
switch (op_) {
|
||||
case '<':
|
||||
|
|
@ -660,7 +636,7 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
|||
case 'N': // Case equals (!==)
|
||||
// The comparison generates gates to bitwise compare
|
||||
// each pair, and AND all the comparison results.
|
||||
|
||||
#if 0
|
||||
gate = new NetLogic(scope, scope->local_symbol(),
|
||||
1+dwidth,
|
||||
(op_ == 'E')? NetLogic::AND : NetLogic::NAND, 1);
|
||||
|
|
@ -688,6 +664,11 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
|||
tmp->local_flag(true);
|
||||
connect(cmp->pin(0), tmp->pin(0));
|
||||
}
|
||||
#else
|
||||
cerr << get_line() << ": internal error: Forgot how to "
|
||||
<< "elab_net === operators." << endl;
|
||||
des->errors += 1;
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
||||
|
|
@ -707,19 +688,8 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
|||
/* Oh well, do the general case with a NetCompare. */
|
||||
{ NetCompare*cmp = new NetCompare(scope, scope->local_symbol(),
|
||||
dwidth);
|
||||
for (unsigned idx = 0 ; idx < dwidth ; idx += 1) {
|
||||
|
||||
if (idx < lsig->pin_count())
|
||||
connect(cmp->pin_DataA(idx), lsig->pin(idx));
|
||||
else
|
||||
connect(cmp->pin_DataA(idx), padbit->pin(0));
|
||||
|
||||
if (idx < rsig->pin_count())
|
||||
connect(cmp->pin_DataB(idx), rsig->pin(idx));
|
||||
else
|
||||
connect(cmp->pin_DataB(idx), padbit->pin(0));
|
||||
|
||||
}
|
||||
connect(cmp->pin_DataA(), lsig->pin(0));
|
||||
connect(cmp->pin_DataB(), rsig->pin(0));
|
||||
connect(cmp->pin_AEB(), osig->pin(0));
|
||||
gate = cmp;
|
||||
}
|
||||
|
|
@ -741,19 +711,8 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope,
|
|||
/* Oh well, do the general case with a NetCompare. */
|
||||
{ NetCompare*cmp = new NetCompare(scope, scope->local_symbol(),
|
||||
dwidth);
|
||||
for (unsigned idx = 0 ; idx < dwidth ; idx += 1) {
|
||||
|
||||
if (idx < lsig->pin_count())
|
||||
connect(cmp->pin_DataA(idx), lsig->pin(idx));
|
||||
else
|
||||
connect(cmp->pin_DataA(idx), padbit->pin(0));
|
||||
|
||||
if (idx < rsig->pin_count())
|
||||
connect(cmp->pin_DataB(idx), rsig->pin(idx));
|
||||
else
|
||||
connect(cmp->pin_DataB(idx), padbit->pin(0));
|
||||
|
||||
}
|
||||
connect(cmp->pin_DataA(), lsig->pin(0));
|
||||
connect(cmp->pin_DataB(), rsig->pin(0));
|
||||
connect(cmp->pin_ANEB(), osig->pin(0));
|
||||
gate = cmp;
|
||||
}
|
||||
|
|
@ -2523,6 +2482,9 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
|
|||
|
||||
/*
|
||||
* $Log: elab_net.cc,v $
|
||||
* Revision 1.142 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.141 2005/01/13 00:23:10 steve
|
||||
* Fix elaboration of == compared to constants.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: expr_synth.cc,v 1.60 2004/12/11 02:31:26 steve Exp $"
|
||||
#ident "$Id: expr_synth.cc,v 1.61 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -171,6 +171,8 @@ NetNet* NetEBComp::synthesize(Design*des)
|
|||
0. We can use an OR gate to do the comparison. Synthesize
|
||||
the non-const side as normal, then or(nor) the signals
|
||||
together to get result. */
|
||||
#if 0
|
||||
// XXXX Need to check this for vector_width and wide logic.
|
||||
if ((rcon && (rcon->value() == verinum(0UL,rcon->expr_width())))
|
||||
|| (lcon && (lcon->value() == verinum(0UL,lcon->expr_width())))) {
|
||||
|
||||
|
|
@ -234,6 +236,7 @@ NetNet* NetEBComp::synthesize(Design*des)
|
|||
des->add_node(gate);
|
||||
return osig;
|
||||
}
|
||||
#endif
|
||||
|
||||
NetNet*lsig = left_->synthesize(des);
|
||||
NetNet*rsig = right_->synthesize(des);
|
||||
|
|
@ -241,9 +244,9 @@ NetNet* NetEBComp::synthesize(Design*des)
|
|||
NetScope*scope = lsig->scope();
|
||||
assert(scope);
|
||||
|
||||
unsigned width = lsig->pin_count();
|
||||
if (rsig->pin_count() > lsig->pin_count())
|
||||
width = rsig->pin_count();
|
||||
unsigned width = lsig->vector_width();
|
||||
if (rsig->vector_width() > width)
|
||||
width = rsig->vector_width();
|
||||
|
||||
lsig = pad_to_width(des, lsig, width);
|
||||
rsig = pad_to_width(des, rsig, width);
|
||||
|
|
@ -281,11 +284,8 @@ NetNet* NetEBComp::synthesize(Design*des)
|
|||
NetCompare*dev = new NetCompare(scope, scope->local_symbol(), width);
|
||||
des->add_node(dev);
|
||||
|
||||
for (unsigned idx = 0 ; idx < lsig->pin_count() ; idx += 1)
|
||||
connect(dev->pin_DataA(idx), lsig->pin(idx));
|
||||
|
||||
for (unsigned idx = 0 ; idx < rsig->pin_count() ; idx += 1)
|
||||
connect(dev->pin_DataB(idx), rsig->pin(idx));
|
||||
connect(dev->pin_DataA(), lsig->pin(0));
|
||||
connect(dev->pin_DataB(), rsig->pin(0));
|
||||
|
||||
|
||||
switch (op_) {
|
||||
|
|
@ -627,12 +627,11 @@ NetNet* NetEConst::synthesize(Design*des)
|
|||
perm_string path = scope->local_symbol();
|
||||
unsigned width=expr_width();
|
||||
|
||||
NetNet*osig = new NetNet(scope, path, NetNet::IMPLICIT, width);
|
||||
NetNet*osig = new NetNet(scope, path, NetNet::IMPLICIT, width-1,0);
|
||||
osig->local_flag(true);
|
||||
osig->set_signed(has_sign());
|
||||
NetConst*con = new NetConst(scope, scope->local_symbol(), value());
|
||||
for (unsigned idx = 0 ; idx < width; idx += 1)
|
||||
connect(osig->pin(idx), con->pin(idx));
|
||||
connect(osig->pin(0), con->pin(0));
|
||||
|
||||
des->add_node(con);
|
||||
return osig;
|
||||
|
|
@ -857,6 +856,9 @@ NetNet* NetESignal::synthesize(Design*des)
|
|||
|
||||
/*
|
||||
* $Log: expr_synth.cc,v $
|
||||
* Revision 1.61 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.60 2004/12/11 02:31:26 steve
|
||||
* Rework of internals to carry vectors through nexus instead
|
||||
* of single bits. Make the ivl, tgt-vvp and vvp initial changes
|
||||
|
|
|
|||
33
netlist.cc
33
netlist.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: netlist.cc,v 1.229 2005/01/09 20:16:01 steve Exp $"
|
||||
#ident "$Id: netlist.cc,v 1.230 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -957,7 +957,7 @@ const Link& NetCLShift::pin_Distance(unsigned idx) const
|
|||
}
|
||||
|
||||
NetCompare::NetCompare(NetScope*s, perm_string n, unsigned wi)
|
||||
: NetNode(s, n, 8+2*wi), width_(wi)
|
||||
: NetNode(s, n, 10), width_(wi)
|
||||
{
|
||||
signed_flag_ = false;
|
||||
pin(0).set_dir(Link::INPUT); pin(0).set_name(
|
||||
|
|
@ -976,12 +976,10 @@ NetCompare::NetCompare(NetScope*s, perm_string n, unsigned wi)
|
|||
perm_string::literal("ALB"));
|
||||
pin(7).set_dir(Link::OUTPUT); pin(7).set_name(
|
||||
perm_string::literal("ALEB"));
|
||||
for (unsigned idx = 0 ; idx < width_ ; idx += 1) {
|
||||
pin(8+idx).set_dir(Link::INPUT);
|
||||
pin(8+idx).set_name(perm_string::literal("DataA"), idx);
|
||||
pin(8+width_+idx).set_dir(Link::INPUT);
|
||||
pin(8+width_+idx).set_name(perm_string::literal("DataB"), idx);
|
||||
}
|
||||
pin(8).set_dir(Link::INPUT);
|
||||
pin(8).set_name(perm_string::literal("DataA"));
|
||||
pin(9).set_dir(Link::INPUT);
|
||||
pin(9).set_name(perm_string::literal("DataB"));
|
||||
}
|
||||
|
||||
NetCompare::~NetCompare()
|
||||
|
|
@ -1083,24 +1081,24 @@ const Link& NetCompare::pin_ALEB() const
|
|||
return pin(7);
|
||||
}
|
||||
|
||||
Link& NetCompare::pin_DataA(unsigned idx)
|
||||
Link& NetCompare::pin_DataA()
|
||||
{
|
||||
return pin(8+idx);
|
||||
return pin(8);
|
||||
}
|
||||
|
||||
const Link& NetCompare::pin_DataA(unsigned idx) const
|
||||
const Link& NetCompare::pin_DataA() const
|
||||
{
|
||||
return pin(8+idx);
|
||||
return pin(8);
|
||||
}
|
||||
|
||||
Link& NetCompare::pin_DataB(unsigned idx)
|
||||
Link& NetCompare::pin_DataB()
|
||||
{
|
||||
return pin(8+width_+idx);
|
||||
return pin(9);
|
||||
}
|
||||
|
||||
const Link& NetCompare::pin_DataB(unsigned idx) const
|
||||
const Link& NetCompare::pin_DataB() const
|
||||
{
|
||||
return pin(8+width_+idx);
|
||||
return pin(9);
|
||||
}
|
||||
|
||||
NetDivide::NetDivide(NetScope*sc, perm_string n, unsigned wr,
|
||||
|
|
@ -2344,6 +2342,9 @@ const NetProc*NetTaskDef::proc() const
|
|||
|
||||
/*
|
||||
* $Log: netlist.cc,v $
|
||||
* Revision 1.230 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.229 2005/01/09 20:16:01 steve
|
||||
* Use PartSelect/PV and VP to handle part selects through ports.
|
||||
*
|
||||
|
|
|
|||
13
netlist.h
13
netlist.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: netlist.h,v 1.325 2005/01/12 03:17:37 steve Exp $"
|
||||
#ident "$Id: netlist.h,v 1.326 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -558,8 +558,8 @@ class NetCompare : public NetNode {
|
|||
Link& pin_ALB();
|
||||
Link& pin_ALEB();
|
||||
|
||||
Link& pin_DataA(unsigned idx);
|
||||
Link& pin_DataB(unsigned idx);
|
||||
Link& pin_DataA();
|
||||
Link& pin_DataB();
|
||||
|
||||
const Link& pin_Aclr() const;
|
||||
const Link& pin_Clock() const;
|
||||
|
|
@ -570,8 +570,8 @@ class NetCompare : public NetNode {
|
|||
const Link& pin_ALB() const;
|
||||
const Link& pin_ALEB() const;
|
||||
|
||||
const Link& pin_DataA(unsigned idx) const;
|
||||
const Link& pin_DataB(unsigned idx) const;
|
||||
const Link& pin_DataA() const;
|
||||
const Link& pin_DataB() const;
|
||||
|
||||
virtual void functor_node(Design*, functor_t*);
|
||||
virtual void dump_node(ostream&, unsigned ind) const;
|
||||
|
|
@ -3411,6 +3411,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
|||
|
||||
/*
|
||||
* $Log: netlist.h,v $
|
||||
* Revision 1.326 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.325 2005/01/12 03:17:37 steve
|
||||
* Properly pad vector widths in pgassign.
|
||||
*
|
||||
|
|
|
|||
95
t-dll.cc
95
t-dll.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: t-dll.cc,v 1.134 2005/01/09 20:16:01 steve Exp $"
|
||||
#ident "$Id: t-dll.cc,v 1.135 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -1240,104 +1240,90 @@ void dll_target::lpm_compare(const NetCompare*net)
|
|||
|
||||
obj->u_.arith.width = net->width();
|
||||
obj->u_.arith.signed_flag = net->get_signed()? 1 : 0;
|
||||
#if 0
|
||||
obj->u_.arith.q = new ivl_nexus_t[1 + 2 * obj->u_.arith.width];
|
||||
obj->u_.arith.a = obj->u_.arith.q + 1;
|
||||
obj->u_.arith.b = obj->u_.arith.a + obj->u_.arith.width;
|
||||
|
||||
const Nexus*nex;
|
||||
|
||||
nex = net->pin_DataA().nexus();
|
||||
assert(nex->t_cookie());
|
||||
|
||||
obj->u_.arith.a = (ivl_nexus_t) nex->t_cookie();
|
||||
|
||||
nex = net->pin_DataB().nexus();
|
||||
assert(nex->t_cookie());
|
||||
|
||||
obj->u_.arith.b = (ivl_nexus_t) nex->t_cookie();
|
||||
|
||||
|
||||
if (net->pin_AGEB().is_linked()) {
|
||||
const Nexus*nex = net->pin_AGEB().nexus();
|
||||
nex = net->pin_AGEB().nexus();
|
||||
obj->type = IVL_LPM_CMP_GE;
|
||||
|
||||
assert(nex->t_cookie());
|
||||
obj->u_.arith.q[0] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q[0], obj, 0,
|
||||
obj->u_.arith.q = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q, obj, 0,
|
||||
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||
|
||||
} else if (net->pin_AGB().is_linked()) {
|
||||
const Nexus*nex = net->pin_AGB().nexus();
|
||||
nex = net->pin_AGB().nexus();
|
||||
obj->type = IVL_LPM_CMP_GT;
|
||||
|
||||
assert(nex->t_cookie());
|
||||
obj->u_.arith.q[0] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q[0], obj, 0,
|
||||
obj->u_.arith.q = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q, obj, 0,
|
||||
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||
|
||||
} else if (net->pin_ALEB().is_linked()) {
|
||||
const Nexus*nex = net->pin_ALEB().nexus();
|
||||
nex = net->pin_ALEB().nexus();
|
||||
obj->type = IVL_LPM_CMP_GE;
|
||||
|
||||
assert(nex->t_cookie());
|
||||
obj->u_.arith.q[0] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q[0], obj, 0,
|
||||
obj->u_.arith.q = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q, obj, 0,
|
||||
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||
|
||||
swap_operands = true;
|
||||
|
||||
} else if (net->pin_ALB().is_linked()) {
|
||||
const Nexus*nex = net->pin_ALB().nexus();
|
||||
nex = net->pin_ALB().nexus();
|
||||
obj->type = IVL_LPM_CMP_GT;
|
||||
|
||||
assert(nex->t_cookie());
|
||||
obj->u_.arith.q[0] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q[0], obj, 0,
|
||||
obj->u_.arith.q = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q, obj, 0,
|
||||
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||
|
||||
swap_operands = true;
|
||||
|
||||
} else if (net->pin_AEB().is_linked()) {
|
||||
const Nexus*nex = net->pin_AEB().nexus();
|
||||
nex = net->pin_AEB().nexus();
|
||||
obj->type = IVL_LPM_CMP_EQ;
|
||||
|
||||
assert(nex->t_cookie());
|
||||
obj->u_.arith.q[0] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q[0], obj, 0,
|
||||
obj->u_.arith.q = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q, obj, 0,
|
||||
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||
|
||||
} else if (net->pin_ANEB().is_linked()) {
|
||||
const Nexus*nex = net->pin_ANEB().nexus();
|
||||
nex = net->pin_ANEB().nexus();
|
||||
obj->type = IVL_LPM_CMP_NE;
|
||||
|
||||
if (! nex->t_cookie()) {
|
||||
cerr << "internal error: COMPARE_NE device " <<
|
||||
net->name()<<" ANEB pin nexus has no cookie."<<endl;
|
||||
assert(0);
|
||||
}
|
||||
assert(nex->t_cookie());
|
||||
obj->u_.arith.q[0] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q[0], obj, 0,
|
||||
obj->u_.arith.q = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.q, obj, 0,
|
||||
IVL_DR_STRONG, IVL_DR_STRONG);
|
||||
|
||||
} else {
|
||||
assert(0);
|
||||
}
|
||||
|
||||
for (unsigned idx = 0 ; idx < net->width() ; idx += 1) {
|
||||
const Nexus*nex;
|
||||
|
||||
nex = swap_operands
|
||||
? net->pin_DataB(idx).nexus()
|
||||
: net->pin_DataA(idx).nexus();
|
||||
|
||||
assert(nex->t_cookie());
|
||||
|
||||
obj->u_.arith.a[idx] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.a[idx], obj, 0,
|
||||
IVL_DR_HiZ, IVL_DR_HiZ);
|
||||
|
||||
nex = swap_operands
|
||||
? net->pin_DataA(idx).nexus()
|
||||
: net->pin_DataB(idx).nexus();
|
||||
|
||||
assert(nex->t_cookie());
|
||||
|
||||
obj->u_.arith.b[idx] = (ivl_nexus_t) nex->t_cookie();
|
||||
nexus_lpm_add(obj->u_.arith.b[idx], obj, 0,
|
||||
IVL_DR_HiZ, IVL_DR_HiZ);
|
||||
if (swap_operands) {
|
||||
ivl_nexus_t tmp = obj->u_.arith.a;
|
||||
obj->u_.arith.a = obj->u_.arith.b;
|
||||
obj->u_.arith.b = tmp;
|
||||
}
|
||||
#else
|
||||
cerr << "XXXX: t-dll.cc: Forgot how to handle lpm_compare." << endl;
|
||||
#endif
|
||||
|
||||
nexus_lpm_add(obj->u_.arith.a, obj, 0, IVL_DR_HiZ, IVL_DR_HiZ);
|
||||
nexus_lpm_add(obj->u_.arith.b, obj, 0, IVL_DR_HiZ, IVL_DR_HiZ);
|
||||
|
||||
scope_add_lpm(obj->scope, obj);
|
||||
}
|
||||
|
|
@ -2239,6 +2225,9 @@ extern const struct target tgt_dll = { "dll", &dll_target_obj };
|
|||
|
||||
/*
|
||||
* $Log: t-dll.cc,v $
|
||||
* Revision 1.135 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.134 2005/01/09 20:16:01 steve
|
||||
* Use PartSelect/PV and VP to handle part selects through ports.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: stub.c,v 1.95 2005/01/09 20:16:01 steve Exp $"
|
||||
#ident "$Id: stub.c,v 1.96 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "config.h"
|
||||
|
|
@ -179,6 +179,20 @@ void show_expression(ivl_expr_t net, unsigned ind)
|
|||
}
|
||||
}
|
||||
|
||||
/* IVL_LPM_CMP_GE
|
||||
* This LPM node supports two-input compare.
|
||||
*/
|
||||
static void show_lpm_cmp_ge(ivl_lpm_t net)
|
||||
{
|
||||
unsigned width = ivl_lpm_width(net);
|
||||
|
||||
fprintf(out, " LPM_CMP_GE %s: <width=%u>\n",
|
||||
ivl_lpm_basename(net), width);
|
||||
|
||||
fprintf(out, " O: %s\n", ivl_nexus_name(ivl_lpm_q(net,0)));
|
||||
fprintf(out, " A: %s\n", ivl_nexus_name(ivl_lpm_data(net,0)));
|
||||
fprintf(out, " B: %s\n", ivl_nexus_name(ivl_lpm_data(net,1)));
|
||||
}
|
||||
|
||||
/* IVL_LPM_CONCAT
|
||||
* The concat device takes N inputs (N=ivl_lpm_selects) and generates
|
||||
|
|
@ -262,6 +276,10 @@ static void show_lpm(ivl_lpm_t net)
|
|||
break;
|
||||
}
|
||||
|
||||
case IVL_LPM_CMP_GE:
|
||||
show_lpm_cmp_ge(net);
|
||||
break;
|
||||
|
||||
case IVL_LPM_CMP_NE: {
|
||||
fprintf(out, " LPM_COMPARE(NE) %s: <width=%u>\n",
|
||||
ivl_lpm_basename(net), width);
|
||||
|
|
@ -827,6 +845,9 @@ int target_design(ivl_design_t des)
|
|||
|
||||
/*
|
||||
* $Log: stub.c,v $
|
||||
* Revision 1.96 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.95 2005/01/09 20:16:01 steve
|
||||
* Use PartSelect/PV and VP to handle part selects through ports.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#ifdef HAVE_CVS_IDENT
|
||||
#ident "$Id: vvp_scope.c,v 1.109 2005/01/12 05:31:50 steve Exp $"
|
||||
#ident "$Id: vvp_scope.c,v 1.110 2005/01/16 04:20:32 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvp_priv.h"
|
||||
|
|
@ -432,6 +432,8 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
|||
case IVL_LPM_RAM:
|
||||
case IVL_LPM_ADD:
|
||||
case IVL_LPM_CONCAT:
|
||||
case IVL_LPM_CMP_GE:
|
||||
case IVL_LPM_CMP_GT:
|
||||
case IVL_LPM_SHIFTL:
|
||||
case IVL_LPM_SHIFTR:
|
||||
case IVL_LPM_SUB:
|
||||
|
|
@ -448,8 +450,6 @@ static const char* draw_net_input_drive(ivl_nexus_t nex, ivl_nexus_ptr_t nptr)
|
|||
|
||||
break;
|
||||
|
||||
case IVL_LPM_CMP_GE:
|
||||
case IVL_LPM_CMP_GT:
|
||||
case IVL_LPM_CMP_EQ:
|
||||
case IVL_LPM_CMP_NE:
|
||||
if (ivl_lpm_q(lpm, 0) == nex) {
|
||||
|
|
@ -1188,7 +1188,7 @@ static void draw_lpm_arith_a_b_inputs(ivl_lpm_t net)
|
|||
fprintf(vvp_out, ", V_%s", vvp_signal_label(sig));
|
||||
|
||||
sig = 0;
|
||||
nex = ivl_lpm_datab(net, 0);
|
||||
nex = ivl_lpm_data(net, 1);
|
||||
for (idx = 0 ; idx < ivl_nexus_ptrs(nex) ; idx += 1) {
|
||||
np = ivl_nexus_ptr(nex,idx);
|
||||
sig = ivl_nexus_ptr_sig(np);
|
||||
|
|
@ -1256,6 +1256,7 @@ static void draw_lpm_add(ivl_lpm_t net)
|
|||
|
||||
static void draw_lpm_cmp(ivl_lpm_t net)
|
||||
{
|
||||
const char*src_table[2];
|
||||
unsigned width;
|
||||
const char*type = "";
|
||||
const char*signed_string = ivl_lpm_signed(net)? ".s" : "";
|
||||
|
|
@ -1273,14 +1274,10 @@ static void draw_lpm_cmp(ivl_lpm_t net)
|
|||
assert(0);
|
||||
}
|
||||
|
||||
fprintf(vvp_out, "L_%s.%s .cmp/%s%s %u",
|
||||
vvp_mangle_id(ivl_scope_name(ivl_lpm_scope(net))),
|
||||
vvp_mangle_id(ivl_lpm_basename(net)), type,
|
||||
signed_string, width);
|
||||
|
||||
draw_lpm_arith_a_b_inputs(net);
|
||||
|
||||
fprintf(vvp_out, ";\n");
|
||||
draw_lpm_data_inputs(net, 0, 2, src_table);
|
||||
fprintf(vvp_out, "L_%p .cmp/%s%s %u, %s, %s;\n",
|
||||
net, type, signed_string, width,
|
||||
src_table[0], src_table[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1827,6 +1824,9 @@ int draw_scope(ivl_scope_t net, ivl_scope_t parent)
|
|||
|
||||
/*
|
||||
* $Log: vvp_scope.c,v $
|
||||
* Revision 1.110 2005/01/16 04:20:32 steve
|
||||
* Implement LPM_COMPARE nodes as two-input vector functors.
|
||||
*
|
||||
* Revision 1.109 2005/01/12 05:31:50 steve
|
||||
* More robust input code generation for LPM_ADD.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue