Allow concatenations as arguments to inout ports.

This commit is contained in:
steve 2006-04-28 04:28:35 +00:00
parent 0d17e57656
commit a2c036d5ab
2 changed files with 38 additions and 8 deletions

10
PExpr.h
View File

@ -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: PExpr.h,v 1.80 2006/04/16 00:54:04 steve Exp $" #ident "$Id: PExpr.h,v 1.81 2006/04/28 04:28:35 steve Exp $"
#endif #endif
# include <string> # include <string>
@ -128,6 +128,7 @@ class PEConcat : public PExpr {
virtual NetNet* elaborate_lnet(Design*des, NetScope*scope, virtual NetNet* elaborate_lnet(Design*des, NetScope*scope,
bool implicit_net_ok =false) const; bool implicit_net_ok =false) const;
virtual NetNet* elaborate_bi_net(Design*des, NetScope*scope) const;
virtual NetNet* elaborate_net(Design*des, NetScope*scope, virtual NetNet* elaborate_net(Design*des, NetScope*scope,
unsigned width, unsigned width,
const NetExpr* rise, const NetExpr* rise,
@ -143,6 +144,10 @@ class PEConcat : public PExpr {
bool is_force) const; bool is_force) const;
virtual bool is_constant(Module*) const; virtual bool is_constant(Module*) const;
private:
NetNet* elaborate_lnet_common_(Design*des, NetScope*scope,
bool implicit_net_ok,
bool bidirectional_flag) const;
private: private:
svector<PExpr*>parms_; svector<PExpr*>parms_;
PExpr*repeat_; PExpr*repeat_;
@ -553,6 +558,9 @@ class PECallFunction : public PExpr {
/* /*
* $Log: PExpr.h,v $ * $Log: PExpr.h,v $
* Revision 1.81 2006/04/28 04:28:35 steve
* Allow concatenations as arguments to inout ports.
*
* Revision 1.80 2006/04/16 00:54:04 steve * Revision 1.80 2006/04/16 00:54:04 steve
* Cleanup lval part select handling. * Cleanup lval part select handling.
* *

View File

@ -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.180 2006/04/24 05:15:07 steve Exp $" #ident "$Id: elab_net.cc,v 1.181 2006/04/28 04:28:35 steve Exp $"
#endif #endif
# include "config.h" # include "config.h"
@ -1733,8 +1733,9 @@ NetNet* PEIdent::elaborate_net_ram_(Design*des, NetScope*scope,
* destination. The caller can connect gate outputs to this signal to * destination. The caller can connect gate outputs to this signal to
* make the l-value connections. * make the l-value connections.
*/ */
NetNet* PEConcat::elaborate_lnet(Design*des, NetScope*scope, NetNet* PEConcat::elaborate_lnet_common_(Design*des, NetScope*scope,
bool implicit_net_ok) const bool implicit_net_ok,
bool bidirectional_flag) const
{ {
assert(scope); assert(scope);
@ -1764,8 +1765,12 @@ NetNet* PEConcat::elaborate_lnet(Design*des, NetScope*scope,
continue; continue;
} }
nets[idx] = parms_[idx]->elaborate_lnet(des, scope, if (bidirectional_flag) {
implicit_net_ok); nets[idx] = parms_[idx]->elaborate_bi_net(des, scope);
} else {
nets[idx] = parms_[idx]->elaborate_lnet(des, scope,
implicit_net_ok);
}
if (nets[idx] == 0) if (nets[idx] == 0)
errors += 1; errors += 1;
else else
@ -1797,11 +1802,14 @@ NetNet* PEConcat::elaborate_lnet(Design*des, NetScope*scope,
<< endl; << endl;
} }
NetPartSelect::dir_t part_dir = bidirectional_flag
? NetPartSelect::BI
: NetPartSelect::VP;
for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) { for (unsigned idx = 0 ; idx < nets.count() ; idx += 1) {
unsigned wid = nets[idx]->vector_width(); unsigned wid = nets[idx]->vector_width();
unsigned off = width - wid; unsigned off = width - wid;
NetPartSelect*ps = new NetPartSelect(osig, off, wid, NetPartSelect*ps = new NetPartSelect(osig, off, wid, part_dir);
NetPartSelect::VP);
des->add_node(ps); des->add_node(ps);
connect(ps->pin(1), osig->pin(0)); connect(ps->pin(1), osig->pin(0));
@ -1816,6 +1824,17 @@ NetNet* PEConcat::elaborate_lnet(Design*des, NetScope*scope,
return osig; return osig;
} }
NetNet* PEConcat::elaborate_lnet(Design*des, NetScope*scope,
bool implicit_net_ok) const
{
return elaborate_lnet_common_(des, scope, implicit_net_ok, false);
}
NetNet* PEConcat::elaborate_bi_net(Design*des, NetScope*scope) const
{
return elaborate_lnet_common_(des, scope, true, true);
}
/* /*
* Elaborate a number as a NetConst object. * Elaborate a number as a NetConst object.
*/ */
@ -2731,6 +2750,9 @@ NetNet* PEUnary::elaborate_net(Design*des, NetScope*scope,
/* /*
* $Log: elab_net.cc,v $ * $Log: elab_net.cc,v $
* Revision 1.181 2006/04/28 04:28:35 steve
* Allow concatenations as arguments to inout ports.
*
* Revision 1.180 2006/04/24 05:15:07 steve * Revision 1.180 2006/04/24 05:15:07 steve
* Fix support for indexed part select in continuous assign l-values. * Fix support for indexed part select in continuous assign l-values.
* *