# Copyright (c) 2023 The Regents of the University of California
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""
This configuration script shows an example of how to take checkpoints for
LoopPoint using the gem5 stdlib. To take checkpoints for LoopPoint simulation
regions, there must be a LoopPoint data file generated by Pin or the gem5
simulator. With the information in the LoopPoint data file, the stdlib
modules will take checkpoints at the beginning of the simulation regions
(warmup region included if it exists) and record all restore needed information
into a JSON file. The JSON file is needed for later restoring, so please call
`looppoint.output_json_file()` at the end of the simulation.

This script builds a simple board with the gem5 stdlib with no cache and a
simple memory structure to take checkpoints. Some of the components, such as
cache hierarchy, can be changed when restoring checkpoints.

Usage
-----
```
scons build/X86/gem5.opt
./build/X86/gem5.opt \
    configs/example/gem5_library/looppoints/create-looppoint-checkpoint.py
```
"""

from gem5.simulate.exit_event import ExitEvent
from gem5.simulate.simulator import Simulator
from gem5.utils.requires import requires
from gem5.components.cachehierarchies.classic.no_cache import NoCache
from gem5.components.boards.simple_board import SimpleBoard
from gem5.components.memory.single_channel import SingleChannelDDR3_1600
from gem5.components.processors.simple_processor import SimpleProcessor
from gem5.components.processors.cpu_types import CPUTypes
from gem5.isas import ISA
from gem5.resources.resource import obtain_resource
from pathlib import Path
from gem5.simulate.exit_event_generators import (
    looppoint_save_checkpoint_generator,
)

import argparse

requires(isa_required=ISA.X86)

parser = argparse.ArgumentParser(
    description="An example looppoint workload file path"
)

# The lone arguments is a file path to a directory to store the checkpoints.

parser.add_argument(
    "--checkpoint-path",
    type=str,
    required=False,
    default="looppoint_checkpoints_folder",
    help="The directory to store the checkpoints.",
)

args = parser.parse_args()

# When taking a checkpoint, the cache state is not saved, so the cache
# hierarchy can be changed completely when restoring from a checkpoint.
# By using NoCache() to take checkpoints, it can slightly improve the
# performance when running in atomic mode, and it will not put any restrictions
# on what people can do with the checkpoints.
cache_hierarchy = NoCache()


# Using simple memory to take checkpoints might slightly imporve the
# performance in atomic mode. The memory structure can be changed when
# restoring from a checkpoint, but the size of the memory must be equal or
# greater to that taken when creating the checkpoint.
memory = SingleChannelDDR3_1600(size="2GB")

processor = SimpleProcessor(
    cpu_type=CPUTypes.ATOMIC,
    isa=ISA.X86,
    # LoopPoint can work with multicore workloads
    num_cores=9,
)

board = SimpleBoard(
    clk_freq="3GHz",
    processor=processor,
    memory=memory,
    cache_hierarchy=cache_hierarchy,
)

looppoint = obtain_resource("x86-matrix-multiply-omp-100-8-global-pinpoints")
board.set_se_looppoint_workload(
    binary=obtain_resource("x86-matrix-multiply-omp"),
    arguments=[100, 8],
    # Pass LoopPoint module into the board
    looppoint=looppoint,
)

dir = Path(args.checkpoint_path)
dir.mkdir(exist_ok=True)

simulator = Simulator(
    board=board,
    on_exit_event={
        ExitEvent.SIMPOINT_BEGIN: looppoint_save_checkpoint_generator(
            checkpoint_dir=dir,
            looppoint=looppoint,
            # True if the relative PC count pairs should be updated during the
            # simulation. Default as True.
            update_relatives=True,
            # True if the simulation loop should exit after all the PC count
            # pairs in the LoopPoint data file have been encountered. Default
            # as True.
            exit_when_empty=True,
        )
    },
)

simulator.run()

# Output the JSON file
looppoint.output_json_file()
