#!/usr/bin/env python3
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
r"""Convert mako template to Hjson register description
"""
import argparse
import sys
from io import StringIO

from mako.template import Template


def main():
    parser = argparse.ArgumentParser(prog="reg_pinmux")
    parser.add_argument('input',
                        nargs='?',
                        metavar='file',
                        type=argparse.FileType('r'),
                        default=sys.stdin,
                        help='input template file')
    parser.add_argument('--n_mio_periph_in',
                        type=int,
                        help='Number of muxed peripheral inputs',
                        default=32)
    parser.add_argument('--n_mio_periph_out',
                        type=int,
                        help='Number of muxed peripheral outputs',
                        default=32)
    parser.add_argument('--n_mio_pads',
                        type=int,
                        help='Number of muxed IO pads',
                        default=32)
    parser.add_argument('--n_dio_periph_in',
                        type=int,
                        help='Number of dedicated peripheral inputs',
                        default=16)
    parser.add_argument('--n_dio_periph_out',
                        type=int,
                        help='Number of dedicated peripheral outputs',
                        default=16)
    parser.add_argument('--n_dio_pads',
                        type=int,
                        help='Number of dedicated IO pads',
                        default=16)
    parser.add_argument('--n_wkup_detect',
                        type=int,
                        help='Number of wakeup condition detectors',
                        default=8)
    parser.add_argument('--wkup_cnt_width',
                        type=int,
                        help='With of wakeup counters',
                        default=8)

    args = parser.parse_args()

    # Determine output: if stdin then stdout if not then ??
    out = StringIO()

    reg_tpl = Template(args.input.read())
    out.write(
        reg_tpl.render(n_mio_periph_in=args.n_mio_periph_in,
                       n_mio_periph_out=args.n_mio_periph_out,
                       n_mio_pads=args.n_mio_pads,
                       n_dio_periph_in=args.n_dio_periph_in,
                       n_dio_periph_out=args.n_dio_periph_out,
                       n_dio_pads=args.n_dio_pads,
                       n_wkup_detect=args.n_wkup_detect,
                       wkup_cnt_width=args.wkup_cnt_width))

    print(out.getvalue())

    out.close()


if __name__ == "__main__":
    main()
