diff --git a/kernel/rtlil.h b/kernel/rtlil.h
index eaaae814d..0f3984ab8 100644
--- a/kernel/rtlil.h
+++ b/kernel/rtlil.h
@@ -53,15 +53,9 @@ namespace RTLIL
 		CONST_FLAG_NONE   = 0,
 		CONST_FLAG_STRING = 1,
 		CONST_FLAG_SIGNED = 2,  // only used for parameters
-		CONST_FLAG_REAL   = 4,  // only used for parameters
+		CONST_FLAG_REAL   = 4   // only used for parameters
 	};
 
-	// // Union discriminator. Values are exclusive
-	// enum ConstRepr : unsigned char {
-	// 	CONST_REPR_BITS   = 1,
-	// 	CONST_REPR_STRING = 2,
-	// };
-
 	struct Const;
 	struct AttrObject;
 	struct Selection;
@@ -666,7 +660,7 @@ namespace RTLIL
 
 struct RTLIL::Const
 {
-	short flags;
+	short int flags;
 private:
 	friend class KernelRtlilTest;
 	FRIEND_TEST(KernelRtlilTest, ConstStr);
diff --git a/misc/py_wrap_generator.py b/misc/py_wrap_generator.py
index a65d24d92..91a82081a 100644
--- a/misc/py_wrap_generator.py
+++ b/misc/py_wrap_generator.py
@@ -1958,7 +1958,10 @@ def assure_length(text, length, left = False):
 	if left:
 		return text + " "*(length - len(text))
 	return " "*(length - len(text)) + text
-	
+
+def nesting_delta(s):
+	return s.count("{") - s.count("}")
+
 def parse_header(source):
 	debug("Parsing " + source.name + ".pyh",1)
 	source_file = open(source.name + ".pyh", "r")
@@ -1976,12 +1979,13 @@ def parse_header(source):
 	i = 0
 
 	namespaces = []
-	class_ = None
+	classes = []
 	private_segment = False
 
 	while i < len(source_text):
 		line = source_text[i].replace("YOSYS_NAMESPACE_BEGIN", "                    namespace YOSYS_NAMESPACE{").replace("YOSYS_NAMESPACE_END","                    }")
 		ugly_line = unpretty_string(line)
+		debug(f"READ:>> {line}", 2)
 
 		# for anonymous unions, ignore union enclosure by skipping start line and replacing end line with new line
 		if 'union {' in line:
@@ -2004,15 +2008,15 @@ def parse_header(source):
 			continue
 
 		if len(namespaces) != 0:
-			namespaces[-1] = (namespaces[-1][0], namespaces[-1][1] + ugly_line.count("{") - ugly_line.count("}"))
+			namespaces[-1] = (namespaces[-1][0], namespaces[-1][1] + nesting_delta(ugly_line))
 			if namespaces[-1][1] == 0:
 				debug("-----END NAMESPACE " + concat_namespace(namespaces) + "-----",3)
-				del namespaces[-1]
+				namespaces.pop()
 				i += 1
 				continue
 
-		if class_ == None and (str.startswith(ugly_line, "struct ") or str.startswith(ugly_line, "class")) and ugly_line.count(";") == 0:
-
+		if (str.startswith(ugly_line, "struct ") or str.startswith(ugly_line, "class")) and ugly_line.count(";") == 0:
+			# Opening a record declaration which isn't a forward declaration
 			struct_name = ugly_line.split(" ")[1].split("::")[-1]
 			impl_namespaces = ugly_line.split(" ")[1].split("::")[:-1]
 			complete_namespace = concat_namespace(namespaces)
@@ -2030,25 +2034,30 @@ def parse_header(source):
 				debug("\t  " + struct_name + " is derived from " + base_class_name,2)
 			base_class = class_by_name(base_class_name)
 
-			class_ = (class_by_name(struct_name), ugly_line.count("{"))#calc_ident(line))
+			c = (class_by_name(struct_name), ugly_line.count("{"))#calc_ident(line))
+			debug(f"switch to {struct_name} in namespace {namespaces}", 2)
 			if struct_name in classnames:
-				class_[0].namespace = complete_namespace
-				class_[0].base_class = base_class
+				c[0].namespace = complete_namespace
+				c[0].base_class = base_class
+			classes.append(c)
 			i += 1
 			continue
 
-		if class_ != None:
-			class_ = (class_[0], class_[1] + ugly_line.count("{") - ugly_line.count("}"))
-			if class_[1] == 0:
-				if class_[0] == None:
+		if len(classes):
+			c = (classes[-1][0], classes[-1][1] + nesting_delta(ugly_line))
+			classes[-1] = c
+			if c[1] == 0:
+				if c[0] == None:
 					debug("\tExiting unknown class", 3)
 				else:
-					debug("\tExiting class " + class_[0].name, 3)
-				class_ = None
+					debug("\tExiting class " + c[0].name, 3)
+				classes.pop()
 				private_segment = False
 				i += 1
 				continue
 
+		class_ = classes[-1] if classes else None
+
 		if class_ != None and (line.find("private:") != -1 or line.find("protected:") != -1):
 			private_segment = True
 			i += 1
@@ -2156,18 +2165,19 @@ def parse_header(source):
 				line = source_text[i].replace("YOSYS_NAMESPACE_BEGIN", "                    namespace YOSYS_NAMESPACE{").replace("YOSYS_NAMESPACE_END","                    }")
 				ugly_line = unpretty_string(line)
 				if len(namespaces) != 0:
-					namespaces[-1] = (namespaces[-1][0], namespaces[-1][1] + ugly_line.count("{") - ugly_line.count("}"))
+					namespaces[-1] = (namespaces[-1][0], namespaces[-1][1] + nesting_delta(ugly_line))
 					if namespaces[-1][1] == 0:
 						debug("-----END NAMESPACE " + concat_namespace(namespaces) + "-----",3)
-						del namespaces[-1]
-				if class_ != None:
-					class_ = (class_[0] , class_[1] + ugly_line.count("{") - ugly_line.count("}"))
-					if class_[1] == 0:
-						if class_[0] == None:
+						namespaces.pop()
+				if len(classes):
+					c = (classes[-1][0] , classes[-1][1] + nesting_delta(ugly_line))
+					classes[-1] = c
+					if c[1] == 0:
+						if c[0] == None:
 							debug("\tExiting unknown class", 3)
 						else:
-							debug("\tExiting class " + class_[0].name, 3)
-						class_ = None
+							debug("\tExiting class " + c[0].name, 3)
+						classes.pop()
 						private_segment = False
 			i += 1
 		else: