diff --git a/cprop.cc b/cprop.cc index 4bd3f5b80..06c2a757c 100644 --- a/cprop.cc +++ b/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 diff --git a/elab_net.cc b/elab_net.cc index d83344be0..65ddc71e9 100644 --- a/elab_net.cc +++ b/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. * diff --git a/expr_synth.cc b/expr_synth.cc index 39830b1d3..3809a3e57 100644 --- a/expr_synth.cc +++ b/expr_synth.cc @@ -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 diff --git a/netlist.cc b/netlist.cc index 2161dc79d..9dc09eae6 100644 --- a/netlist.cc +++ b/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. * diff --git a/netlist.h b/netlist.h index 52ba91928..9f976aaad 100644 --- a/netlist.h +++ b/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. * diff --git a/t-dll.cc b/t-dll.cc index c8f861979..f75ad0904 100644 --- a/t-dll.cc +++ b/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."<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. * diff --git a/tgt-stub/stub.c b/tgt-stub/stub.c index 8099b3260..b6fc0a014 100644 --- a/tgt-stub/stub.c +++ b/tgt-stub/stub.c @@ -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: \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: \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. * diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index 551de2264..ddab11957 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -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. *