""" Transform a verilog `local param` values and updates the dumpfile vcd output name;

See example;

.. highlight:: verilog
    ...
    localparam NUM_FF = 4;
    ...
    $dumpfile("testbench_ff_ce_sr_4_tb.vcd");
    ...

to

.. highlight:: verilog
    :emphasize-lines: 3,5
    ...
    localparam NUM_FF = 7;
    ...
    $dumpfile("testbench_ff_ce_sr_7_tb.vcd");
    ...

Useful for generating a number of test cases based a local parameters.


This is useful for generating multiple verilog outputs from a template.

"""
import argparse
import os.path
import re

# Example:
#   localparam NUM_FF = 4;
# group 1 = "   "
# group 2 = "NUM_FF"
LOCALPARAM_RE = re.compile(r'^(\s*)localparam\s+([^\s]+)\s*=.*$')

# Example:
#  $dumpfile(...);
# group 1 = "  "
DUMPFILE_RE = re.compile(r'^(\s*)\$dumpfile\([^\)]+\)\s*;\s*$')


def main():
    parser = argparse.ArgumentParser(description=__doc__)

    parser.add_argument('--template', required=True)
    parser.add_argument('--output', required=True)
    parser.add_argument(
        '--params',
        required=True,
        help="Comma seperated parameter list to set."
    )

    args = parser.parse_args()

    params_list = args.params.split(',')

    params = {}
    for param in params_list:
        k, v = param.split('=')
        params[k] = v

    with open(args.output, 'w') as f_out, open(args.template) as f:
        for line in f:
            localparam_m = LOCALPARAM_RE.match(line)
            dumpfile_m = DUMPFILE_RE.match(line)
            if localparam_m:
                prefix_ws = localparam_m.group(1)
                param = localparam_m.group(2)

                if param in params:
                    print(
                        '{}localparam {} = {};'.format(
                            prefix_ws, param, params[param]
                        ),
                        file=f_out
                    )
                else:
                    print(line.rstrip(), file=f_out)
            elif dumpfile_m:
                prefix_ws = dumpfile_m.group(1)
                base = os.path.basename(args.output)
                root, _ = os.path.splitext(base)
                print(
                    '{}$dumpfile("testbench_{}.vcd");'.format(prefix_ws, root),
                    file=f_out
                )
            else:
                print(line.rstrip(), file=f_out)


if __name__ == "__main__":
    main()
