xref: /aosp_15_r20/external/mesa3d/docs/_exts/nir.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker# Copyright © 2021 Intel Corporation
2*61046927SAndroid Build Coastguard Worker#
3*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
4*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the
5*61046927SAndroid Build Coastguard Worker# "Software"), to deal in the Software without restriction, including
6*61046927SAndroid Build Coastguard Worker# without limitation the rights to use, copy, modify, merge, publish,
7*61046927SAndroid Build Coastguard Worker# distribute, sub license, and/or sell copies of the Software, and to
8*61046927SAndroid Build Coastguard Worker# permit persons to whom the Software is furnished to do so, subject to
9*61046927SAndroid Build Coastguard Worker# the following conditions:
10*61046927SAndroid Build Coastguard Worker#
11*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the
12*61046927SAndroid Build Coastguard Worker# next paragraph) shall be included in all copies or substantial portions
13*61046927SAndroid Build Coastguard Worker# of the Software.
14*61046927SAndroid Build Coastguard Worker#
15*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*61046927SAndroid Build Coastguard Worker# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*61046927SAndroid Build Coastguard Worker# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
18*61046927SAndroid Build Coastguard Worker# IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
19*61046927SAndroid Build Coastguard Worker# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*61046927SAndroid Build Coastguard Worker# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*61046927SAndroid Build Coastguard Worker# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Workerimport docutils.nodes
24*61046927SAndroid Build Coastguard Workerimport mako.template
25*61046927SAndroid Build Coastguard Workerimport os
26*61046927SAndroid Build Coastguard Workerimport sphinx
27*61046927SAndroid Build Coastguard Workerfrom sphinx.directives import SphinxDirective
28*61046927SAndroid Build Coastguard Workerfrom sphinx.domains import Domain
29*61046927SAndroid Build Coastguard Workerfrom sphinx.util.nodes import make_refnode
30*61046927SAndroid Build Coastguard Workerimport sys
31*61046927SAndroid Build Coastguard Workerimport textwrap
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard WorkerTHIS_DIR = os.path.dirname(os.path.abspath(__file__))
34*61046927SAndroid Build Coastguard WorkerMESA_DIR = os.path.join(THIS_DIR, '..', '..')
35*61046927SAndroid Build Coastguard WorkerNIR_PATH = os.path.join(MESA_DIR, 'src', 'compiler', 'nir')
36*61046927SAndroid Build Coastguard Workersys.path.append(NIR_PATH)
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Workerimport nir_opcodes
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard WorkerOP_DESC_TEMPLATE = mako.template.Template("""
41*61046927SAndroid Build Coastguard Worker<%
42*61046927SAndroid Build Coastguard Workerdef src_decl_list(num_srcs):
43*61046927SAndroid Build Coastguard Worker   return ', '.join('nir_def *src' + str(i) for i in range(num_srcs))
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Workerdef to_yn(b):
46*61046927SAndroid Build Coastguard Worker    return 'Y' if b else 'N'
47*61046927SAndroid Build Coastguard Worker%>
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker**Properties:**
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker.. list-table::
52*61046927SAndroid Build Coastguard Worker   :header-rows: 1
53*61046927SAndroid Build Coastguard Worker
54*61046927SAndroid Build Coastguard Worker   * - Per-component
55*61046927SAndroid Build Coastguard Worker     - Associative
56*61046927SAndroid Build Coastguard Worker     - 2-src commutative
57*61046927SAndroid Build Coastguard Worker   * - ${to_yn(op.output_size == 0)}
58*61046927SAndroid Build Coastguard Worker     - ${to_yn('associative' in op.algebraic_properties)}
59*61046927SAndroid Build Coastguard Worker     - ${to_yn('2src_commutative' in op.algebraic_properties)}
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker${("**Description:** " + op.description) if op.description != "" else ""}
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker**Constant-folding:**
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker.. code-block:: c
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker${textwrap.indent(op.const_expr, '    ')}
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Worker**Builder function:**
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker.. c:function:: nir_def *nir_${op.name}(nir_builder *, ${src_decl_list(op.num_inputs)})
72*61046927SAndroid Build Coastguard Worker""")
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Workerdef parse_rst(state, parent, rst):
75*61046927SAndroid Build Coastguard Worker    vl = docutils.statemachine.ViewList(rst.splitlines())
76*61046927SAndroid Build Coastguard Worker    state.nested_parse(vl, 0, parent)
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Workerdef nir_alu_type_name(t, s):
79*61046927SAndroid Build Coastguard Worker    if s:
80*61046927SAndroid Build Coastguard Worker        return '{}[{}]'.format(t, s)
81*61046927SAndroid Build Coastguard Worker    else:
82*61046927SAndroid Build Coastguard Worker        return '{}[N]'.format(t)
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Workerdef build_alu_op_desc(state, env, op):
85*61046927SAndroid Build Coastguard Worker    desc = sphinx.addnodes.desc(domain='nir', objtype='aluop')
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker    # Add the signature
88*61046927SAndroid Build Coastguard Worker    sig = sphinx.addnodes.desc_signature()
89*61046927SAndroid Build Coastguard Worker    desc.append(sig)
90*61046927SAndroid Build Coastguard Worker    sig += sphinx.addnodes.desc_name(op.name, op.name)
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker    params = sphinx.addnodes.desc_parameterlist()
93*61046927SAndroid Build Coastguard Worker    for i, t, s in zip(range(100), op.input_types, op.input_sizes):
94*61046927SAndroid Build Coastguard Worker        params += docutils.nodes.Text(nir_alu_type_name(t, s) + ' ')
95*61046927SAndroid Build Coastguard Worker        params += sphinx.addnodes.desc_parameter('', 'src' + str(i))
96*61046927SAndroid Build Coastguard Worker    sig += params
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker    sig += sphinx.addnodes.desc_returns('',
99*61046927SAndroid Build Coastguard Worker        nir_alu_type_name(op.output_type, op.output_size))
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker    nir_domain = env.get_domain('nir')
102*61046927SAndroid Build Coastguard Worker    sig['ids'].append(nir_domain.add_alu_op_ref(op))
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker    # Build the description
105*61046927SAndroid Build Coastguard Worker    content = sphinx.addnodes.desc_content()
106*61046927SAndroid Build Coastguard Worker    desc.append(content)
107*61046927SAndroid Build Coastguard Worker    parse_rst(state, content, OP_DESC_TEMPLATE.render(op=op, textwrap=textwrap))
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker    return desc
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Workerclass NIRALUOpcodesDirective(SphinxDirective):
112*61046927SAndroid Build Coastguard Worker    def run(self):
113*61046927SAndroid Build Coastguard Worker        return [build_alu_op_desc(self.state, self.env, op)
114*61046927SAndroid Build Coastguard Worker                for op in nir_opcodes.opcodes.values()]
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Workerclass NIRDomain(Domain):
117*61046927SAndroid Build Coastguard Worker    """A new NIR directive
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker    To list all NIR ALU opcodes with their descriptions:
120*61046927SAndroid Build Coastguard Worker    ```rst
121*61046927SAndroid Build Coastguard Worker    .. nir:alu-opcodes::
122*61046927SAndroid Build Coastguard Worker    ```
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker    To reference a NIR opcode, ``:nir:alu-op:`fadd```
125*61046927SAndroid Build Coastguard Worker    """
126*61046927SAndroid Build Coastguard Worker    name = 'nir'
127*61046927SAndroid Build Coastguard Worker    roles = {
128*61046927SAndroid Build Coastguard Worker        'alu-op' : sphinx.roles.XRefRole(),
129*61046927SAndroid Build Coastguard Worker    }
130*61046927SAndroid Build Coastguard Worker    directives = {
131*61046927SAndroid Build Coastguard Worker        'alu-opcodes' : NIRALUOpcodesDirective,
132*61046927SAndroid Build Coastguard Worker    }
133*61046927SAndroid Build Coastguard Worker    initial_data = {
134*61046927SAndroid Build Coastguard Worker        'alu-op-refs': [],
135*61046927SAndroid Build Coastguard Worker    }
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker    def add_alu_op_ref(self, op):
138*61046927SAndroid Build Coastguard Worker        """Add reference to an ALU op."""
139*61046927SAndroid Build Coastguard Worker        self.data['alu-op-refs'].append((op.name, self.env.docname))
140*61046927SAndroid Build Coastguard Worker        return 'nir-alu-op-' + op.name
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker    def resolve_xref(self, env, fromdocname, builder, typ, target, node,
143*61046927SAndroid Build Coastguard Worker                     contnode):
144*61046927SAndroid Build Coastguard Worker        for opname, todocname in self.data['alu-op-refs']:
145*61046927SAndroid Build Coastguard Worker            if target == opname:
146*61046927SAndroid Build Coastguard Worker                targ = 'nir-alu-op-' + opname
147*61046927SAndroid Build Coastguard Worker                return make_refnode(builder, fromdocname, todocname, targ,
148*61046927SAndroid Build Coastguard Worker                                    contnode, targ)
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker        return None
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Workerdef setup(app):
153*61046927SAndroid Build Coastguard Worker    app.add_domain(NIRDomain)
154