# Copyright 2024 Google LLC
#
# 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.

# Renode script for testing the 2-core version of the Sencha platform

$name?="bancha"

using sysbus
mach create $name

include @sim/config/shodan_infrastructure/MpactCPU.cs
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.MpactCPU.MpactBaseCPU"
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.MpactCPU.MpactPeripheral"
include @sim/config/shodan_infrastructure/MpactCheriotCPU.cs
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.MpactCPU.MpactCheriotCPU"
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.CPU.RiscV32"
include @sim/config/shodan_infrastructure/KelvinCPU.cs
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.CPU.KelvinCPU"
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.CPU.MlTopControlBlock"
include @sim/config/shodan_infrastructure/AddressRangeStub.cs
include @sim/config/shodan_infrastructure/MatchaI2S.cs
EnsureTypeIsLoaded "Antmicro.Renode.Peripherals.Sound.MatchaI2S"

$repl_file ?= @sim/config/platforms/bancha.repl

machine LoadPlatformDescription $repl_file

$term_port?=3456
emulation CreateServerSocketTerminal $term_port "term" false
connector Connect uart0 term

showAnalyzer "uart0-analyzer" sysbus.uart0 Antmicro.Renode.Analyzers.LoggingUartAnalyzer

# Set the uart host/virt timestamp format. Options: None, Virtual, Host, Full.
uart0-analyzer TimestampFormat None

cpu0 IsHalted true
$cheriotLibrary ?= @out/cheriot/sim/librenode_mpact_cheriot.so
sysbus.cpu0 CpuLibraryPath $cheriotLibrary

# Configure an I$ and a D$.
# Each configuration is a string of the form:
#   "size,block_size,associativity,write_allocate,[c|nc]:<start_address>:<size>*"
# where the last items optionally specify cacheable (c) and noncacheable (nc)
# address ranges. For instance "8k,16,2,false" or "1M,16,2,false,c0x100:0x3ff".
# NB: Statistics are collected only when MemProfile is enabled (see below).
#sysbus.cpu0 ICache "8k,16,2,false"
#sysbus.cpu0 DCache "1k,8,1,false"

# Load the boot rom into the 32k rom at 0x8000 (useVirtualAddress = false, allowLoadsOnlyToMemory = false)
# Unlike the OT boot rom where cpu0 starts at the reset vecitor (@0x8080)
# the PC is initialized to the ELF entry point.
$boot_elf ?= @out/cheriot/bancha/boot_rom.elf
sysbus LoadELF $boot_elf false false cpu0

# Override cli_port to enable the command line interface on the specified port.
$cli_port?= 0
$wait_for_cli ?= false
sysbus.cpu0 CLIPort $cli_port
sysbus.cpu0 WaitForCLI $wait_for_cli

$tar ?= @out/cheriot/bancha/release/ext_flash.tar
$spi_flash_load_address ?= 0x44000000
$sc_bin ?= @out/cheriot/bancha/release/tmp/cheriot-firmware.bin
$cheriot_elf ?= @out/cheriot/bancha/release/tmp/cheriot-firmware.elf
# NB: cannot load from eflash so do not populate
#$eflash_address ?= 0x20000000
#sysbus LoadBinary $sc_bin $eflash_address
sysbus LoadBinary $tar $spi_flash_load_address

# If we have a I2S peripheral, setup an audio file that we can use
# for sampling data. Note that the format for these files is raw
# sample data, left channel followed by right.
$i2s_mic_audio_file     ?= @sim/config/shodan_infrastructure/test.raw
$i2s_speaker_audio_file ?= @/tmp/speaker.raw

# Uncomment these lines to enable audio
i2s0 InputFile $i2s_mic_audio_file
#i2s0 OutputFile $i2s_speaker_audio_file

$kelvinLibrary ?= @out/kelvin/sim/librenode_kelvin.so
sysbus.cpu2 CpuLibraryPath $kelvinLibrary
# Start the vector core at address 0 of its instruction TCM.
sysbus.cpu2 PC 0x80000000
# Set the vector core to be less interactive to IO for faster execution
$vector_core_mips ?= 1000
sysbus.cpu2 PerformanceInMips $vector_core_mips

# Start GDB and halt both cores so we can connect GDB before the bootrom has
# started.
# cpu2 does not support GDB. Please follow docs/KelvinIssDebugging.md to debug
# Kelvin programs.
$gdb_port?=3333
machine StartGdbServer $gdb_port false cpu0

cpu0 IsHalted true
cpu2 IsHalted true

cpu0 SymbolFile $boot_elf
# NB: in particular this exposes tohost so mpact catches termination
cpu0 SymbolFile $cheriot_elf
# Enable for instruction & memory profiling. Data are written to
# $ROOTDIR/cache/renode/mpact_cheriot_renode* (to be fixed).
#cpu0 InstProfile true
#cpu0 MemProfile true
