xref: /openbmc/qemu/scripts/qapi/features.py (revision 54e91d1523b412b4cff7cb36c898fa9dc133e886)
1*2ebb09f3SDaniel P. Berrangé"""
2*2ebb09f3SDaniel P. BerrangéQAPI features generator
3*2ebb09f3SDaniel P. Berrangé
4*2ebb09f3SDaniel P. BerrangéCopyright 2024 Red Hat
5*2ebb09f3SDaniel P. Berrangé
6*2ebb09f3SDaniel P. BerrangéThis work is licensed under the terms of the GNU GPL, version 2.
7*2ebb09f3SDaniel P. Berrangé# See the COPYING file in the top-level directory.
8*2ebb09f3SDaniel P. Berrangé"""
9*2ebb09f3SDaniel P. Berrangé
10*2ebb09f3SDaniel P. Berrangéfrom typing import ValuesView
11*2ebb09f3SDaniel P. Berrangé
12*2ebb09f3SDaniel P. Berrangéfrom .common import c_enum_const, c_name
13*2ebb09f3SDaniel P. Berrangéfrom .gen import QAPISchemaMonolithicCVisitor
14*2ebb09f3SDaniel P. Berrangéfrom .schema import QAPISchema, QAPISchemaFeature
15*2ebb09f3SDaniel P. Berrangé
16*2ebb09f3SDaniel P. Berrangé
17*2ebb09f3SDaniel P. Berrangéclass QAPISchemaGenFeatureVisitor(QAPISchemaMonolithicCVisitor):
18*2ebb09f3SDaniel P. Berrangé
19*2ebb09f3SDaniel P. Berrangé    def __init__(self, prefix: str):
20*2ebb09f3SDaniel P. Berrangé        super().__init__(
21*2ebb09f3SDaniel P. Berrangé            prefix, 'qapi-features',
22*2ebb09f3SDaniel P. Berrangé            ' * Schema-defined QAPI features',
23*2ebb09f3SDaniel P. Berrangé            __doc__)
24*2ebb09f3SDaniel P. Berrangé
25*2ebb09f3SDaniel P. Berrangé        self.features: ValuesView[QAPISchemaFeature]
26*2ebb09f3SDaniel P. Berrangé
27*2ebb09f3SDaniel P. Berrangé    def visit_begin(self, schema: QAPISchema) -> None:
28*2ebb09f3SDaniel P. Berrangé        self.features = schema.features()
29*2ebb09f3SDaniel P. Berrangé        self._genh.add("#include \"qapi/util.h\"\n\n")
30*2ebb09f3SDaniel P. Berrangé
31*2ebb09f3SDaniel P. Berrangé    def visit_end(self) -> None:
32*2ebb09f3SDaniel P. Berrangé        self._genh.add("typedef enum {\n")
33*2ebb09f3SDaniel P. Berrangé        for f in self.features:
34*2ebb09f3SDaniel P. Berrangé            self._genh.add(f"    {c_enum_const('qapi_feature', f.name)}")
35*2ebb09f3SDaniel P. Berrangé            if f.name in QAPISchemaFeature.SPECIAL_NAMES:
36*2ebb09f3SDaniel P. Berrangé                self._genh.add(f" = {c_enum_const('qapi', f.name)},\n")
37*2ebb09f3SDaniel P. Berrangé            else:
38*2ebb09f3SDaniel P. Berrangé                self._genh.add(",\n")
39*2ebb09f3SDaniel P. Berrangé
40*2ebb09f3SDaniel P. Berrangé        self._genh.add("} " + c_name('QapiFeature') + ";\n")
41*2ebb09f3SDaniel P. Berrangé
42*2ebb09f3SDaniel P. Berrangé
43*2ebb09f3SDaniel P. Berrangédef gen_features(schema: QAPISchema,
44*2ebb09f3SDaniel P. Berrangé                 output_dir: str,
45*2ebb09f3SDaniel P. Berrangé                 prefix: str) -> None:
46*2ebb09f3SDaniel P. Berrangé    vis = QAPISchemaGenFeatureVisitor(prefix)
47*2ebb09f3SDaniel P. Berrangé    schema.visit(vis)
48*2ebb09f3SDaniel P. Berrangé    vis.write(output_dir)
49