
import argparse
import os
import verilog2simple
import verilog2blackbox
from pathlib import Path
from subprocess import CalledProcessError
from verilog2sch import use_yosys, base_includes

def v_test(out_path):
    retcode, err =  use_yosys("prep" ,[out_path, "dummy_verilog.v"])
    if retcode == 0:
        return True
    else:
        for x in base_includes(out_path):
            print('\t' + x)
        retcode, err = use_yosys("prep" ,[out_path, "dummy_verilog.v"] + base_includes(out_path))
        if retcode == 0:
            return True
    print("\tYosys failed with:\n" + err + "\n")
    return False

def test_simple(file_path, out_path):
    verilog2simple.main(file_path, out_path)
    return v_test(out_path)

def test_blackbox(file_path, out_path):
    verilog2blackbox.main(file_path, out_path)
    return v_test(out_path)

if __name__ == "__main__":
    import doctest
    fails, test = doctest.testmod()
    if fails > 0:
        exit()
    all_files = 0
    fails = 0
    failed = []

    test_bb = False

    parser = argparse.ArgumentParser()
    parser.add_argument(
        "input",
        help="The path to the source directory/file. If file is passed it will run in debug mode with no output file" +
        "If dir is passed it will find '.full.v' files generate '.simple.v' in the same directory",
        type=Path)
    args = parser.parse_args()
    if not os.path.isdir(args.input):
        test_simple(str(args.input), str(args.input)[:-7] + ".simple.v")
    else:
        files = args.input.rglob('*.full.v')
        files_count = 0
        for f in files:
            f = str(f)
            files_count += 1
            if test_bb:
                outf = f[:-7] + ".blackbox.v"
                success = test_blackbox(f, outf)
            else:
                outf = f[:-7] + ".simple.v"
                success = test_simple(f, outf)
            if success:
                print(f"Yosys finished: {os.path.relpath(f)}")
            else:
                fails += 1
                failed.append(f)
                print(f"Yosys failed: {os.path.relpath(f)}")

        print("*"*60)
        for f in failed:
            print(os.path.relpath(f))
        print("*"*60)
        print(f"Processed {files_count}")
        print(f"\t{fails} failed")
        print(f"\tSuccess rate {(files_count - fails) * 100.0 / files_count}%")


