Merge similar probes within a module.

This commit is contained in:
steve 2000-05-27 19:33:23 +00:00
parent e0dcdf6b72
commit fd09bc3e3e
4 changed files with 142 additions and 10 deletions

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
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: elaborate.cc,v 1.173 2000/05/16 04:05:16 steve Exp $" #ident "$Id: elaborate.cc,v 1.174 2000/05/27 19:33:23 steve Exp $"
#endif #endif
/* /*
@ -1832,8 +1832,17 @@ NetProc* PEventStatement::elaborate_st(Design*des, const string&path,
expression (and not a named event) then add this expression (and not a named event) then add this
event. Otherwise, we didn't use it so delete it. */ event. Otherwise, we didn't use it so delete it. */
if (expr_count > 0) { if (expr_count > 0) {
if (NetEvent*match = ev->find_similar_event()) {
cerr << "XXXX Found similar event for " <<
ev->name() << endl;
delete ev;
wa->add_event(match);
} else {
scope->add_event(ev); scope->add_event(ev);
wa->add_event(ev); wa->add_event(ev);
}
} else { } else {
delete ev; delete ev;
} }
@ -2429,6 +2438,9 @@ Design* elaborate(const map<string,Module*>&modules,
/* /*
* $Log: elaborate.cc,v $ * $Log: elaborate.cc,v $
* Revision 1.174 2000/05/27 19:33:23 steve
* Merge similar probes within a module.
*
* Revision 1.173 2000/05/16 04:05:16 steve * Revision 1.173 2000/05/16 04:05:16 steve
* Module ports are really special PEIdent * Module ports are really special PEIdent
* expressions, because a name can be used * expressions, because a name can be used

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
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: net_event.cc,v 1.6 2000/04/18 04:50:20 steve Exp $" #ident "$Id: net_event.cc,v 1.7 2000/05/27 19:33:23 steve Exp $"
#endif #endif
# include "netlist.h" # include "netlist.h"
@ -93,6 +93,73 @@ unsigned NetEvent::nwait() const
return waitref_; return waitref_;
} }
NetEvent* NetEvent::find_similar_event()
{
if (probes_ == 0)
return 0;
#define NCAND 256
NetEvent*cand[NCAND];
bool cflg[NCAND];
unsigned ncand = 0;
NetEvProbe*cur = probes_;
/* First locate all the canditate events from the probe
objects that are connected to them. */
for (NetNode*idx = cur->next_node()
; idx && (idx != cur) ; idx = idx->next_node()) {
NetEvProbe*tmp = dynamic_cast<NetEvProbe*>(idx);
if (tmp == 0)
continue;
if (tmp->edge() != cur->edge())
continue;
cand[ncand++] = tmp->event();
assert(ncand <= NCAND);
}
for (cur = cur->enext_ ; cur && ncand ; cur = cur->enext_) {
for (unsigned idx = 0 ; idx < ncand ; idx += 1)
cflg[idx] = false;
for (NetNode*idx = cur->next_node()
; idx && (idx != cur) ; idx = idx->next_node()) {
NetEvProbe*tmp = dynamic_cast<NetEvProbe*>(idx);
if (tmp == 0)
continue;
if (tmp->edge() != cur->edge())
continue;
for (unsigned srch = 0 ; srch < ncand ; srch += 1)
if (cand[srch] == tmp->event()) {
cflg[srch] = true;
break;
}
}
for (unsigned idx = 0 ; idx < ncand ; ) {
if (cflg[idx]) {
idx += 1;
continue;
}
for (unsigned tmp = idx ; idx+1 < ncand ; idx += 1) {
cflg[tmp] = cflg[tmp+1];
cand[tmp] = cand[tmp+1];
}
ncand -= 1;
}
}
for (unsigned idx = 0 ; idx < ncand ; idx += 1) {
if (cand[idx]->nprobe() == nprobe())
return cand[idx];
}
return 0;
}
NetEvTrig::NetEvTrig(NetEvent*ev) NetEvTrig::NetEvTrig(NetEvent*ev)
: event_(ev) : event_(ev)
{ {
@ -155,6 +222,11 @@ NetEvProbe::edge_t NetEvProbe::edge() const
return edge_; return edge_;
} }
NetEvent* NetEvProbe::event()
{
return event_;
}
const NetEvent* NetEvProbe::event() const const NetEvent* NetEvProbe::event() const
{ {
return event_; return event_;
@ -225,6 +297,9 @@ NetProc* NetEvWait::statement()
/* /*
* $Log: net_event.cc,v $ * $Log: net_event.cc,v $
* Revision 1.7 2000/05/27 19:33:23 steve
* Merge similar probes within a module.
*
* Revision 1.6 2000/04/18 04:50:20 steve * Revision 1.6 2000/04/18 04:50:20 steve
* Clean up unneeded NetEvent objects. * Clean up unneeded NetEvent objects.
* *

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
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: netlist.cc,v 1.126 2000/05/19 01:43:16 steve Exp $" #ident "$Id: netlist.cc,v 1.127 2000/05/27 19:33:23 steve Exp $"
#endif #endif
# include <cassert> # include <cassert>
@ -165,6 +165,11 @@ void Link::unlink()
next_ = prev_ = this; next_ = prev_ = this;
} }
bool Link::is_equal(const Link&that) const
{
return (node_ == that.node_) && (pin_ == that.pin_);
}
bool Link::is_linked() const bool Link::is_linked() const
{ {
return next_ != this; return next_ != this;
@ -399,12 +404,39 @@ const Link& NetObj::pin(unsigned idx) const
return pins_[idx]; return pins_[idx];
} }
NetNode::NetNode(const string&n, unsigned npins)
: NetObj(n, npins), node_next_(0), node_prev_(0), design_(0)
{
}
NetNode::~NetNode() NetNode::~NetNode()
{ {
if (design_) if (design_)
design_->del_node(this); design_->del_node(this);
} }
NetNode* NetNode::next_node()
{
for (Link*pin0 = pin(0).next_link()
; *pin0 != pin(0) ; pin0 = pin0->next_link()) {
NetNode*cur = dynamic_cast<NetNode*>(pin0->get_obj());
if (cur == 0)
continue;
if (cur->pin_count() != pin_count())
continue;
bool flag = true;
for (unsigned idx = 0 ; idx < pin_count() ; idx += 1)
flag = flag && pin(idx).is_linked(cur->pin(idx));
if (flag == true)
return cur;
}
return 0;
}
NetNet::NetNet(NetScope*s, const string&n, Type t, unsigned npins) NetNet::NetNet(NetScope*s, const string&n, Type t, unsigned npins)
: NetObj(n, npins), sig_next_(0), sig_prev_(0), scope_(s), : NetObj(n, npins), sig_next_(0), sig_prev_(0), scope_(s),
type_(t), port_type_(NOT_A_PORT), msb_(npins-1), lsb_(0), type_(t), port_type_(NOT_A_PORT), msb_(npins-1), lsb_(0),
@ -2604,6 +2636,9 @@ bool NetUDP::sequ_glob_(string input, char output)
/* /*
* $Log: netlist.cc,v $ * $Log: netlist.cc,v $
* Revision 1.127 2000/05/27 19:33:23 steve
* Merge similar probes within a module.
*
* Revision 1.126 2000/05/19 01:43:16 steve * Revision 1.126 2000/05/19 01:43:16 steve
* Accept different widths for add operands. * Accept different widths for add operands.
* *

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
*/ */
#if !defined(WINNT) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: netlist.h,v 1.138 2000/05/11 23:37:27 steve Exp $" #ident "$Id: netlist.h,v 1.139 2000/05/27 19:33:23 steve Exp $"
#endif #endif
/* /*
@ -160,8 +160,9 @@ class Link {
// Return true if this link is connected to any pin of r. // Return true if this link is connected to any pin of r.
bool is_linked(const NetObj&r) const; bool is_linked(const NetObj&r) const;
bool is_equal(const Link&that) const // Return true if this is the same pin of the same object of
{ return (node_ == that.node_) && (pin_ == that.pin_); } // that link.
bool is_equal(const Link&that) const;
// Return information about the object that this link is // Return information about the object that this link is
// a part of. // a part of.
@ -205,11 +206,14 @@ class Link {
class NetNode : public NetObj { class NetNode : public NetObj {
public: public:
explicit NetNode(const string&n, unsigned npins) explicit NetNode(const string&n, unsigned npins);
: NetObj(n, npins), node_next_(0), node_prev_(0), design_(0) { }
virtual ~NetNode(); virtual ~NetNode();
// This method locates the next node that has all its pins
// connected to the same of my own pins.
NetNode*next_node();
virtual void emit_node(ostream&, struct target_t*) const; virtual void emit_node(ostream&, struct target_t*) const;
virtual void dump_node(ostream&, unsigned) const; virtual void dump_node(ostream&, unsigned) const;
@ -1401,6 +1405,8 @@ class NetEvent : public LineInfo {
NetScope* scope(); NetScope* scope();
const NetScope* scope() const; const NetScope* scope() const;
NetEvent* find_similar_event();
private: private:
string name_; string name_;
@ -1479,6 +1485,7 @@ class NetEvProbe : public NetNode {
~NetEvProbe(); ~NetEvProbe();
edge_t edge() const; edge_t edge() const;
NetEvent* event();
const NetEvent* event() const; const NetEvent* event() const;
virtual void emit_node(ostream&, struct target_t*) const; virtual void emit_node(ostream&, struct target_t*) const;
@ -2575,6 +2582,9 @@ extern ostream& operator << (ostream&, NetNet::Type);
/* /*
* $Log: netlist.h,v $ * $Log: netlist.h,v $
* Revision 1.139 2000/05/27 19:33:23 steve
* Merge similar probes within a module.
*
* Revision 1.138 2000/05/11 23:37:27 steve * Revision 1.138 2000/05/11 23:37:27 steve
* Add support for procedural continuous assignment. * Add support for procedural continuous assignment.
* *