Skip to content

Commit 799497e

Browse files
authored
Merge pull request #4671 from YosysHQ/emil/const-deref-pyosys
py_wrap: implement nested class definitions
2 parents 67e5c4b + 49d8a35 commit 799497e

File tree

2 files changed

+35
-31
lines changed

2 files changed

+35
-31
lines changed

kernel/rtlil.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,9 @@ namespace RTLIL
5353
CONST_FLAG_NONE = 0,
5454
CONST_FLAG_STRING = 1,
5555
CONST_FLAG_SIGNED = 2, // only used for parameters
56-
CONST_FLAG_REAL = 4, // only used for parameters
56+
CONST_FLAG_REAL = 4 // only used for parameters
5757
};
5858

59-
// // Union discriminator. Values are exclusive
60-
// enum ConstRepr : unsigned char {
61-
// CONST_REPR_BITS = 1,
62-
// CONST_REPR_STRING = 2,
63-
// };
64-
6559
struct Const;
6660
struct AttrObject;
6761
struct Selection;
@@ -666,7 +660,7 @@ namespace RTLIL
666660

667661
struct RTLIL::Const
668662
{
669-
short flags;
663+
short int flags;
670664
private:
671665
friend class KernelRtlilTest;
672666
FRIEND_TEST(KernelRtlilTest, ConstStr);

misc/py_wrap_generator.py

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
19621965
def 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("\tExiting unknown class", 3)
20452052
else:
2046-
debug("\tExiting class " + class_[0].name, 3)
2047-
class_ = None
2053+
debug("\tExiting 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("\tExiting unknown class", 3)
21682178
else:
2169-
debug("\tExiting class " + class_[0].name, 3)
2170-
class_ = None
2179+
debug("\tExiting class " + c[0].name, 3)
2180+
classes.pop()
21712181
private_segment = False
21722182
i += 1
21732183
else:

0 commit comments

Comments
 (0)