1 #!/usr/bin/env python
   2 # SPDX_License-Identifier: MIT
   3 #
   4 # Copyright (C) 2018 Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
   5 #
   6 
   7 """
   8 ///
   9 // To document the instructions used in the intermediate representation
  10 // a new domain is defined: 'ir' with a directive::
  11 //
  12 //      .. op: <OP_NAME>
  13 //              <description of OP_NAME>
  14 //              ...
  15 //
  16 // This is equivalent to using a definition list but with the name
  17 // also placed in the index (with 'IR instruction' as descriptions).
  18 
  19 """
  20 
  21 import docutils
  22 import sphinx
  23 
  24 class IROpDirective(docutils.parsers.rst.Directive):
  25 
  26         # use the first line of content as the argument, this allow
  27         # to not have to write a blanck line after the directive
  28         final_argument_whitespace = True
  29         required_argument = 0
  30         #optional_arguments = 0
  31         has_content = True
  32 
  33         objtype = None
  34 
  35         def run(self):
  36                 self.env = self.state.document.settings.env
  37 
  38                 source = self.state.document
  39                 lineno = self.lineno
  40                 text = self.content
  41                 name = text[0]
  42 
  43                 node = docutils.nodes.section()
  44                 node['ids'].append(name)
  45                 node.document = source
  46 
  47                 index = '.. index:: pair: %s; IR instruction' % name
  48                 content = docutils.statemachine.ViewList()
  49                 content.append(index, source, lineno)
  50                 content.append(''   , source, lineno)
  51                 content.append(name , source, lineno)
  52                 content.append(''   , source, lineno)
  53                 self.state.nested_parse(content, self.content_offset, node)
  54 
  55                 defnode = docutils.nodes.definition()
  56                 self.state.nested_parse(text[1:], self.content_offset, defnode)
  57                 node.append(defnode)
  58 
  59                 return [node]
  60 
  61 class IRDomain(sphinx.domains.Domain):
  62 
  63     """IR domain."""
  64     name = 'ir'
  65 
  66 def setup(app):
  67         app.add_domain(IRDomain)
  68         app.add_directive_to_domain('ir', 'op', IROpDirective)
  69 
  70         return {
  71                 'version': '1.0',
  72                 'parallel_read_safe': True,
  73         }
  74 
  75 # vim: tabstop=4