From 1372c47036ec428a412f62287e945223e28b2df4 Mon Sep 17 00:00:00 2001
From: "Emil J. Tywoniak" <emil@tywoniak.eu>
Date: Wed, 11 Sep 2024 11:34:20 +0200
Subject: [PATCH] internal_stats: astnode (sizeof)

---
 frontends/ast/ast.cc          | 4 ++++
 frontends/ast/ast.h           | 3 +++
 passes/cmds/internal_stats.cc | 3 +++
 3 files changed, 10 insertions(+)

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 fe27bee5e..7dcb9fa85 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