diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index d21b8f02d..6852ef5d3 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -41,6 +41,8 @@ namespace AST { std::string current_filename; void (*set_line_num)(int) = NULL; int (*get_line_num)() = NULL; + unsigned long long astnodes = 0; + unsigned long long astnode_count() { return astnodes; } } // instantiate global variables (private API) @@ -204,6 +206,7 @@ AstNode::AstNode(AstNodeType type, AstNode *child1, AstNode *child2, AstNode *ch static unsigned int hashidx_count = 123456789; hashidx_count = mkhash_xorshift(hashidx_count); hashidx_ = hashidx_count; + astnodes++; this->type = type; filename = current_filename; @@ -292,6 +295,7 @@ void AstNode::delete_children() // AstNode destructor AstNode::~AstNode() { + astnodes--; delete_children(); } diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h index 6c4a1e15a..bdff015e3 100644 --- a/frontends/ast/ast.h +++ b/frontends/ast/ast.h @@ -410,6 +410,9 @@ namespace AST extern void (*set_line_num)(int); extern int (*get_line_num)(); + // for stats + unsigned long long astnode_count(); + // set set_line_num and get_line_num to internal dummy functions (done by simplify() and AstModule::derive // to control the filename and linenum properties of new nodes not generated by a frontend parser) void use_internal_line_num(); diff --git a/passes/cmds/internal_stats.cc b/passes/cmds/internal_stats.cc index 8cd62efb6..cc35dcc5f 100644 --- a/passes/cmds/internal_stats.cc +++ b/passes/cmds/internal_stats.cc @@ -25,6 +25,7 @@ #include "kernel/celltypes.h" #include "passes/techmap/libparse.h" #include "kernel/cost.h" +#include "frontends/ast/ast.h" #include "libs/json11/json11.hpp" #if defined(__APPLE__) && defined(__MACH__) @@ -105,6 +106,8 @@ struct InternalStatsPass : public Pass { if (auto mem = current_mem_bytes()) { log(" \"memory_now\": %s,\n", std::to_string(*mem).c_str()); } + auto ast_bytes = AST::astnode_count() * (unsigned long long) sizeof(AST::AstNode); + log(" \"memory_ast\": %s,\n", std::to_string(ast_bytes).c_str()); } // stats go here