Remove the now obsolete NetNet list in NetScopes.
Now that NetNet objects in NetScopes are kept in a map, remove the linked list for scanning them. This improves the lookup process from an O(e**N) process to more like O(log(N)). This matters for very large designs.
This commit is contained in:
parent
0af896a7ff
commit
27410f5d88
|
|
@ -1148,12 +1148,9 @@ void NetScope::dump(ostream&o) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dump the signals,
|
// Dump the signals,
|
||||||
if (signals_) {
|
for (signals_map_iter_t cur = signals_map_.begin()
|
||||||
NetNet*cur = signals_->sig_next_;
|
; cur != signals_map_.end() ; cur ++) {
|
||||||
do {
|
cur->second->dump_net(o, 4);
|
||||||
cur->dump_net(o, 4);
|
|
||||||
cur = cur->sig_next_;
|
|
||||||
} while (cur != signals_->sig_next_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dump specparams
|
// Dump specparams
|
||||||
|
|
|
||||||
29
emit.cc
29
emit.cc
|
|
@ -373,23 +373,20 @@ void NetScope::emit_scope(struct target_t*tgt) const
|
||||||
for (NetScope*cur = sub_ ; cur ; cur = cur->sib_)
|
for (NetScope*cur = sub_ ; cur ; cur = cur->sib_)
|
||||||
cur->emit_scope(tgt);
|
cur->emit_scope(tgt);
|
||||||
|
|
||||||
if (signals_) {
|
for (signals_map_iter_t cur = signals_map_.begin()
|
||||||
NetNet*cur = signals_->sig_next_;
|
; cur != signals_map_.end() ; cur ++) {
|
||||||
do {
|
tgt->signal(cur->second);
|
||||||
tgt->signal(cur);
|
}
|
||||||
cur = cur->sig_next_;
|
|
||||||
} while (cur != signals_->sig_next_);
|
|
||||||
|
|
||||||
/* Run the signals again, but this time to connect the
|
// Run the signals again, but this time to connect the
|
||||||
delay paths. This is done as a second pass because
|
// delay paths. This is done as a second pass because
|
||||||
the paths reference other signals that may be later
|
// the paths reference other signals that may be later
|
||||||
in the list. We can do it here because delay paths are
|
// in the list. We can do it here because delay paths are
|
||||||
always connected within the scope. */
|
// always connected within the scope.
|
||||||
cur = signals_->sig_next_;
|
for (signals_map_iter_t cur = signals_map_.begin()
|
||||||
do {
|
; cur != signals_map_.end() ; cur ++) {
|
||||||
tgt->signal_paths(cur);
|
|
||||||
cur = cur->sig_next_;
|
tgt->signal_paths(cur->second);
|
||||||
} while (cur != signals_->sig_next_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
18
functor.cc
18
functor.cc
|
|
@ -111,20 +111,12 @@ void NetScope::run_functor(Design*des, functor_t*fun)
|
||||||
|
|
||||||
// apply to signals. Each iteration, allow for the possibility
|
// apply to signals. Each iteration, allow for the possibility
|
||||||
// that the current signal deletes itself.
|
// that the current signal deletes itself.
|
||||||
if (signals_) {
|
|
||||||
unsigned count = 0;
|
|
||||||
NetNet*cur = signals_->sig_next_;
|
|
||||||
do {
|
|
||||||
count += 1;
|
|
||||||
cur = cur->sig_next_;
|
|
||||||
} while (cur != signals_->sig_next_);
|
|
||||||
|
|
||||||
cur = signals_->sig_next_;
|
signals_map_iter_t cur = signals_map_.begin();
|
||||||
for (unsigned idx = 0 ; idx < count ; idx += 1) {
|
while (cur != signals_map_.end()) {
|
||||||
NetNet*tmp = cur->sig_next_;
|
signals_map_iter_t tmp = cur;
|
||||||
fun->signal(des, cur);
|
cur ++;
|
||||||
cur = tmp;
|
fun->signal(des, tmp->second);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
35
net_scope.cc
35
net_scope.cc
|
|
@ -38,7 +38,6 @@
|
||||||
NetScope::NetScope(NetScope*up, const hname_t&n, NetScope::TYPE t)
|
NetScope::NetScope(NetScope*up, const hname_t&n, NetScope::TYPE t)
|
||||||
: type_(t), up_(up), sib_(0), sub_(0)
|
: type_(t), up_(up), sib_(0), sub_(0)
|
||||||
{
|
{
|
||||||
signals_ = 0;
|
|
||||||
events_ = 0;
|
events_ = 0;
|
||||||
lcounter_ = 0;
|
lcounter_ = 0;
|
||||||
is_auto_ = false;
|
is_auto_ = false;
|
||||||
|
|
@ -360,16 +359,6 @@ NetEvent* NetScope::find_event(perm_string name)
|
||||||
|
|
||||||
void NetScope::add_signal(NetNet*net)
|
void NetScope::add_signal(NetNet*net)
|
||||||
{
|
{
|
||||||
if (signals_ == 0) {
|
|
||||||
net->sig_next_ = net;
|
|
||||||
net->sig_prev_ = net;
|
|
||||||
} else {
|
|
||||||
net->sig_next_ = signals_->sig_next_;
|
|
||||||
net->sig_prev_ = signals_;
|
|
||||||
net->sig_next_->sig_prev_ = net;
|
|
||||||
net->sig_prev_->sig_next_ = net;
|
|
||||||
}
|
|
||||||
signals_ = net;
|
|
||||||
signals_map_[net->name()]=net;
|
signals_map_[net->name()]=net;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -377,15 +366,6 @@ void NetScope::rem_signal(NetNet*net)
|
||||||
{
|
{
|
||||||
assert(net->scope() == this);
|
assert(net->scope() == this);
|
||||||
signals_map_.erase(net->name());
|
signals_map_.erase(net->name());
|
||||||
if (signals_ == net)
|
|
||||||
signals_ = net->sig_prev_;
|
|
||||||
|
|
||||||
if (signals_ == net) {
|
|
||||||
signals_ = 0;
|
|
||||||
} else {
|
|
||||||
net->sig_prev_->sig_next_ = net->sig_next_;
|
|
||||||
net->sig_next_->sig_prev_ = net->sig_prev_;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -395,21 +375,10 @@ void NetScope::rem_signal(NetNet*net)
|
||||||
*/
|
*/
|
||||||
NetNet* NetScope::find_signal(perm_string key)
|
NetNet* NetScope::find_signal(perm_string key)
|
||||||
{
|
{
|
||||||
if (signals_ == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (signals_map_.find(key)!=signals_map_.end())
|
if (signals_map_.find(key)!=signals_map_.end())
|
||||||
return signals_map_[key];
|
return signals_map_[key];
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
NetNet*cur = signals_;
|
|
||||||
do {
|
|
||||||
if (cur->name() == key)
|
|
||||||
return cur;
|
|
||||||
cur = cur->sig_prev_;
|
|
||||||
} while (cur != signals_);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -427,7 +427,7 @@ const Link& NetDelaySrc::condit_pin() const
|
||||||
}
|
}
|
||||||
|
|
||||||
NetNet::NetNet(NetScope*s, perm_string n, Type t, unsigned npins)
|
NetNet::NetNet(NetScope*s, perm_string n, Type t, unsigned npins)
|
||||||
: NetObj(s, n, 1), sig_next_(0), sig_prev_(0),
|
: NetObj(s, n, 1),
|
||||||
type_(t), port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE),
|
type_(t), port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE),
|
||||||
signed_(false), isint_(false), discipline_(0), msb_(npins-1), lsb_(0),
|
signed_(false), isint_(false), discipline_(0), msb_(npins-1), lsb_(0),
|
||||||
dimensions_(0),
|
dimensions_(0),
|
||||||
|
|
@ -466,8 +466,7 @@ NetNet::NetNet(NetScope*s, perm_string n, Type t, unsigned npins)
|
||||||
|
|
||||||
NetNet::NetNet(NetScope*s, perm_string n, Type t,
|
NetNet::NetNet(NetScope*s, perm_string n, Type t,
|
||||||
long ms, long ls)
|
long ms, long ls)
|
||||||
: NetObj(s, n, 1),
|
: NetObj(s, n, 1), type_(t),
|
||||||
sig_next_(0), sig_prev_(0), type_(t),
|
|
||||||
port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE), signed_(false),
|
port_type_(NOT_A_PORT), data_type_(IVL_VT_NO_TYPE), signed_(false),
|
||||||
isint_(false), discipline_(0), msb_(ms), lsb_(ls), dimensions_(0), s0_(0), e0_(0),
|
isint_(false), discipline_(0), msb_(ms), lsb_(ls), dimensions_(0), s0_(0), e0_(0),
|
||||||
local_flag_(false), eref_count_(0), lref_count_(0)
|
local_flag_(false), eref_count_(0), lref_count_(0)
|
||||||
|
|
@ -514,7 +513,7 @@ static unsigned calculate_count(long s, long e)
|
||||||
NetNet::NetNet(NetScope*s, perm_string n, Type t,
|
NetNet::NetNet(NetScope*s, perm_string n, Type t,
|
||||||
long ms, long ls, long array_s, long array_e)
|
long ms, long ls, long array_s, long array_e)
|
||||||
: NetObj(s, n, calculate_count(array_s, array_e)),
|
: NetObj(s, n, calculate_count(array_s, array_e)),
|
||||||
sig_next_(0), sig_prev_(0), type_(t), port_type_(NOT_A_PORT),
|
type_(t), port_type_(NOT_A_PORT),
|
||||||
data_type_(IVL_VT_NO_TYPE), signed_(false), isint_(false),
|
data_type_(IVL_VT_NO_TYPE), signed_(false), isint_(false),
|
||||||
discipline_(0), msb_(ms), lsb_(ls), dimensions_(1), s0_(array_s), e0_(array_e),
|
discipline_(0), msb_(ms), lsb_(ls), dimensions_(1), s0_(array_s), e0_(array_e),
|
||||||
local_flag_(false), eref_count_(0), lref_count_(0)
|
local_flag_(false), eref_count_(0), lref_count_(0)
|
||||||
|
|
|
||||||
|
|
@ -614,11 +614,6 @@ class NetNet : public NetObj {
|
||||||
|
|
||||||
virtual void dump_net(ostream&, unsigned) const;
|
virtual void dump_net(ostream&, unsigned) const;
|
||||||
|
|
||||||
private:
|
|
||||||
// The NetScope class uses this for listing signals.
|
|
||||||
friend class NetScope;
|
|
||||||
NetNet*sig_next_, *sig_prev_;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Type type_;
|
Type type_;
|
||||||
PortType port_type_;
|
PortType port_type_;
|
||||||
|
|
@ -861,8 +856,8 @@ class NetScope : public Attrib {
|
||||||
NetNet::Type default_nettype_;
|
NetNet::Type default_nettype_;
|
||||||
|
|
||||||
NetEvent *events_;
|
NetEvent *events_;
|
||||||
|
typedef std::map<perm_string,NetNet*>::const_iterator signals_map_iter_t;
|
||||||
std::map <perm_string,NetNet*> signals_map_;
|
std::map <perm_string,NetNet*> signals_map_;
|
||||||
NetNet *signals_;
|
|
||||||
perm_string module_name_;
|
perm_string module_name_;
|
||||||
union {
|
union {
|
||||||
NetTaskDef*task_;
|
NetTaskDef*task_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue