mirror of
https://github.com/YosysHQ/yosys
synced 2025-05-11 01:35:49 +00:00
Merge a5458d21ef
into 6378ba10eb
This commit is contained in:
commit
61e9f771fb
6 changed files with 170 additions and 84 deletions
|
@ -248,6 +248,9 @@ AstNode::AstNode(AstNodeType type, AstNode *child1, AstNode *child2, AstNode *ch
|
|||
children.push_back(child4);
|
||||
|
||||
fixup_hierarchy_flags();
|
||||
#ifdef ASTNODE_GC
|
||||
Tagger::get().reg(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
// create a (deep recursive) copy of a node
|
||||
|
@ -283,12 +286,28 @@ void AstNode::cloneInto(AstNode *other) const
|
|||
// delete all children in this node
|
||||
void AstNode::delete_children()
|
||||
{
|
||||
#ifdef ASTNODE_GC
|
||||
for (auto &it : children)
|
||||
if (Tagger::get().nodes.count(it))
|
||||
delete it;
|
||||
// else
|
||||
// log("skip child %p\n", it);
|
||||
#else
|
||||
for (auto &it : children)
|
||||
delete it;
|
||||
#endif
|
||||
children.clear();
|
||||
|
||||
#ifdef ASTNODE_GC
|
||||
for (auto &it : attributes)
|
||||
if (Tagger::get().nodes.count(it.second))
|
||||
delete it.second;
|
||||
// else
|
||||
// log("skip attr %p\n", it.second);
|
||||
#else
|
||||
for (auto &it : attributes)
|
||||
delete it.second;
|
||||
#endif
|
||||
attributes.clear();
|
||||
}
|
||||
|
||||
|
@ -296,7 +315,14 @@ void AstNode::delete_children()
|
|||
AstNode::~AstNode()
|
||||
{
|
||||
astnodes--;
|
||||
#ifdef ASTNODE_GC
|
||||
Tagger::get().unreg(this);
|
||||
#endif
|
||||
delete_children();
|
||||
if (yosys_xtrace) {
|
||||
log("DESTR %X %p\n", hashidx_, this);
|
||||
log_backtrace("", yosys_xtrace-1);
|
||||
}
|
||||
}
|
||||
|
||||
// create a nice text representation of the node
|
||||
|
|
|
@ -467,6 +467,71 @@ namespace AST_INTERNAL
|
|||
AST::AstNode *original_ast = nullptr);
|
||||
}
|
||||
|
||||
#undef ASTNODE_GC
|
||||
#ifdef ASTNODE_GC
|
||||
struct Tagger {
|
||||
std::set<AST::AstNode*> nodes;
|
||||
std::set<AST::AstNode*> tagged;
|
||||
static Tagger& get() {
|
||||
static Tagger instance;
|
||||
return instance;
|
||||
}
|
||||
void reg(AST::AstNode* p) {
|
||||
if (!p)
|
||||
return;
|
||||
log_assert(!nodes.count(p));
|
||||
nodes.insert(p);
|
||||
}
|
||||
void unreg(AST::AstNode* p) {
|
||||
if (!p || !nodes.count(p))
|
||||
return;
|
||||
nodes.erase(p);
|
||||
}
|
||||
void tag(AST::AstNode* p) {
|
||||
if (!p)
|
||||
return;
|
||||
tagged.insert(p);
|
||||
for (AST::AstNode* c : p->children)
|
||||
tag(c);
|
||||
for (auto x : p->attributes)
|
||||
tag(x.second);
|
||||
tag(p->id2ast);
|
||||
}
|
||||
void clear() {
|
||||
tagged.clear();
|
||||
}
|
||||
void dump_untagged() {
|
||||
Yosys::log("Dumping untagged:\n");
|
||||
for (auto p : nodes) {
|
||||
if (!tagged.count(p)) {
|
||||
Yosys::log(">> %p\n", p);
|
||||
p->dumpAst(stdout, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
void shadow_kill(AST::AstNode* p) {
|
||||
if (!p || !nodes.count(p))
|
||||
return;
|
||||
for (AST::AstNode* c : p->children)
|
||||
shadow_kill(c);
|
||||
for (auto x : p->attributes)
|
||||
shadow_kill(x.second);
|
||||
shadow_kill(p->id2ast);
|
||||
delete p;
|
||||
}
|
||||
void kill_untagged() {
|
||||
auto copy = nodes;
|
||||
while (!copy.empty()) {
|
||||
AST::AstNode* p = *(copy.begin());
|
||||
copy.erase(p);
|
||||
if (!tagged.count(p)) {
|
||||
shadow_kill(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
#endif // ASTNODE_GC
|
||||
|
||||
YOSYS_NAMESPACE_END
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue