|  | # 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 |