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: