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