#!/usr/bin/env python3

from utils import bitsmaker


def run(
        bits_fn,
        design_fn,
        fnout,
        oneval,
        dframe,
        dword,
        dbit,
        multi=False,
        verbose=False):
    # mimicing tag names, wasn't sure if it would break things otherwise
    metastr = "DWORD:%u" % dword
    if dbit is not None:
        metastr += ".DBIT:%u" % dbit
    if dframe is not None:
        metastr += ".DFRAME:%02x" % dframe
    if multi:
        metastr += ".MULTI"

    tags = dict()
    f = open(design_fn, 'r')
    f.readline()
    for l in f:
        l = l.strip()
        # Additional values reserved / for debugging
        tile, val = l.split(',')[0:2]
        tags["%s.%s" % (tile, metastr)] = val == oneval

    bitsmaker.write(bits_fn, fnout, tags)


def main():
    import argparse

    parser = argparse.ArgumentParser(
        description=
        "Solve bits (like segmaker) on raw .bits file without segments")
    parser.add_argument("--bits-file", default="design.bits", help="")
    parser.add_argument("--verbose", action="store_true", help="")
    parser.add_argument("--design", default="design.csv", help="")
    parser.add_argument("--fnout", default="/dev/stdout", help="")
    parser.add_argument(
        "--oneval",
        required=True,
        help="Parameter value that correspodns to a set bit")
    #
    parser.add_argument(
        "--multi", action="store_true", help="Are multiple bits expected?")
    parser.add_argument(
        "--dframe",
        type=str,
        required=False,
        default="",
        help="Reference frame delta (base 16)")
    parser.add_argument(
        "--dword",
        type=str,
        required=True,
        help="Reference word delta (base 10)")
    parser.add_argument(
        "--dbit",
        type=str,
        required=False,
        default="",
        help="Reference bit delta (base 10)")
    args = parser.parse_args()

    run(
        args.bits_file,
        args.design,
        args.fnout,
        args.oneval,
        None if args.dframe == "" else int(args.dframe, 16),
        int(args.dword, 10),
        None if args.dbit == "" else int(args.dbit, 10),
        multi=args.multi,
        verbose=args.verbose)


if __name__ == "__main__":
    main()
