#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 F4PGA Authors
#
# 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.
#
# SPDX-License-Identifier: Apache-2.0

from pathlib import Path

from f4pga.flows.common import noisy_warnings
from f4pga.flows.tools.vpr import vpr_specific_values, vpr, VprArgs
from f4pga.flows.module import Module, ModuleContext


DEFAULT_TIMING_RPT = "pre_pack.report_timing.setup.rpt"
DEFAULT_UTIL_RPT = "packing_pin_util.rpt"


class PackModule(Module):
    def map_io(self, ctx: ModuleContext):
        epath = Path(ctx.takes.eblif)
        build_dir = epath.parent
        return {
            "net": str(epath.with_suffix(".net")),
            "util_rpt": str(build_dir / DEFAULT_UTIL_RPT),
            "timing_rpt": str(build_dir / DEFAULT_TIMING_RPT),
        }

    def execute(self, ctx: ModuleContext):
        noisy_warnings(ctx.values.device)
        build_dir = Path(ctx.outputs.net).parent

        yield "Packing with VPR..."
        vpr(
            "pack",
            VprArgs(
                share=ctx.share,
                eblif=ctx.takes.eblif,
                arch_def=ctx.values.arch_def,
                lookahead=ctx.values.rr_graph_lookahead_bin,
                rr_graph=ctx.values.rr_graph_real_bin,
                place_delay=ctx.values.vpr_place_delay,
                device_name=ctx.values.vpr_grid_layout_name,
                vpr_options=ctx.values.vpr_options if ctx.values.vpr_options else {},
                sdc_file=ctx.takes.sdc,
            ),
            cwd=build_dir,
        )

        og_log = build_dir / "vpr_stdout.log"

        yield "Moving/deleting files..."
        if ctx.outputs.pack_log:
            og_log.rename(ctx.outputs.pack_log)
        else:
            og_log.unlink()

        if ctx.outputs.timing_rpt:
            (build_dir / DEFAULT_TIMING_RPT).rename(ctx.outputs.timing_rpt)

        if ctx.outputs.util_rpt:
            (build_dir / DEFAULT_UTIL_RPT).rename(ctx.outputs.util_rpt)

    def __init__(self, _):
        self.name = "pack"
        self.no_of_phases = 2
        self.takes = ["eblif", "sdc?"]
        self.produces = ["net", "util_rpt", "timing_rpt", "pack_log!"]
        self.values = ["device"] + vpr_specific_values


ModuleClass = PackModule
