Allow concatenations as arguments to inout ports.
This commit is contained in:
parent
0d17e57656
commit
a2c036d5ab
10
PExpr.h
10
PExpr.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: 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.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
32
elab_net.cc
32
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.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bidirectional_flag) {
|
||||||
|
nets[idx] = parms_[idx]->elaborate_bi_net(des, scope);
|
||||||
|
} else {
|
||||||
nets[idx] = parms_[idx]->elaborate_lnet(des, scope,
|
nets[idx] = parms_[idx]->elaborate_lnet(des, scope,
|
||||||
implicit_net_ok);
|
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.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue