| # Copyright lowRISC contributors. | 
 | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | # SPDX-License-Identifier: Apache-2.0 | 
 | """TileLink-Uncached Lightweight Xbar self document | 
 | """ | 
 | import logging as log | 
 |  | 
 | from reggen.validate import val_types | 
 |  | 
 | from .validate import root | 
 |  | 
 | doc_intro = """ | 
 |  | 
 | The tables describe each key and the type of the value. The following | 
 | types are used: | 
 |  | 
 | Type | Description | 
 | ---- | ----------- | 
 | """ | 
 |  | 
 |  | 
 | def print_control(control, heading): | 
 |     """Print a control group and its subgroup recursively | 
 |     """ | 
 |     subgroup = []  # added if the field hit sub control group | 
 |  | 
 |     outstr = '#' * heading + ' ' + control['name'] + '\n' | 
 |     outstr += '\n' | 
 |  | 
 |     outstr += control['description'] | 
 |     outstr += '\n\n' | 
 |  | 
 |     items = {**control['required'], **control['optional'], **control['added']} | 
 |  | 
 |     if len(items) > 0: | 
 |         outstr += """ | 
 | Field | Kind | Type | Description | 
 | ----- | ---- | ---- | ------------ | 
 | """ | 
 |     for k, v in items.items(): | 
 |         if k in control['required']: | 
 |             kind = "required" | 
 |         elif k in control['optional']: | 
 |             kind = "optional" | 
 |         else: | 
 |             kind = "added by tool" | 
 |  | 
 |         v_type = val_types[v[0]][0] | 
 |  | 
 |         if v[0] == 'lg': | 
 |             subgroup.append(v[1]) | 
 |             log.error(val_types[v[0]]) | 
 |             outstr += '{} | {} | {} | List of {} group\n'.format( | 
 |                 k, kind, v_type, k) | 
 |             continue | 
 |         elif v[0] == 'g': | 
 |             if not isinstance(v[1], str): | 
 |                 subgroup.append(v[1]) | 
 |                 outstr += '{} | {} | {} | {} group\n'.format( | 
 |                     k, kind, v_type, k) | 
 |                 continue | 
 |  | 
 |         # Generic string print | 
 |         outstr += '{} | {} | {} | {}\n'.format(k, kind, v_type, v[1]) | 
 |  | 
 |     outstr += "\n\n" | 
 |     # recursive subgroup | 
 |     for e in subgroup: | 
 |         outstr += print_control(e, heading) | 
 |  | 
 |     return outstr | 
 |  | 
 |  | 
 | def selfdoc(heading, cmd=""): | 
 |     # heading : Markdown header depth | 
 |     # value type | 
 |     outstr = doc_intro | 
 |  | 
 |     for k, v in val_types.items(): | 
 |         outstr += v[0] + " | " + v[1] + "\n" | 
 |  | 
 |     # root + subgroup | 
 |     outstr += print_control(root, heading) | 
 |  | 
 |     # connections: Needs custom as the key are hosts (can vary) | 
 |  | 
 |     return outstr |