@@ -1958,7 +1958,10 @@ def assure_length(text, length, left = False):
19581958 if left :
19591959 return text + " " * (length - len (text ))
19601960 return " " * (length - len (text )) + text
1961-
1961+
1962+ def nesting_delta (s ):
1963+ return s .count ("{" ) - s .count ("}" )
1964+
19621965def parse_header (source ):
19631966 debug ("Parsing " + source .name + ".pyh" ,1 )
19641967 source_file = open (source .name + ".pyh" , "r" )
@@ -1976,12 +1979,13 @@ def parse_header(source):
19761979 i = 0
19771980
19781981 namespaces = []
1979- class_ = None
1982+ classes = []
19801983 private_segment = False
19811984
19821985 while i < len (source_text ):
19831986 line = source_text [i ].replace ("YOSYS_NAMESPACE_BEGIN" , " namespace YOSYS_NAMESPACE{" ).replace ("YOSYS_NAMESPACE_END" ," }" )
19841987 ugly_line = unpretty_string (line )
1988+ debug (f"READ:>> { line } " , 2 )
19851989
19861990 # for anonymous unions, ignore union enclosure by skipping start line and replacing end line with new line
19871991 if 'union {' in line :
@@ -2004,15 +2008,15 @@ def parse_header(source):
20042008 continue
20052009
20062010 if len (namespaces ) != 0 :
2007- namespaces [- 1 ] = (namespaces [- 1 ][0 ], namespaces [- 1 ][1 ] + ugly_line . count ( "{" ) - ugly_line . count ( "}" ))
2011+ namespaces [- 1 ] = (namespaces [- 1 ][0 ], namespaces [- 1 ][1 ] + nesting_delta ( ugly_line ))
20082012 if namespaces [- 1 ][1 ] == 0 :
20092013 debug ("-----END NAMESPACE " + concat_namespace (namespaces ) + "-----" ,3 )
2010- del namespaces [ - 1 ]
2014+ namespaces . pop ()
20112015 i += 1
20122016 continue
20132017
2014- if class_ == None and (str .startswith (ugly_line , "struct " ) or str .startswith (ugly_line , "class" )) and ugly_line .count (";" ) == 0 :
2015-
2018+ if (str .startswith (ugly_line , "struct " ) or str .startswith (ugly_line , "class" )) and ugly_line .count (";" ) == 0 :
2019+ # Opening a record declaration which isn't a forward declaration
20162020 struct_name = ugly_line .split (" " )[1 ].split ("::" )[- 1 ]
20172021 impl_namespaces = ugly_line .split (" " )[1 ].split ("::" )[:- 1 ]
20182022 complete_namespace = concat_namespace (namespaces )
@@ -2030,25 +2034,30 @@ def parse_header(source):
20302034 debug ("\t " + struct_name + " is derived from " + base_class_name ,2 )
20312035 base_class = class_by_name (base_class_name )
20322036
2033- class_ = (class_by_name (struct_name ), ugly_line .count ("{" ))#calc_ident(line))
2037+ c = (class_by_name (struct_name ), ugly_line .count ("{" ))#calc_ident(line))
2038+ debug (f"switch to { struct_name } in namespace { namespaces } " , 2 )
20342039 if struct_name in classnames :
2035- class_ [0 ].namespace = complete_namespace
2036- class_ [0 ].base_class = base_class
2040+ c [0 ].namespace = complete_namespace
2041+ c [0 ].base_class = base_class
2042+ classes .append (c )
20372043 i += 1
20382044 continue
20392045
2040- if class_ != None :
2041- class_ = (class_ [0 ], class_ [1 ] + ugly_line .count ("{" ) - ugly_line .count ("}" ))
2042- if class_ [1 ] == 0 :
2043- if class_ [0 ] == None :
2046+ if len (classes ):
2047+ c = (classes [- 1 ][0 ], classes [- 1 ][1 ] + nesting_delta (ugly_line ))
2048+ classes [- 1 ] = c
2049+ if c [1 ] == 0 :
2050+ if c [0 ] == None :
20442051 debug ("\t Exiting unknown class" , 3 )
20452052 else :
2046- debug ("\t Exiting class " + class_ [0 ].name , 3 )
2047- class_ = None
2053+ debug ("\t Exiting class " + c [0 ].name , 3 )
2054+ classes . pop ()
20482055 private_segment = False
20492056 i += 1
20502057 continue
20512058
2059+ class_ = classes [- 1 ] if classes else None
2060+
20522061 if class_ != None and (line .find ("private:" ) != - 1 or line .find ("protected:" ) != - 1 ):
20532062 private_segment = True
20542063 i += 1
@@ -2156,18 +2165,19 @@ def parse_header(source):
21562165 line = source_text [i ].replace ("YOSYS_NAMESPACE_BEGIN" , " namespace YOSYS_NAMESPACE{" ).replace ("YOSYS_NAMESPACE_END" ," }" )
21572166 ugly_line = unpretty_string (line )
21582167 if len (namespaces ) != 0 :
2159- namespaces [- 1 ] = (namespaces [- 1 ][0 ], namespaces [- 1 ][1 ] + ugly_line . count ( "{" ) - ugly_line . count ( "}" ))
2168+ namespaces [- 1 ] = (namespaces [- 1 ][0 ], namespaces [- 1 ][1 ] + nesting_delta ( ugly_line ))
21602169 if namespaces [- 1 ][1 ] == 0 :
21612170 debug ("-----END NAMESPACE " + concat_namespace (namespaces ) + "-----" ,3 )
2162- del namespaces [- 1 ]
2163- if class_ != None :
2164- class_ = (class_ [0 ] , class_ [1 ] + ugly_line .count ("{" ) - ugly_line .count ("}" ))
2165- if class_ [1 ] == 0 :
2166- if class_ [0 ] == None :
2171+ namespaces .pop ()
2172+ if len (classes ):
2173+ c = (classes [- 1 ][0 ] , classes [- 1 ][1 ] + nesting_delta (ugly_line ))
2174+ classes [- 1 ] = c
2175+ if c [1 ] == 0 :
2176+ if c [0 ] == None :
21672177 debug ("\t Exiting unknown class" , 3 )
21682178 else :
2169- debug ("\t Exiting class " + class_ [0 ].name , 3 )
2170- class_ = None
2179+ debug ("\t Exiting class " + c [0 ].name , 3 )
2180+ classes . pop ()
21712181 private_segment = False
21722182 i += 1
21732183 else :
0 commit comments