#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020-2021 Efabless Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
import yaml
import glob
import shlex
import getpass
import subprocess
from gh import gh

threads_used = int(subprocess.check_output(["nproc"]).decode("utf-8")) - 1
test_name = "ci_test"
design = sys.argv[1]
print(f"Running on designs {test_name} using {threads_used} threads…")

username = getpass.getuser()
user = subprocess.check_output(["id", "-u", username]).decode("utf8")[:-1]
group = subprocess.check_output(["id", "-g", username]).decode("utf8")[:-1]

docker_command = [
    "docker",
    "run",
    "-v",
    f"{os.path.realpath(gh.root)}:/openlane",
    "-v",
    f"{os.path.realpath(gh.root)}/designs:/openlane/install",
    "-v",
    f"{gh.pdk}:{gh.pdk}",
    "-u",
    f"{user}:{group}",
    "-e",
    f"PDK_ROOT={gh.pdk}",
    gh.image,
    "bash",
    "-c",
    shlex.join(
        [
            "python3",
            "run_designs.py",
            "--disable_timestamp",
            "--tag",
            test_name,
            "--threads",
            str(threads_used),
            "--benchmark",
            os.path.join("regression_results", "benchmark_results", "SW_HD.csv"),
            "--show_output",
            design,
        ]
    ),
]

print(f"Running {shlex.join(docker_command)} in {os.getenv('PWD')}…")

try:
    subprocess.run(docker_command, check=True)
except subprocess.CalledProcessError as e:
    if e.returncode != 2:
        raise e


def cat(x):
    print(open(x).read())


results_folder = os.path.join(gh.root, "regression_results", test_name)

print("Verbose differences within the benchmark:")
for report in glob.glob(os.path.join(results_folder, f"{test_name}*.rpt")):
    cat(report)

design_test_report = os.path.join(results_folder, f"{test_name}.rpt.yml")
if not os.path.exists(design_test_report):
    print(f"Couldn't find final design test report at {design_test_report}.")
    exit(-1)

cat(design_test_report)

dtr_str = open(design_test_report).read()
dtr = yaml.safe_load(dtr_str)

print("Tarballing run...")
subprocess.check_call(
    ["tar", "-czf", "./reproducible.tar.gz", os.path.join("designs", design, "runs")]
)
print("Created ./reproducible.tar.gz.")

if not dtr[design]["pass"]:
    print("Testing the design has failed.")
    exit(-1)

print("Done.")
