# Copyright (c) 2018 Advanced Micro Devices, Inc.
# All rights reserved.
#
# For use for simulation and test purposes only
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. 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.
#
# 3. Neither the name of the copyright holder 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 HOLDER 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.

import m5

import operator
from os import mkdir, makedirs, getpid, listdir, fsync
from os.path import join as joinpath
from os.path import isdir
from shutil import rmtree, copyfile
from m5.util.convert import toFrequency, toMemorySize

def file_append(path, contents):
    with open(joinpath(*path), 'a') as f:
        f.write(str(contents))
        f.flush()
        fsync(f.fileno())

def remake_dir(path):
    if isdir(path):
        rmtree(path)
    makedirs(path)

# This fakes out a dGPU setup so the runtime operates correctly.  The spoofed
# system has a single dGPU and a single socket CPU.  Note that more complex
# topologies (multi-GPU, multi-socket CPUs) need to have a different setup
# here or the runtime won't be able to issue Memcpies from one node to another.
#
# TODO: There is way too much hardcoded here.  It doesn't effect anything in
# our current ROCm stack (1.6), but it is highly possible that it will in the
# future.  We might need to scrub through this and extract the appropriate
# fields from the simulator in the future.
def createVegaTopology(options):
    topology_dir = joinpath(m5.options.outdir, \
        'fs/sys/devices/virtual/kfd/kfd/topology')
    remake_dir(topology_dir)

    amdgpu_dir = joinpath(m5.options.outdir, \
        'fs/sys/module/amdgpu/parameters')
    remake_dir(amdgpu_dir)

    pci_ids_dir = joinpath(m5.options.outdir, \
        'fs/usr/share/hwdata/')
    remake_dir(pci_ids_dir)

    # Vega reported VM size in GB.  Used to reserve an allocation from CPU
    # to implement SVM (i.e. GPUVM64 pointers and X86 pointers agree)
    file_append((amdgpu_dir, 'vm_size'), 256)

    # Ripped from real Vega platform to appease KMT version checks
    file_append((topology_dir, 'generation_id'), 2)

    # Set up system properties.  Regiter as ast-rocm server
    sys_prop = 'platform_oem 35498446626881\n' + \
               'platform_id 71791775140929\n' + \
               'platform_rev 2\n'
    file_append((topology_dir, 'system_properties'), sys_prop)

    # Populate the topology tree
    # Our dGPU system is two nodes.  Node 0 is a CPU and Node 1 is a dGPU
    node_dir = joinpath(topology_dir, 'nodes/0')
    remake_dir(node_dir)

    # Register as a CPU
    file_append((node_dir, 'gpu_id'), 0)
    file_append((node_dir, 'name'), '')

    # CPU links.  Only thing that matters is we tell the runtime that GPU is
    # connected through PCIe to CPU socket 0.
    io_links = 1
    io_dir = joinpath(node_dir, 'io_links/0')
    remake_dir(io_dir)
    io_prop = 'type 2\n'                                    + \
              'version_major 0\n'                           + \
              'version_minor 0\n'                           + \
              'node_from 0\n'                               + \
              'node_to 1\n'                                 + \
              'weight 20\n'                                 + \
              'min_latency 0\n'                             + \
              'max_latency 0\n'                             + \
              'min_bandwidth 0\n'                           + \
              'max_bandwidth 0\n'                           + \
              'recommended_transfer_size 0\n'               + \
              'flags 13\n'
    file_append((io_dir, 'properties'), io_prop)

    # Populate CPU node properties
    node_prop = 'cpu_cores_count %s\n' % options.num_cpus   + \
                'simd_count 0\n'                            + \
                'mem_banks_count 1\n'                       + \
                'caches_count 0\n'                          + \
                'io_links_count %s\n' % io_links            + \
                'cpu_core_id_base 0\n'                      + \
                'simd_id_base 0\n'                          + \
                'max_waves_per_simd 0\n'                    + \
                'lds_size_in_kb 0\n'                        + \
                'gds_size_in_kb 0\n'                        + \
                'wave_front_size 64\n'                      + \
                'array_count 0\n'                           + \
                'simd_arrays_per_engine 0\n'                + \
                'cu_per_simd_array 0\n'                     + \
                'simd_per_cu 0\n'                           + \
                'max_slots_scratch_cu 0\n'                  + \
                'vendor_id 0\n'                             + \
                'device_id 0\n'                             + \
                'location_id 0\n'                           + \
                'drm_render_minor 0\n'                      + \
                'max_engine_clk_ccompute 3400\n'

    file_append((node_dir, 'properties'), node_prop)

    # CPU memory reporting
    mem_dir = joinpath(node_dir, 'mem_banks/0')
    remake_dir(mem_dir)
    # Heap type value taken from real system, heap type values:
    # https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/blob/roc-4.0.x/include/hsakmttypes.h#L317
    mem_prop = 'heap_type 0\n'                                           + \
               'size_in_bytes 33704329216\n'                            + \
               'flags 0\n'                                              + \
               'width 72\n'                                             + \
               'mem_clk_max 2400\n'

    file_append((mem_dir, 'properties'), mem_prop)

    # Build the GPU node
    node_dir = joinpath(topology_dir, 'nodes/1')
    remake_dir(node_dir)

    # Register as a Vega
    file_append((node_dir, 'gpu_id'), 22124)
    file_append((node_dir, 'name'), 'Vega\n')

    # Should be the same as the render driver filename (dri/renderD<drm_num>)
    drm_num = 128

    # 96 in real Vega
    # Random comment for comparison purposes
    caches = 0

    # GPU links.  Only thing that matters is we tell the runtime that GPU is
    # connected through PCIe to CPU socket 0.
    io_links = 1
    io_dir = joinpath(node_dir, 'io_links/0')
    remake_dir(io_dir)
    io_prop = 'type 2\n'                                    + \
              'version_major 0\n'                           + \
              'version_minor 0\n'                           + \
              'node_from 1\n'                               + \
              'node_to 0\n'                                 + \
              'weight 20\n'                                 + \
              'min_latency 0\n'                             + \
              'max_latency 0\n'                             + \
              'min_bandwidth 0\n'                           + \
              'max_bandwidth 0\n'                           + \
              'recommended_transfer_size 0\n'               + \
              'flags 1\n'
    file_append((io_dir, 'properties'), io_prop)

    # Populate GPU node properties
    cu_scratch = options.simds_per_cu * options.wfs_per_simd
    node_prop = 'cpu_cores_count 0\n'                       + \
                'simd_count 256\n'                          + \
                'mem_banks_count 1\n'                       + \
                'caches_count %s\n' % caches                + \
                'io_links_count %s\n' % io_links            + \
                'cpu_core_id_base 0\n'                      + \
                'simd_id_base 2147487744\n'                 + \
                'max_waves_per_simd 10\n'                   + \
                'lds_size_in_kb 64\n'                       + \
                'gds_size_in_kb 0\n'                        + \
                'wave_front_size 64\n'                      + \
                'array_count 4\n'                           + \
                'simd_arrays_per_engine 1\n'                + \
                'cu_per_simd_array 16\n'                    + \
                'simd_per_cu 4\n'                           + \
                'max_slots_scratch_cu %s\n' % cu_scratch    + \
                'vendor_id 4098\n'                          + \
                'device_id 26720\n'                         + \
                'location_id 1024\n'                        + \
                'drm_render_minor %s\n' % drm_num           + \
                'hive_id 0\n'                               + \
                'num_sdma_engines 2\n'                      + \
                'num_sdma_xgmi_engines 0\n'                 + \
                'max_engine_clk_fcompute 1500\n'            + \
                'local_mem_size 17163091968\n'              + \
                'fw_version 421\n'                          + \
                'capability 238208\n'                       + \
                'debug_prop 32768\n'                        + \
                'sdma_fw_version 430\n'                     + \
                'max_engine_clk_ccompute 3400\n'

    file_append((node_dir, 'properties'), node_prop)

    # Fiji HBM reporting
    # TODO: Extract size, clk, and width from sim paramters
    mem_dir = joinpath(node_dir, 'mem_banks/0')
    remake_dir(mem_dir)
    # Heap type value taken from real system, heap type values:
    # https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/blob/roc-4.0.x/include/hsakmttypes.h#L317
    mem_prop = 'heap_type 1\n'                              + \
               'size_in_bytes 17163091968\n'                + \
               'flags 0\n'                                  + \
               'width 2048\n'                               + \
               'mem_clk_max 945\n'

    file_append((mem_dir, 'properties'), mem_prop)

# This fakes out a dGPU setup so the runtime correctly operations.  The spoofed
# system has a single dGPU and a single socket CPU.  Note that more complex
# topologies (multi-GPU, multi-socket CPUs) need to have a different setup
# here or the runtime won't be able to issue Memcpies from one node to another.
#
# TODO: There is way too much hardcoded here.  It doesn't effect anything in
# our current ROCm stack (1.6), but it is highly possible that it will in the
# future.  We might need to scrub through this and extract the appropriate
# fields from the simulator in the future.
def createFijiTopology(options):
    topology_dir = joinpath(m5.options.outdir, \
        'fs/sys/devices/virtual/kfd/kfd/topology')
    remake_dir(topology_dir)

    amdgpu_dir = joinpath(m5.options.outdir, \
        'fs/sys/module/amdgpu/parameters')
    remake_dir(amdgpu_dir)

    # Fiji reported VM size in GB.  Used to reserve an allocation from CPU
    # to implement SVM (i.e. GPUVM64 pointers and X86 pointers agree)
    file_append((amdgpu_dir, 'vm_size'), 256)

    # Ripped from real Fiji platform to appease KMT version checks
    file_append((topology_dir, 'generation_id'), 2)

    # Set up system properties.  Regiter as ast-rocm server
    sys_prop = 'platform_oem 35498446626881\n' + \
               'platform_id 71791775140929\n' + \
               'platform_rev 2\n'
    file_append((topology_dir, 'system_properties'), sys_prop)

    # Populate the topology tree
    # Our dGPU system is two nodes.  Node 0 is a CPU and Node 1 is a dGPU
    node_dir = joinpath(topology_dir, 'nodes/0')
    remake_dir(node_dir)

    # Register as a CPU
    file_append((node_dir, 'gpu_id'), 0)
    file_append((node_dir, 'name'), '')

    # CPU links.  Only thing that matters is we tell the runtime that GPU is
    # connected through PCIe to CPU socket 0.
    io_links = 1
    io_dir = joinpath(node_dir, 'io_links/0')
    remake_dir(io_dir)
    io_prop = 'type 2\n'                                    + \
              'version_major 0\n'                           + \
              'version_minor 0\n'                           + \
              'node_from 0\n'                               + \
              'node_to 1\n'                                 + \
              'weight 20\n'                                 + \
              'min_latency 0\n'                             + \
              'max_latency 0\n'                             + \
              'min_bandwidth 0\n'                           + \
              'max_bandwidth 0\n'                           + \
              'recommended_transfer_size 0\n'               + \
              'flags 13\n'
    file_append((io_dir, 'properties'), io_prop)

    # Populate CPU node properties
    node_prop = 'cpu_cores_count %s\n' % options.num_cpus   + \
                'simd_count 0\n'                            + \
                'mem_banks_count 1\n'                       + \
                'caches_count 0\n'                          + \
                'io_links_count %s\n' % io_links            + \
                'cpu_core_id_base 0\n'                      + \
                'simd_id_base 0\n'                          + \
                'max_waves_per_simd 0\n'                    + \
                'lds_size_in_kb 0\n'                        + \
                'gds_size_in_kb 0\n'                        + \
                'wave_front_size 64\n'                      + \
                'array_count 0\n'                           + \
                'simd_arrays_per_engine 0\n'                + \
                'cu_per_simd_array 0\n'                     + \
                'simd_per_cu 0\n'                           + \
                'max_slots_scratch_cu 0\n'                  + \
                'vendor_id 0\n'                             + \
                'device_id 0\n'                             + \
                'location_id 0\n'                           + \
                'drm_render_minor 0\n'                      + \
                'max_engine_clk_ccompute 3400\n'

    file_append((node_dir, 'properties'), node_prop)

    # CPU memory reporting
    mem_dir = joinpath(node_dir, 'mem_banks/0')
    remake_dir(mem_dir)
    # Heap type value taken from real system, heap type values:
    # https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/blob/roc-4.0.x/include/hsakmttypes.h#L317
    mem_prop = 'heap_type 0\n'                              + \
               'size_in_bytes 33704329216\n'                + \
               'flags 0\n'                                  + \
               'width 72\n'                                 + \
               'mem_clk_max 2400\n'

    file_append((mem_dir, 'properties'), mem_prop)

    # Build the GPU node
    node_dir = joinpath(topology_dir, 'nodes/1')
    remake_dir(node_dir)

    # Register as a Fiji
    file_append((node_dir, 'gpu_id'), 50156)
    file_append((node_dir, 'name'), 'Fiji\n')

    # Should be the same as the render driver filename (dri/renderD<drm_num>)
    drm_num = 128

    # Real Fiji shows 96, but building that topology is complex and doesn't
    # appear to be required for anything.
    caches = 0

    # GPU links.  Only thing that matters is we tell the runtime that GPU is
    # connected through PCIe to CPU socket 0.
    io_links = 1
    io_dir = joinpath(node_dir, 'io_links/0')
    remake_dir(io_dir)
    io_prop = 'type 2\n'                                    + \
              'version_major 0\n'                           + \
              'version_minor 0\n'                           + \
              'node_from 1\n'                               + \
              'node_to 0\n'                                 + \
              'weight 20\n'                                 + \
              'min_latency 0\n'                             + \
              'max_latency 0\n'                             + \
              'min_bandwidth 0\n'                           + \
              'max_bandwidth 0\n'                           + \
              'recommended_transfer_size 0\n'               + \
              'flags 1\n'
    file_append((io_dir, 'properties'), io_prop)

    # Populate GPU node properties
    node_prop = 'cpu_cores_count 0\n'                                       + \
                'simd_count %s\n'                                             \
                    % (options.num_compute_units * options.simds_per_cu)    + \
                'mem_banks_count 1\n'                                       + \
                'caches_count %s\n' % caches                                + \
                'io_links_count %s\n' % io_links                            + \
                'cpu_core_id_base 0\n'                                      + \
                'simd_id_base 2147487744\n'                                 + \
                'max_waves_per_simd %s\n' % options.wfs_per_simd            + \
                'lds_size_in_kb %s\n' % int(options.lds_size / 1024)        + \
                'gds_size_in_kb 0\n'                                        + \
                'wave_front_size %s\n' % options.wf_size                    + \
                'array_count 4\n'                           + \
                'simd_arrays_per_engine %s\n' % options.sa_per_complex      + \
                'cu_per_simd_array %s\n' % options.cu_per_sa                + \
                'simd_per_cu %s\n' % options.simds_per_cu                   + \
                'max_slots_scratch_cu 32\n'                                 + \
                'vendor_id 4098\n'                                          + \
                'device_id 29440\n'                                         + \
                'location_id 512\n'                                         + \
                'drm_render_minor %s\n' % drm_num                           + \
                'max_engine_clk_fcompute %s\n'                                \
                    % int(toFrequency(options.gpu_clock) / 1e6)             + \
                'local_mem_size 4294967296\n'                               + \
                'fw_version 730\n'                                          + \
                'capability 4736\n'                                         + \
                'max_engine_clk_ccompute %s\n'                                \
                    % int(toFrequency(options.CPUClock) / 1e6)

    file_append((node_dir, 'properties'), node_prop)

    # Fiji HBM reporting
    # TODO: Extract size, clk, and width from sim paramters
    mem_dir = joinpath(node_dir, 'mem_banks/0')
    remake_dir(mem_dir)
    # Heap type value taken from real system, heap type values:
    # https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/blob/roc-4.0.x/include/hsakmttypes.h#L317
    mem_prop = 'heap_type 1\n'                              + \
               'size_in_bytes 4294967296\n'                 + \
               'flags 0\n'                                  + \
               'width 4096\n'                               + \
               'mem_clk_max 500\n'

    file_append((mem_dir, 'properties'), mem_prop)


def createCarrizoTopology(options):
    topology_dir = joinpath(m5.options.outdir, \
        'fs/sys/devices/virtual/kfd/kfd/topology')
    remake_dir(topology_dir)

    # Ripped from real Kaveri platform to appease kmt version checks
    # Set up generation_id
    file_append((topology_dir, 'generation_id'), 1)

    # Set up system properties
    sys_prop = 'platform_oem 2314885673410447169\n' + \
               'platform_id 35322352389441\n'       + \
               'platform_rev 1\n'
    file_append((topology_dir, 'system_properties'), sys_prop)

    # Populate the topology tree
    # TODO: Just the bare minimum to pass for now
    node_dir = joinpath(topology_dir, 'nodes/0')
    remake_dir(node_dir)

    # must show valid kaveri gpu id or massive meltdown
    file_append((node_dir, 'gpu_id'), 2765)

    gfx_dict = { "gfx801": {"name": "Carrizo\n", "id": 39028},
                 "gfx902": {"name": "Raven\n", "id": 5597}}

    # must have marketing name
    file_append((node_dir, 'name'), gfx_dict[options.gfx_version]["name"])

    mem_banks_cnt = 1

    # Should be the same as the render driver filename (dri/renderD<drm_num>)
    drm_num = 128

    device_id = gfx_dict[options.gfx_version]["id"]

    # populate global node properties
    # NOTE: SIMD count triggers a valid GPU agent creation
    node_prop = 'cpu_cores_count %s\n' % options.num_cpus                   + \
                'simd_count %s\n'                                             \
                    % (options.num_compute_units * options.simds_per_cu)    + \
                'mem_banks_count %s\n' % mem_banks_cnt                      + \
                'caches_count 0\n'                                          + \
                'io_links_count 0\n'                                        + \
                'cpu_core_id_base 16\n'                                     + \
                'simd_id_base 2147483648\n'                                 + \
                'max_waves_per_simd %s\n' % options.wfs_per_simd            + \
                'lds_size_in_kb %s\n' % int(options.lds_size / 1024)        + \
                'gds_size_in_kb 0\n'                                        + \
                'wave_front_size %s\n' % options.wf_size                    + \
                'array_count 1\n'                                           + \
                'simd_arrays_per_engine %s\n' % options.sa_per_complex      + \
                'cu_per_simd_array %s\n' % options.cu_per_sa                + \
                'simd_per_cu %s\n' % options.simds_per_cu                   + \
                'max_slots_scratch_cu 32\n'                                 + \
                'vendor_id 4098\n'                                          + \
                'device_id %s\n' % device_id                                + \
                'location_id 8\n'                                           + \
                'drm_render_minor %s\n' % drm_num                           + \
                'max_engine_clk_fcompute %s\n'                                \
                    % int(toFrequency(options.gpu_clock) / 1e6)             + \
                'local_mem_size 0\n'                                        + \
                'fw_version 699\n'                                          + \
                'capability 4738\n'                                         + \
                'max_engine_clk_ccompute %s\n'                                \
                    % int(toFrequency(options.CPUClock) / 1e6)

    file_append((node_dir, 'properties'), node_prop)

    for i in range(mem_banks_cnt):
        mem_dir = joinpath(node_dir, f'mem_banks/{i}')
        remake_dir(mem_dir)

        # Heap type value taken from real system, heap type values:
        # https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/blob/roc-4.0.x/include/hsakmttypes.h#L317
        mem_prop = f'heap_type 0\n'                                         + \
                   f'size_in_bytes {toMemorySize(options.mem_size)}'        + \
                   f'flags 0\n'                                             + \
                   f'width 64\n'                                            + \
                   f'mem_clk_max 1600\n'
        file_append((mem_dir, 'properties'), mem_prop)
