Skip to content

Commit 8fda361

Browse files
committed
[SAI-PTF] Convert generated enum code from ctypesgen into pythoon enum class
why When ctypesgen generated the python code for c++ enum, the python cannot be logged by it enum name, we need to change it to enum class. the code like ```C++ /** * @brief SAI common API type */ typedef enum _sai_common_api_t { SAI_COMMON_API_CREATE = 0, SAI_COMMON_API_REMOVE = 1, SAI_COMMON_API_SET = 2, SAI_COMMON_API_GET = 3, SAI_COMMON_API_BULK_CREATE = 4, SAI_COMMON_API_BULK_REMOVE = 5, SAI_COMMON_API_BULK_SET = 6, SAI_COMMON_API_BULK_GET = 7, SAI_COMMON_API_MAX = 8, } sai_common_api_t; ``` original converted by ctypesgen ``` enum__sai_common_api_t = c_int# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_CREATE = 0# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_REMOVE = 1# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_SET = 2# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_GET = 3# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_CREATE = 4# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_REMOVE = 5# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_SET = 6# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_GET = 7# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_MAX = 8# /usr/include/sai/saitypes.h: 183 sai_common_api_t = enum__sai_common_api_t# /usr/include/sai/saitypes.h: 183 enum__sai_object_type_t = c_int# /usr/include/sai/saitypes.h: 294 ``` new code ``` class sai_common_api(SAIEnum): SAI_COMMON_API_CREATE = 0# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_REMOVE = 1# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_SET = 2# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_GET = 3# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_CREATE = 4# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_REMOVE = 5# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_SET = 6# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_BULK_GET = 7# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_MAX = 8# /usr/include/sai/saitypes.h: 183 SAI_COMMON_API_CREATE = sai_common_api.SAI_COMMON_API_CREATE SAI_COMMON_API_REMOVE = sai_common_api.SAI_COMMON_API_REMOVE SAI_COMMON_API_SET = sai_common_api.SAI_COMMON_API_SET SAI_COMMON_API_GET = sai_common_api.SAI_COMMON_API_GET SAI_COMMON_API_BULK_CREATE = sai_common_api.SAI_COMMON_API_BULK_CREATE SAI_COMMON_API_BULK_REMOVE = sai_common_api.SAI_COMMON_API_BULK_REMOVE SAI_COMMON_API_BULK_SET = sai_common_api.SAI_COMMON_API_BULK_SET SAI_COMMON_API_BULK_GET = sai_common_api.SAI_COMMON_API_BULK_GET SAI_COMMON_API_MAX = sai_common_api.SAI_COMMON_API_MAX ``` how Convert the python code after generated from ctypesgen verify pipeline local testing Signed-off-by: richardyu-ms <[email protected]>
1 parent f12d9e3 commit 8fda361

File tree

3 files changed

+149
-1
lines changed

3 files changed

+149
-1
lines changed

meta/templates/sai_adapter_utils.tt

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ from functools import wraps
1010
[%- BLOCK invocation_logger_imports %]
1111
import inspect
1212
import logging
13+
from functools import wraps
1314
[% END -%]
1415

1516
[%- ######################################################################## -%]
@@ -180,7 +181,7 @@ def invocation_logger(func):
180181
SAI interface invocation logger.
181182
Use it to log all the invocated method in this sai_adapater.
182183
"""
183-
184+
@wraps(func)
184185
def inner_logger(*args, **kwargs):
185186

186187
args_name = inspect.getargspec(func)[0]

test/saithriftv2/Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ $(PY_SOURCES): $(METADIR)sai.thrift
8383

8484
$(SAI_PY_HEADERS): $(SAI_HEADERS)
8585
$(CTYPESGEN) --output-language=py32 -I/usr/include -I$(SAI_HEADER_DIR) -I../../experimental --include /usr/include/linux/limits.h $^ -o $@
86+
python3 convert_header.py -i $(SAI_PY_HEADERS) -o ./new_header.py
87+
mv $(SAI_PY_HEADERS) ./sai_headers.py.bk
88+
mv ./new_header.py $(SAI_PY_HEADERS)
8689

8790
$(ODIR)/%.o: gen-cpp/%.cpp meta
8891
$(CXX) $(CPPFLAGS) -c $< -o $@ -I../../meta

test/saithriftv2/convert_header.py

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import logging
2+
import argparse
3+
4+
"""
5+
Convert the generated code in sai_header.py.
6+
For the generated code from c++ enum, convert it to python enum class.
7+
8+
the code like
9+
```C++
10+
/**
11+
* @brief SAI common API type
12+
*/
13+
typedef enum _sai_common_api_t
14+
{
15+
SAI_COMMON_API_CREATE = 0,
16+
SAI_COMMON_API_REMOVE = 1,
17+
...
18+
} sai_common_api_t;
19+
```
20+
original converted by ctypesgen
21+
```
22+
enum__sai_common_api_t = c_int# /usr/include/sai/saitypes.h: 183
23+
24+
SAI_COMMON_API_CREATE = 0# /usr/include/sai/saitypes.h: 183
25+
26+
SAI_COMMON_API_REMOVE = 1# /usr/include/sai/saitypes.h: 183
27+
...
28+
```
29+
new code
30+
```
31+
class sai_common_api(SAIEnum):
32+
33+
SAI_COMMON_API_CREATE = 0# /usr/include/sai/saitypes.h: 183
34+
35+
SAI_COMMON_API_REMOVE = 1# /usr/include/sai/saitypes.h: 183
36+
...
37+
38+
SAI_COMMON_API_CREATE = sai_common_api.SAI_COMMON_API_CREATE
39+
SAI_COMMON_API_REMOVE = sai_common_api.SAI_COMMON_API_REMOVE
40+
...
41+
```
42+
43+
"""
44+
45+
def parse_param():
46+
'''
47+
Parse param.
48+
'''
49+
parser = argparse.ArgumentParser(
50+
description="""
51+
Convert python file after ctypesgen convert.
52+
"""
53+
)
54+
55+
parser.add_argument(
56+
"-i", type=str, dest="input_file",
57+
help="input file name", required=True)
58+
parser.add_argument(
59+
"-o", type=str, dest="output_file",
60+
help="output file name", required=True)
61+
return parser.parse_args()
62+
63+
def import_and_enum_define():
64+
"""
65+
import and add the enum class definitation.
66+
"""
67+
def_str = "import enum\r\nclass SAIEnum(enum.IntEnum):\r\n def __str__(self):\r\n return super().__str__().split(\".\")[1]\r\n"
68+
return def_str
69+
70+
def convert_enum_start_to_class(line):
71+
"""
72+
Convert the enum to class.
73+
args:
74+
line: input
75+
"""
76+
class_name = line.strip("enum__").split("_t = c_int", 1)[0]
77+
return class_name
78+
79+
def convert_file(input_file_name, output_file_name):
80+
"""
81+
Convert the input file to a output file.
82+
83+
"""
84+
input_file = open(input_file_name, 'r')
85+
output_file = open(output_file_name, 'w')
86+
enum_times = 0
87+
enum_items = []
88+
enum_start = False
89+
class_name = None
90+
91+
Lines = input_file.readlines()
92+
for line in Lines:
93+
if not enum_start and enum_times == 0 and "enum__sai_" in line and "= c_int" in line:
94+
# first time hit a enum
95+
# add import
96+
output_file.write(import_and_enum_define())
97+
enum_times= enum_times + 1
98+
enum_start = True
99+
enum_items = []
100+
output_file.write("\n")
101+
class_name = convert_enum_start_to_class(line)
102+
output_file.writelines("class {}(SAIEnum):\n".format(class_name))
103+
output_file.flush()
104+
continue
105+
elif not enum_start and enum_times > 0 and "enum__sai_" in line and "= c_int" in line:
106+
enum_times= enum_times + 1
107+
enum_start = True
108+
enum_items = []
109+
output_file.write("\n")
110+
class_name = convert_enum_start_to_class(line)
111+
output_file.writelines("class {}(SAIEnum):\n".format(class_name))
112+
output_file.flush()
113+
continue
114+
elif enum_start and " = enum__sai_" not in line and "SAI" in line:
115+
line = line.split("\n", 1)[0]
116+
enum_name = line.split(" =", 1)[0]
117+
enum_items.append(enum_name)
118+
output_file.write(" {}\n".format(line))
119+
output_file.flush()
120+
continue
121+
elif " = enum__sai_" in line:
122+
enum_start = False
123+
output_file.write("\n")
124+
for item in enum_items:
125+
output_file.write("{} = {}.{}".format(item, class_name, item))
126+
output_file.write("\n")
127+
output_file.write("\n")
128+
output_file.flush()
129+
continue
130+
else:
131+
output_file.writelines(line)
132+
133+
134+
output_file.flush()
135+
input_file.close()
136+
output_file.close()
137+
138+
139+
if __name__ == "__main__":
140+
'''
141+
For the generated code from c++ enum, convert it to python enum class.
142+
'''
143+
args = parse_param()
144+
convert_file(args.input_file, args.output_file)

0 commit comments

Comments
 (0)