Import of kelvin-sim using copybara. Included changes: - 791543651 Migrate to string_view accessors by Shodan Team <no-reply@google.com> - 791439340 Add a DPI wrapper of kelvin_v2 sim. by Shodan Team <no-reply@google.com> - 775102978 Fix 1 ClangTidyReadability finding: by Shodan Team <no-reply@google.com> - 741099598 LSC: Add load statements for C++ rules by Shodan Team <no-reply@google.com> - 740168451 Used header <cstdint> is not included directly by Shodan Team <no-reply@google.com> PiperOrigin-RevId: 791543651 Change-Id: Ia88827fab81a9d75516964c7553adb8603344c8d
diff --git a/WORKSPACE b/WORKSPACE index 5abe502..8fc3a69 100644 --- a/WORKSPACE +++ b/WORKSPACE
@@ -1,24 +1,55 @@ # Setup bazel repository. workspace(name = "kelvin_sim") -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") # MPACT-RiscV repo http_archive( name = "com_google_mpact-riscv", - integrity = "sha256-1UtiuOMLKJK5f1mXiWGfb4Lc1n1kWmSQNNZb80XiLY4=", - strip_prefix = "mpact-riscv-3ed17ec6c5d9cf5fa35ea7100bfa9ae7799fa0d6", - url = "https://github.com/google/mpact-riscv/archive/3ed17ec6c5d9cf5fa35ea7100bfa9ae7799fa0d6.tar.gz", + sha256 = "4e24df1e0b41f1ba04c8f72b1abd3d82b71e4517fa2fcd54c103134f535c0db6", + strip_prefix = "mpact-riscv-92597b9bc9f07f7dedc0d380af70dbc3cf595339", + url = "https://github.com/google/mpact-riscv/archive/92597b9bc9f07f7dedc0d380af70dbc3cf595339.tar.gz", +) + +# Download only the single svdpi.h file. +http_file( + name = "svdpi_h_file", + downloaded_file_path = "svdpi.h", + sha256 = "2528c8e529b66dd8e795c8a0fee326166cc51f7dee8fc6a0c6c930534fc780a6", + urls = ["https://raw.githubusercontent.com/verilator/verilator/v5.028/include/vltstd/svdpi.h"], ) load("@com_google_mpact-riscv//:repos.bzl", "mpact_riscv_repos") + mpact_riscv_repos() -load("@com_google_mpact-sim//:repos.bzl", "mpact_sim_repos") -mpact_sim_repos() +load("@com_google_mpact-riscv//:dep_repos.bzl", "mpact_riscv_dep_repos") -load("@com_google_mpact-sim//:deps.bzl", "mpact_sim_deps") -mpact_sim_deps() +mpact_riscv_dep_repos() -load("@com_google_mpact-sim//:protobuf_deps.bzl", "mpact_sim_protobuf_deps") -mpact_sim_protobuf_deps() +load("@com_google_mpact-riscv//:deps.bzl", "mpact_riscv_deps") + +mpact_riscv_deps() + +http_archive( + name = "rules_python", + sha256 = "9d04041ac92a0985e344235f5d946f71ac543f1b1565f2cdbc9a2aaee8adf55b", + strip_prefix = "rules_python-0.26.0", + url = "https://github.com/bazelbuild/rules_python/releases/download/0.26.0/rules_python-0.26.0.tar.gz", +) + +load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") + +py_repositories() + +python_register_toolchains( + name = "python3", + python_version = "3.9", +) + +http_file( + name = "cc_static_library_external", + downloaded_file_path = "cc_static_libarary.bzl", + sha256 = "1287ce9f7e5fe31ad1b5937781531e4ab3f4656edabf650cca9ca720ceb31806", + urls = ["https://raw.githubusercontent.com/project-oak/oak/fcceea755f0274d3a0eb7c0461b30af3dc28e40a/cc/build_defs.bzl"], +)
diff --git a/sim/BUILD b/sim/BUILD index 7acb134..c2c915e 100644 --- a/sim/BUILD +++ b/sim/BUILD
@@ -15,6 +15,8 @@ # Build rules for Kelvin simulator code. load("@com_google_mpact-sim//mpact/sim/decoder:mpact_sim_isa.bzl", "mpact_bin_fmt_decoder", "mpact_isa_decoder") + + package(default_visibility = ["//visibility:public"]) cc_library(
diff --git a/sim/cosim/BUILD b/sim/cosim/BUILD new file mode 100644 index 0000000..cf69fca --- /dev/null +++ b/sim/cosim/BUILD
@@ -0,0 +1,66 @@ +# Copyright 2025 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. + +# This BUILD file defines the co-simulation library that bridges the +# UVM testbench with the MPACT-Sim model. + + + +load("@cc_static_library_external//file:cc_static_libarary.bzl", "cc_static_library") + +package( + default_visibility = ["//visibility:public"], +) + +cc_library( + name = "kelvin_cosim_lib", + srcs = [ + "kelvin_cosim_dpi_wrapper.cc", + ], + hdrs = [ + "kelvin_cosim_dpi.h", + "@svdpi_h_file//file", + ], + visibility = ["//visibility:public"], + deps = [ + "@com_google_absl//absl/log", + "@com_google_absl//absl/log:check", + "@com_google_absl//absl/strings", + "@com_google_mpact-riscv//riscv:riscv32g_vec_decoder", + "@com_google_mpact-riscv//riscv:riscv32gv_isa", + "@com_google_mpact-riscv//riscv:riscv_fp_state", + "@com_google_mpact-riscv//riscv:riscv_state", + "@com_google_mpact-riscv//riscv:riscv_top", + "@com_google_mpact-sim//mpact/sim/generic:core", + "@com_google_mpact-sim//mpact/sim/util/memory", + ], + alwayslink = True, +) + +# This rule generates the shared library that is loaded and used by an external UVM testbench to +# instantiate and control kelvin sim +cc_binary( + name = "cosim_kelvin", + linkshared = True, + deps = [ + ":kelvin_cosim_lib", + ], +) + +cc_static_library( + name = "kelvin_cosim_lib_static", + deps = [ + ":kelvin_cosim_lib", + ], +)
diff --git a/sim/cosim/kelvin_cosim_dpi.h b/sim/cosim/kelvin_cosim_dpi.h new file mode 100644 index 0000000..5e1c4db --- /dev/null +++ b/sim/cosim/kelvin_cosim_dpi.h
@@ -0,0 +1,75 @@ +// Copyright 2025 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. + +// Defines the DPI-C interface for cosimulation. +// +// These C-style functions allow a SystemVerilog testbench to control an +// MPACT-based golden reference model, running it in lock-step with a +// design under test (DUT). +// +// Note: This interface is designed for a single simulator instance and is not +// thread-safe. + +#ifndef LEARNING_BRAIN_RESEARCH_KELVIN_SIM_COSIM_KELVIN_COSIM_DPI_H_ +#define LEARNING_BRAIN_RESEARCH_KELVIN_SIM_COSIM_KELVIN_COSIM_DPI_H_ + +#include <cstdint> + +#include "external/svdpi_h_file/file/svdpi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Initialize the MPACT simulator. This function must be called before any +// other MPACT functions. +// Return 0 on success, non-zero on failure. +int mpact_init(); + +// Reset the MPACT simulator's architectural state. +// Return 0 on success, non-zero on failure. +int mpact_reset(); + +// Step the MPACT simulator by executing a single provided instruction. +// The instruction is provided as a SystemVerilog datatype - svLogicVecVal*. +// Return 0 on success, non-zero on failure. +int mpact_step(const svLogicVecVal* instruction); + +// Check if the MPACT simulator has reached a halted state. Some tests may +// require the simulator to be halted before checking the results. +// Currently unimplemented and always returns false. +bool mpact_is_halted(); + +// Return the current value of the Program Counter (PC). +// On error, returns 0 and logs an error. +uint32_t mpact_get_pc(); + +// Return the value of the specified GPR. GPRs are selected by their index, +// where 0 is x0, 1 is x1, and so on. +// On error, returns 0 and logs an error. +uint32_t mpact_get_gpr(uint32_t index); + +// Return the value of the specified CSR. CSRs are selected by their address. +// On error, returns 0 and logs an error. +uint32_t mpact_get_csr(uint32_t address); + +// Finalize and clean up MPACT simulator resources. +// Return 0 on success, non-zero on failure. +int mpact_fini(); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // LEARNING_BRAIN_RESEARCH_KELVIN_SIM_COSIM_KELVIN_COSIM_DPI_H_
diff --git a/sim/cosim/kelvin_cosim_dpi_wrapper.cc b/sim/cosim/kelvin_cosim_dpi_wrapper.cc new file mode 100644 index 0000000..3a5d7c3 --- /dev/null +++ b/sim/cosim/kelvin_cosim_dpi_wrapper.cc
@@ -0,0 +1,224 @@ +// Copyright 2025 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. + +#include <cstdint> +#include <memory> +#include <string> + +#include "absl/log/check.h" +#include "absl/log/log.h" +#include "absl/strings/str_cat.h" +#include "riscv/riscv32g_vec_decoder.h" +#include "riscv/riscv_csr.h" +#include "riscv/riscv_fp_state.h" +#include "riscv/riscv_register.h" +#include "riscv/riscv_register_aliases.h" +#include "riscv/riscv_state.h" +#include "riscv/riscv_top.h" +#include "riscv/riscv_vector_state.h" +#include "mpact/sim/generic/decoder_interface.h" +#include "mpact/sim/util/memory/flat_demand_memory.h" +#include "mpact/sim/util/memory/memory_interface.h" +#include "external/svdpi_h_file/file/svdpi.h" + +// Include the DPI-C contract header. +#include "sim/cosim/kelvin_cosim_dpi.h" + +constexpr int kKelvinVectorByteLength = 16; +constexpr uint32_t kKelvinStartAddress = 0; + +namespace { +using ::mpact::sim::generic::DecoderInterface; +using ::mpact::sim::riscv::kXRegisterAliases; +using ::mpact::sim::riscv::RiscV32GVecDecoder; +using ::mpact::sim::riscv::RiscVFPState; +using ::mpact::sim::riscv::RiscVState; +using ::mpact::sim::riscv::RiscVTop; +using ::mpact::sim::riscv::RiscVVectorState; +using ::mpact::sim::riscv::RiscVXlen; +using ::mpact::sim::riscv::RV32Register; +using ::mpact::sim::riscv::RVFpRegister; +using ::mpact::sim::util::FlatDemandMemory; +using ::mpact::sim::util::MemoryInterface; + +class MpactHandle { + public: + MpactHandle() + : memory_(std::make_unique<FlatDemandMemory>()), + rv_state_(CreateRVState(memory_.get())), + rv_fp_state_(CreateFPState(rv_state_.get())), + rvv_state_(CreateVectorState(rv_state_.get())), + rv_decoder_(CreateDecoder(rv_state_.get(), memory_.get())), + rv_top_(CreateRiscVTop(rv_state_.get(), rv_decoder_.get())) { + absl::Status pc_write = rv_top_->WriteRegister("pc", kKelvinStartAddress); + CHECK_OK(pc_write) << "Error writing to pc."; + } + + uint32_t get_pc() { + absl::StatusOr<uint64_t> read_reg_status = rv_top_->ReadRegister("pc"); + CHECK_OK(read_reg_status); + if (!read_reg_status.ok()) { + LOG(ERROR) << "[DPI] Failed to read pc."; + return 0; + } + return static_cast<uint32_t>(read_reg_status.value()); + } + + RiscVTop* rv_top() { return rv_top_.get(); } + + RiscVState* rv_state() { return rv_state_.get(); } + + private: + std::unique_ptr<RiscVState> CreateRVState(MemoryInterface* memory) { + auto rv_state = + std::make_unique<RiscVState>("RiscV32GV", RiscVXlen::RV32, memory); + // Make sure the architectural and abi register aliases are added. + std::string reg_name; + for (int i = 0; i < 32; i++) { + reg_name = absl::StrCat(RiscVState::kXregPrefix, i); + (void)rv_state->AddRegister<RV32Register>(reg_name); + (void)rv_state->AddRegisterAlias<RV32Register>(reg_name, + kXRegisterAliases[i]); + } + return rv_state; + } + + std::unique_ptr<RiscVFPState> CreateFPState(RiscVState* rv_state) { + return std::make_unique<RiscVFPState>(rv_state->csr_set(), rv_state); + } + + std::unique_ptr<RiscVVectorState> CreateVectorState(RiscVState* rv_state) { + return std::make_unique<RiscVVectorState>(rv_state, + kKelvinVectorByteLength); + } + + std::unique_ptr<DecoderInterface> CreateDecoder(RiscVState* rv_state, + MemoryInterface* memory) { + return std::make_unique<RiscV32GVecDecoder>(rv_state, memory); + } + + std::unique_ptr<RiscVTop> CreateRiscVTop(RiscVState* rv_state, + DecoderInterface* decoder) { + return std::make_unique<RiscVTop>("KelvinPlaceholder", rv_state, decoder); + } + + const std::unique_ptr<MemoryInterface> memory_; + const std::unique_ptr<RiscVState> rv_state_; + const std::unique_ptr<RiscVFPState> rv_fp_state_; + const std::unique_ptr<RiscVVectorState> rvv_state_; + const std::unique_ptr<DecoderInterface> rv_decoder_; + const std::unique_ptr<RiscVTop> rv_top_; +}; + +MpactHandle* g_mpact_handle = nullptr; +} // namespace + +int mpact_init() { + if (g_mpact_handle != nullptr) { + LOG(ERROR) << "[DPI] mpact_init: g_mpact_handle is not null. " + << "mpact_fini() must be called first."; + return -1; + } + g_mpact_handle = new MpactHandle(); + return 0; +} + +int mpact_reset() { + if (g_mpact_handle != nullptr) { + mpact_fini(); + } + return mpact_init(); +} + +int mpact_step(const svLogicVecVal* instruction) { + if (g_mpact_handle == nullptr) { + LOG(ERROR) << "[DPI] mpact_step: g_mpact_handle is null."; + return -1; + } + uint32_t inst_word = instruction->aval; + if (!g_mpact_handle->rv_top() + ->WriteMemory(g_mpact_handle->get_pc(), &inst_word, + sizeof(inst_word)) + .ok()) { + LOG(ERROR) << "[DPI] mpact_step: Failed to write instruction to memory."; + return 1; + } + + if (!g_mpact_handle->rv_top()->Step(1).ok()) { + LOG(ERROR) << "[DPI] mpact_step: Failed to step the simulator."; + return 2; + } + return 0; +} + +bool mpact_is_halted() { + if (g_mpact_handle == nullptr) { + LOG(ERROR) << "[DPI] mpact_is_halted: g_mpact_handle is null."; + return false; + } + LOG(ERROR) << "[DPI] mpact_is_halted: Unimplemented."; + return false; +} + +uint32_t mpact_get_pc() { + if (g_mpact_handle == nullptr) { + LOG(ERROR) << "[DPI] mpact_get_pc: g_mpact_handle is null."; + return 0; + } + return g_mpact_handle->get_pc(); +} + +uint32_t mpact_get_gpr(uint32_t index) { + if (g_mpact_handle == nullptr) { + LOG(ERROR) << "[DPI] mpact_get_gpr: g_mpact_handle is null."; + return 0; + } + std::string reg_name = + absl::StrCat(mpact::sim::riscv::RiscVState::kXregPrefix, index); + mpact::sim::riscv::RiscVTop* rv_top = g_mpact_handle->rv_top(); + absl::StatusOr<uint64_t> read_reg_status = rv_top->ReadRegister(reg_name); + if (!read_reg_status.ok()) { + LOG(ERROR) << "[DPI] mpact_get_gpr: Failed to read register: " << reg_name; + return 0; + } + return static_cast<uint32_t>(read_reg_status.value()); +} + +uint32_t mpact_get_csr(uint32_t address) { + if (g_mpact_handle == nullptr) { + LOG(ERROR) << "[DPI] mpact_get_csr: g_mpact_handle is null."; + return 0; + } + uint64_t csr_index = static_cast<uint64_t>(address); + + absl::StatusOr<mpact::sim::riscv::RiscVCsrInterface*> get_csr_status = + g_mpact_handle->rv_state()->csr_set()->GetCsr(csr_index); + + if (!get_csr_status.ok()) { + LOG(ERROR) << "[DPI] mpact_get_csr: Failed to get CSR: " << address; + return 0; + } + mpact::sim::riscv::RiscVCsrInterface* csr = get_csr_status.value(); + return csr->AsUint32(); +} + +int mpact_fini() { + if (g_mpact_handle == nullptr) { + LOG(ERROR) << "[DPI] mpact_fini: g_mpact_handle is null."; + return -1; + } + delete g_mpact_handle; + g_mpact_handle = nullptr; + return 0; +}
diff --git a/sim/decoder.cc b/sim/decoder.cc index 030b21a..62b6f0c 100644 --- a/sim/decoder.cc +++ b/sim/decoder.cc
@@ -14,6 +14,8 @@ #include "sim/decoder.h" +#include <cstdint> + #include "sim/kelvin_decoder.h" #include "sim/kelvin_encoding.h" #include "sim/kelvin_enums.h" @@ -28,8 +30,8 @@ using ::mpact::sim::generic::operator*; // NOLINT: is used below (clang error). -KelvinDecoder::KelvinDecoder(KelvinState *state, - mpact::sim::util::MemoryInterface *memory) +KelvinDecoder::KelvinDecoder(KelvinState* state, + mpact::sim::util::MemoryInterface* memory) : state_(state), memory_(memory) { // Get a handle to the internal error in the program error controller. decode_error_ = state->program_error_controller()->GetProgramError( @@ -54,14 +56,14 @@ delete kelvin_encoding_; } -mpact::sim::generic::Instruction *KelvinDecoder::DecodeInstruction( +mpact::sim::generic::Instruction* KelvinDecoder::DecodeInstruction( uint64_t address) { // First check that the address is aligned properly. If not, create and return // an empty instruction object and raise an exception. if (address & 0x1) { - auto *inst = new mpact::sim::generic::Instruction(address, state_); + auto* inst = new mpact::sim::generic::Instruction(address, state_); inst->set_semantic_function( - [](mpact::sim::generic::Instruction *inst) { /* empty */ }); + [](mpact::sim::generic::Instruction* inst) { /* empty */ }); inst->set_size(1); inst->SetDisassemblyString("Misaligned instruction address"); inst->set_opcode(static_cast<int>(isa32::OpcodeEnum::kNone)); @@ -77,12 +79,12 @@ state_->Trap(/*is_interrupt*/ false, address, *mpact::sim::riscv::ExceptionCode::kInstructionAccessFault, address, nullptr); - auto *inst = new mpact::sim::generic::Instruction(address, state_); + auto* inst = new mpact::sim::generic::Instruction(address, state_); inst->set_size(0); inst->SetDisassemblyString("Instruction access fault"); inst->set_opcode(static_cast<int>(isa32::OpcodeEnum::kNone)); inst->set_semantic_function( - [](mpact::sim::generic::Instruction *inst) { /* empty */ }); + [](mpact::sim::generic::Instruction* inst) { /* empty */ }); return inst; } @@ -93,7 +95,7 @@ // Call the isa decoder to obtain a new instruction object for the instruction // word that was parsed above. - auto *instruction = kelvin_isa_->Decode(address, kelvin_encoding_); + auto* instruction = kelvin_isa_->Decode(address, kelvin_encoding_); return instruction; } } // namespace kelvin::sim
diff --git a/sim/decoder.h b/sim/decoder.h index 731169f..3ec5187 100644 --- a/sim/decoder.h +++ b/sim/decoder.h
@@ -39,7 +39,7 @@ class KelvinIsaFactory : public isa32::KelvinInstructionSetFactory { public: std::unique_ptr<isa32::KelvinSlot> CreateKelvinSlot( - mpact::sim::generic::ArchState *state) override { + mpact::sim::generic::ArchState* state) override { return std::make_unique<isa32::KelvinSlot>(state); } }; @@ -51,14 +51,14 @@ using SlotEnum = isa32::SlotEnum; using OpcodeEnum = isa32::OpcodeEnum; - KelvinDecoder(KelvinState *state, mpact::sim::util::MemoryInterface *memory); + KelvinDecoder(KelvinState* state, mpact::sim::util::MemoryInterface* memory); KelvinDecoder() = delete; ~KelvinDecoder() override; // This will always return a valid instruction that can be executed. In the // case of a decode error, the semantic function in the instruction object // instance will raise an internal simulator error when executed. - mpact::sim::generic::Instruction *DecodeInstruction( + mpact::sim::generic::Instruction* DecodeInstruction( uint64_t address) override; // Return the number of opcodes supported by this decoder. @@ -66,21 +66,21 @@ return static_cast<int>(OpcodeEnum::kPastMaxValue); } // Return the name of the opcode at the given index. - const char *GetOpcodeName(int index) const override { + const char* GetOpcodeName(int index) const override { return isa32::kOpcodeNames[index]; } // Getter. - isa32::KelvinEncoding *kelvin_encoding() const { return kelvin_encoding_; } + isa32::KelvinEncoding* kelvin_encoding() const { return kelvin_encoding_; } private: - KelvinState *state_; - mpact::sim::util::MemoryInterface *memory_; + KelvinState* state_; + mpact::sim::util::MemoryInterface* memory_; std::unique_ptr<mpact::sim::generic::ProgramError> decode_error_; - mpact::sim::generic::DataBuffer *inst_db_; - isa32::KelvinEncoding *kelvin_encoding_; - KelvinIsaFactory *kelvin_isa_factory_; - isa32::KelvinInstructionSet *kelvin_isa_; + mpact::sim::generic::DataBuffer* inst_db_; + isa32::KelvinEncoding* kelvin_encoding_; + KelvinIsaFactory* kelvin_isa_factory_; + isa32::KelvinInstructionSet* kelvin_isa_; }; } // namespace kelvin::sim
diff --git a/sim/kelvin_action_point_memory_interface.cc b/sim/kelvin_action_point_memory_interface.cc index d754a78..8acae7e 100644 --- a/sim/kelvin_action_point_memory_interface.cc +++ b/sim/kelvin_action_point_memory_interface.cc
@@ -23,7 +23,7 @@ namespace kelvin::sim { KelvinActionPointMemoryInterface::KelvinActionPointMemoryInterface( - MemoryInterface *memory, InvalidateFcn invalidate_fcn) + MemoryInterface* memory, InvalidateFcn invalidate_fcn) : memory_(memory), invalidate_fcn_(std::move(invalidate_fcn)) { // Allocate two data buffers (32 and 16 bit) once, so we don't have to // do it every time we access breakpoint instructions. @@ -32,7 +32,7 @@ KelvinActionPointMemoryInterface::~KelvinActionPointMemoryInterface() { if (db4_ != nullptr) db4_->DecRef(); - for (auto &[unused, inst_info_ptr] : instruction_map_) { + for (auto& [unused, inst_info_ptr] : instruction_map_) { delete inst_info_ptr; } instruction_map_.clear(); @@ -65,7 +65,7 @@ return absl::InvalidArgumentError(absl::StrCat( "Invalid instruction size: ", size, " at ", absl::Hex(address))); } - auto *inst_info = new InstructionInfo; + auto* inst_info = new InstructionInfo; inst_info->og_instruction_word = instruction_word; inst_info->size = size; it = instruction_map_.insert(std::make_pair(address, inst_info)).first;
diff --git a/sim/kelvin_action_point_memory_interface.h b/sim/kelvin_action_point_memory_interface.h index ea88e52..b48f3cf 100644 --- a/sim/kelvin_action_point_memory_interface.h +++ b/sim/kelvin_action_point_memory_interface.h
@@ -45,7 +45,7 @@ // The constructor takes a pointer to the memory interface through which // instructions can be read and written,and a function to invalidate the // decoding of an instruction. - KelvinActionPointMemoryInterface(MemoryInterface *memory, + KelvinActionPointMemoryInterface(MemoryInterface* memory, InvalidateFcn invalidate_fcn); ~KelvinActionPointMemoryInterface() override; @@ -69,11 +69,11 @@ // Data buffer factory and two data buffer pointers to use for reading and // writing instructions. DataBufferFactory db_factory_; - DataBuffer *db4_ = nullptr; + DataBuffer* db4_ = nullptr; // Maps from address to information about the instruction. - absl::flat_hash_map<uint64_t, InstructionInfo *> instruction_map_; + absl::flat_hash_map<uint64_t, InstructionInfo*> instruction_map_; // Interface to program memory. - MemoryInterface *memory_; + MemoryInterface* memory_; // Function to be called to invalidate any stored decoding of an instruction. InvalidateFcn invalidate_fcn_; };
diff --git a/sim/kelvin_encoding.cc b/sim/kelvin_encoding.cc index b5026c3..fcda936 100644 --- a/sim/kelvin_encoding.cc +++ b/sim/kelvin_encoding.cc
@@ -39,8 +39,8 @@ template <typename RegType> inline void GetVRegGroup( - KelvinState *state, int reg_num, bool strip_mine, int widen_factor, - std::vector<mpact::sim::generic::RegisterBase *> *vreg_group) { + KelvinState* state, int reg_num, bool strip_mine, int widen_factor, + std::vector<mpact::sim::generic::RegisterBase*>* vreg_group) { auto regs_count = (strip_mine ? 4 : 1) * widen_factor; for (int i = 0; i < regs_count; ++i) { auto vreg_name = @@ -50,78 +50,78 @@ } template <typename RegType> -inline SourceOperandInterface *GetVectorRegisterSourceOp(KelvinState *state, +inline SourceOperandInterface* GetVectorRegisterSourceOp(KelvinState* state, int reg_num, bool strip_mine, int widen_factor) { - std::vector<mpact::sim::generic::RegisterBase *> vreg_group; + std::vector<mpact::sim::generic::RegisterBase*> vreg_group; GetVRegGroup<RegType>(state, reg_num, strip_mine, widen_factor, &vreg_group); - auto *v_src_op = new mpact::sim::riscv::RV32VectorSourceOperand( - absl::Span<mpact::sim::generic::RegisterBase *>(vreg_group), + auto* v_src_op = new mpact::sim::riscv::RV32VectorSourceOperand( + absl::Span<mpact::sim::generic::RegisterBase*>(vreg_group), absl::StrCat(mpact::sim::riscv::RiscVState::kVregPrefix, reg_num)); return v_src_op; } template <typename RegType> -inline DestinationOperandInterface *GetVectorRegisterDestinationOp( - KelvinState *state, int reg_num, bool strip_mine, bool widening, +inline DestinationOperandInterface* GetVectorRegisterDestinationOp( + KelvinState* state, int reg_num, bool strip_mine, bool widening, int latency) { - std::vector<mpact::sim::generic::RegisterBase *> vreg_group; + std::vector<mpact::sim::generic::RegisterBase*> vreg_group; GetVRegGroup<RegType>(state, reg_num, strip_mine, widening ? 2 : 1, &vreg_group); - auto *v_dst_op = new mpact::sim::riscv::RV32VectorDestinationOperand( - absl::Span<mpact::sim::generic::RegisterBase *>(vreg_group), latency, + auto* v_dst_op = new mpact::sim::riscv::RV32VectorDestinationOperand( + absl::Span<mpact::sim::generic::RegisterBase*>(vreg_group), latency, absl::StrCat(mpact::sim::riscv::RiscVState::kVregPrefix, reg_num)); return v_dst_op; } // Generic helper functions to create register operands. template <typename RegType> -inline DestinationOperandInterface *GetRegisterDestinationOp(KelvinState *state, +inline DestinationOperandInterface* GetRegisterDestinationOp(KelvinState* state, std::string name, int latency) { - auto *reg = state->GetRegister<RegType>(name).first; + auto* reg = state->GetRegister<RegType>(name).first; return reg->CreateDestinationOperand(latency); } template <typename RegType> -inline DestinationOperandInterface *GetRegisterDestinationOp( - KelvinState *state, std::string name, int latency, std::string op_name) { - auto *reg = state->GetRegister<RegType>(name).first; +inline DestinationOperandInterface* GetRegisterDestinationOp( + KelvinState* state, std::string name, int latency, std::string op_name) { + auto* reg = state->GetRegister<RegType>(name).first; return reg->CreateDestinationOperand(latency, op_name); } template <typename T> -inline DestinationOperandInterface *GetCSRSetBitsDestinationOp( - KelvinState *state, std::string name, int latency, std::string op_name) { +inline DestinationOperandInterface* GetCSRSetBitsDestinationOp( + KelvinState* state, std::string name, int latency, std::string op_name) { auto result = state->csr_set()->GetCsr(name); if (!result.ok()) { LOG(ERROR) << "No such CSR '" << name << "'"; return nullptr; } - auto *csr = result.value(); - auto *op = csr->CreateSetDestinationOperand(latency, op_name); + auto* csr = result.value(); + auto* op = csr->CreateSetDestinationOperand(latency, op_name); return op; } template <typename RegType> -inline SourceOperandInterface *GetRegisterSourceOp(KelvinState *state, +inline SourceOperandInterface* GetRegisterSourceOp(KelvinState* state, std::string name) { - auto *reg = state->GetRegister<RegType>(name).first; - auto *op = reg->CreateSourceOperand(); + auto* reg = state->GetRegister<RegType>(name).first; + auto* op = reg->CreateSourceOperand(); return op; } template <typename RegType> -inline SourceOperandInterface *GetRegisterSourceOp(KelvinState *state, +inline SourceOperandInterface* GetRegisterSourceOp(KelvinState* state, std::string name, std::string op_name) { - auto *reg = state->GetRegister<RegType>(name).first; - auto *op = reg->CreateSourceOperand(op_name); + auto* reg = state->GetRegister<RegType>(name).first; + auto* op = reg->CreateSourceOperand(op_name); return op; } -KelvinEncoding::KelvinEncoding(KelvinState *state) : state_(state) { +KelvinEncoding::KelvinEncoding(KelvinState* state) : state_(state) { InitializeSourceOperandGetters(); InitializeDestinationOperandGetters(); resource_pool_ = new mpact::sim::generic::SimpleResourcePool("Kelvin", 128); @@ -148,7 +148,7 @@ if (!res.ok()) { return new mpact::sim::generic::ImmediateOperand<uint32_t>(csr_indx); } - auto *csr = res.value(); + auto* csr = res.value(); return new mpact::sim::generic::ImmediateOperand<uint32_t>(csr_indx, csr->name()); })); @@ -179,7 +179,7 @@ })); source_op_getters_.insert(std::make_pair( static_cast<int>(SourceOpEnum::kRs1), - [this]() -> SourceOperandInterface * { + [this]() -> SourceOperandInterface* { int num = encoding::r_type::ExtractRs1(inst_word_); if (num == 0) return new mpact::sim::generic::IntLiteralOperand<0>( @@ -191,7 +191,7 @@ })); source_op_getters_.insert(std::make_pair( static_cast<int>(SourceOpEnum::kRs2), - [this]() -> SourceOperandInterface * { + [this]() -> SourceOperandInterface* { int num = encoding::r_type::ExtractRs2(inst_word_); if (num == 0) return new mpact::sim::generic::IntLiteralOperand<0>( @@ -213,7 +213,7 @@ })); source_op_getters_.emplace( static_cast<int>(SourceOpEnum::kVs1), - [this]() -> SourceOperandInterface * { + [this]() -> SourceOperandInterface* { auto reg_num = encoding::kelvin_v2_args_type::ExtractVs1(inst_word_); bool strip_mine = encoding::kelvin_v2_args_type::ExtractM(inst_word_); auto form = encoding::kelvin_v2_args_type::ExtractForm(inst_word_); @@ -245,7 +245,7 @@ }); source_op_getters_.emplace( static_cast<int>(SourceOpEnum::kVs2), - [this]() -> SourceOperandInterface * { + [this]() -> SourceOperandInterface* { auto reg_num = encoding::kelvin_v2_args_type::ExtractVs2(inst_word_); bool strip_mine = encoding::kelvin_v2_args_type::ExtractM(inst_word_); auto form = encoding::kelvin_v2_args_type::ExtractForm(inst_word_); @@ -269,8 +269,7 @@ source_op_getters_.emplace( // `vst` and `vstq` use `vd` field as the source for the vector store. // convolution instructions also use `vd` as one of the sources. - static_cast<int>(SourceOpEnum::kVd), - [this]() -> SourceOperandInterface * { + static_cast<int>(SourceOpEnum::kVd), [this]() -> SourceOperandInterface* { auto reg_num = encoding::kelvin_v2_args_type::ExtractVd(inst_word_); bool strip_mine = encoding::kelvin_v2_args_type::ExtractM(inst_word_); return GetVectorRegisterSourceOp<mpact::sim::riscv::RVVectorRegister>( @@ -279,7 +278,7 @@ source_op_getters_.emplace( // Used by convolution instructions. static_cast<int>(SourceOpEnum::kVs3), - [this]() -> SourceOperandInterface * { + [this]() -> SourceOperandInterface* { auto reg_num = encoding::kelvin_v3_args_type::ExtractVs3(inst_word_); int widen_factor = opcode_ == OpcodeEnum::kAconvVxv ? 8 : 4; return GetVectorRegisterSourceOp<mpact::sim::riscv::RVVectorRegister>( @@ -303,7 +302,7 @@ })); dest_op_getters_.insert(std::make_pair( static_cast<int>(DestOpEnum::kRd), - [this](int latency) -> DestinationOperandInterface * { + [this](int latency) -> DestinationOperandInterface* { int num = encoding::r_type::ExtractRd(inst_word_); if (num == 0) { return GetRegisterDestinationOp<mpact::sim::riscv::RV32Register>( @@ -316,7 +315,7 @@ })); dest_op_getters_.emplace( static_cast<int>(DestOpEnum::kVd), - [this](int latency) -> DestinationOperandInterface * { + [this](int latency) -> DestinationOperandInterface* { auto reg_num = encoding::kelvin_v2_args_type::ExtractVd(inst_word_); bool strip_mine = encoding::kelvin_v2_args_type::ExtractM(inst_word_); if (opcode_ == OpcodeEnum::kVcget || opcode_ == OpcodeEnum::kAdwinit || @@ -332,7 +331,7 @@ }); dest_op_getters_.insert(std::make_pair( static_cast<int>(DestOpEnum::kVs1), - [this](int latency) -> DestinationOperandInterface * { + [this](int latency) -> DestinationOperandInterface* { auto reg_num = encoding::kelvin_v2_args_type::ExtractVs1(inst_word_); // Only vld.*p/vst.*p instructions are writing post incremented address // to "vs1" register. And it has to be a scalar register in that case. @@ -366,13 +365,13 @@ decode_functions.push_back(encoding::DecodeRiscVZbbInst32); decode_functions.push_back(encoding::DecodeRiscVZbbInst32Only); decode_functions.push_back(encoding::DecodeRiscVZbbImmInst32); - for (auto &function : decode_functions) { + for (auto& function : decode_functions) { opcode_ = function(inst_word_); if (opcode_ != OpcodeEnum::kNone) break; } } -DestinationOperandInterface *KelvinEncoding::GetDestination(SlotEnum, int, +DestinationOperandInterface* KelvinEncoding::GetDestination(SlotEnum, int, OpcodeEnum opcode, DestOpEnum dest_op, int, int latency) { @@ -387,7 +386,7 @@ return (iter->second)(latency); } -SourceOperandInterface *KelvinEncoding::GetSource(SlotEnum, int, +SourceOperandInterface* KelvinEncoding::GetSource(SlotEnum, int, OpcodeEnum opcode, SourceOpEnum source_op, int source_no) {
diff --git a/sim/kelvin_encoding.h b/sim/kelvin_encoding.h index 51cfeae..fd67560 100644 --- a/sim/kelvin_encoding.h +++ b/sim/kelvin_encoding.h
@@ -36,7 +36,7 @@ // instructions according to the operand fields in the encoding. class KelvinEncoding : public KelvinEncodingBase { public: - explicit KelvinEncoding(KelvinState *state); + explicit KelvinEncoding(KelvinState* state); ~KelvinEncoding() override; // Parses an instruction and determines the opcode. @@ -46,7 +46,7 @@ OpcodeEnum GetOpcode(SlotEnum, int) override { return opcode_; } // There is no predicate, so return nullptr. - PredicateOperandInterface *GetPredicate(SlotEnum, int, OpcodeEnum, + PredicateOperandInterface* GetPredicate(SlotEnum, int, OpcodeEnum, PredOpEnum) override { return nullptr; } @@ -58,12 +58,12 @@ // where the resource itself is a register bank, and the argument specifies // which register (or more precisely) which encoding "field" specifies the // register number. - ResourceOperandInterface *GetSimpleResourceOperand( - SlotEnum, int, OpcodeEnum, SimpleResourceVector &resource_vec, + ResourceOperandInterface* GetSimpleResourceOperand( + SlotEnum, int, OpcodeEnum, SimpleResourceVector& resource_vec, int end) override { return nullptr; } - ResourceOperandInterface *GetComplexResourceOperand( + ResourceOperandInterface* GetComplexResourceOperand( SlotEnum, int, OpcodeEnum, ComplexResourceEnum resource, int begin, int end) override { return nullptr; @@ -71,12 +71,12 @@ // The following method returns a source operand that corresponds to the // particular operand field. - SourceOperandInterface *GetSource(SlotEnum, int, OpcodeEnum, SourceOpEnum op, + SourceOperandInterface* GetSource(SlotEnum, int, OpcodeEnum, SourceOpEnum op, int source_no) override; // The following method returns a destination operand that corresponds to the // particular operand field. - DestinationOperandInterface *GetDestination(SlotEnum, int, OpcodeEnum, + DestinationOperandInterface* GetDestination(SlotEnum, int, OpcodeEnum, DestOpEnum op, int, int latency) override; @@ -88,20 +88,20 @@ } // Getter. - mpact::sim::generic::SimpleResourcePool *resource_pool() const { + mpact::sim::generic::SimpleResourcePool* resource_pool() const { return resource_pool_; } protected: using SourceOpGetterMap = - absl::flat_hash_map<int, absl::AnyInvocable<SourceOperandInterface *()>>; + absl::flat_hash_map<int, absl::AnyInvocable<SourceOperandInterface*()>>; using DestOpGetterMap = absl::flat_hash_map< - int, absl::AnyInvocable<DestinationOperandInterface *(int)>>; + int, absl::AnyInvocable<DestinationOperandInterface*(int)>>; - SourceOpGetterMap &source_op_getters() { return source_op_getters_; } - DestOpGetterMap &dest_op_getters() { return dest_op_getters_; } + SourceOpGetterMap& source_op_getters() { return source_op_getters_; } + DestOpGetterMap& dest_op_getters() { return dest_op_getters_; } - KelvinState *state() const { return state_; } + KelvinState* state() const { return state_; } OpcodeEnum opcode() const { return opcode_; } uint32_t inst_word() const { return inst_word_; } @@ -116,10 +116,10 @@ SourceOpGetterMap source_op_getters_; DestOpGetterMap dest_op_getters_; - KelvinState *state_; + KelvinState* state_; uint32_t inst_word_; OpcodeEnum opcode_; - mpact::sim::generic::SimpleResourcePool *resource_pool_ = nullptr; + mpact::sim::generic::SimpleResourcePool* resource_pool_ = nullptr; }; } // namespace kelvin::sim::isa32
diff --git a/sim/kelvin_instructions.cc b/sim/kelvin_instructions.cc index 39b59fb..f9b9aba 100644 --- a/sim/kelvin_instructions.cc +++ b/sim/kelvin_instructions.cc
@@ -26,17 +26,17 @@ using ::mpact::sim::generic::operator*; // NOLINT: is used below (clang error). -void KelvinIllegalInstruction(mpact::sim::generic::Instruction *inst) { - auto *state = static_cast<KelvinState *>(inst->state()); +void KelvinIllegalInstruction(mpact::sim::generic::Instruction* inst) { + auto* state = static_cast<KelvinState*>(inst->state()); state->Trap(/*is_interrupt*/ false, /*trap_value*/ 0, *mpact::sim::riscv::ExceptionCode::kIllegalInstruction, /*epc*/ inst->address(), inst); } -void KelvinNopInstruction(mpact::sim::generic::Instruction *inst) {} +void KelvinNopInstruction(mpact::sim::generic::Instruction* inst) {} -void KelvinIMpause(const mpact::sim::generic::Instruction *inst) { - auto *state = static_cast<KelvinState *>(inst->state()); +void KelvinIMpause(const mpact::sim::generic::Instruction* inst) { + auto* state = static_cast<KelvinState*>(inst->state()); state->MPause(inst); } @@ -49,17 +49,17 @@ // A helper function to load a string from the memory address by detecting the // '\0' terminator -void KelvinStringLoadHelper(const mpact::sim::generic::Instruction *inst, - std::string *out_string) { - auto *state = static_cast<KelvinState *>(inst->state()); +void KelvinStringLoadHelper(const mpact::sim::generic::Instruction* inst, + std::string* out_string) { + auto* state = static_cast<KelvinState*>(inst->state()); auto addr = mpact::sim::generic::GetInstructionSource<uint32_t>(inst, 0, 0); uint32_t data; - auto *db = state->db_factory()->Allocate<uint32_t>(1); + auto* db = state->db_factory()->Allocate<uint32_t>(1); do { state->LoadMemory(inst, addr, db, nullptr, nullptr); data = db->Get<uint32_t>(0); *out_string += - std::string(reinterpret_cast<char *>(&data), sizeof(uint32_t)); + std::string(reinterpret_cast<char*>(&data), sizeof(uint32_t)); addr += 4; } while (!WordHasZero(data) && addr < state->max_physical_address()); // Trim the string properly. @@ -69,8 +69,8 @@ // Handle FLOG, SLOG, CLOG, and KLOG instructions void KelvinLogInstruction(int log_mode, - mpact::sim::generic::Instruction *inst) { - auto *state = static_cast<KelvinState *>(inst->state()); + mpact::sim::generic::Instruction* inst) { + auto* state = static_cast<KelvinState*>(inst->state()); switch (log_mode) { case 0: { // Format log op to set the format of the printout and print it. std::string format_string; @@ -89,11 +89,11 @@ case 2: { // Character log op to load a group of char[4] as an argument. auto data = mpact::sim::generic::GetInstructionSource<uint32_t>(inst, 0, 0); - auto *clog_string = state->clog_string(); + auto* clog_string = state->clog_string(); // CLOG can break a long character array as multiple CLOG calls, and they // need to be combined as a single string argument. *clog_string += - std::string(reinterpret_cast<char *>(&data), sizeof(uint32_t)); + std::string(reinterpret_cast<char*>(&data), sizeof(uint32_t)); if (WordHasZero(data)) { // Trim the string properly. clog_string->resize(clog_string->find('\0')); @@ -115,12 +115,12 @@ // Handle Store instructions for mmap_uncached addresses template <typename T> -void KelvinIStore(Instruction *inst) { +void KelvinIStore(Instruction* inst) { uint32_t base = mpact::sim::generic::GetInstructionSource<uint32_t>(inst, 0); int32_t offset = mpact::sim::generic::GetInstructionSource<int32_t>(inst, 1); uint32_t address = base + offset; T value = mpact::sim::generic::GetInstructionSource<T>(inst, 2); - auto *state = static_cast<KelvinState *>(inst->state()); + auto* state = static_cast<KelvinState*>(inst->state()); // Check and exclude the cache invalidation bit. However, the semihost tests // use the memory space greater than the kelvin HW configuration and do not // comply to the magic bit setting. Exclude the check and mask for those @@ -129,14 +129,14 @@ kKelvinMaxMemoryAddress) { // exclude semihost tests address &= kMemMask; } - auto *db = state->db_factory()->Allocate(sizeof(T)); + auto* db = state->db_factory()->Allocate(sizeof(T)); db->Set<T>(0, value); state->StoreMemory(inst, address, db); db->DecRef(); } -template void KelvinIStore<uint32_t>(mpact::sim::generic::Instruction *inst); -template void KelvinIStore<uint16_t>(mpact::sim::generic::Instruction *inst); -template void KelvinIStore<uint8_t>(mpact::sim::generic::Instruction *inst); +template void KelvinIStore<uint32_t>(mpact::sim::generic::Instruction* inst); +template void KelvinIStore<uint16_t>(mpact::sim::generic::Instruction* inst); +template void KelvinIStore<uint8_t>(mpact::sim::generic::Instruction* inst); } // namespace kelvin::sim
diff --git a/sim/kelvin_instructions.h b/sim/kelvin_instructions.h index 700e2e7..6e7d058 100644 --- a/sim/kelvin_instructions.h +++ b/sim/kelvin_instructions.h
@@ -26,16 +26,16 @@ namespace kelvin::sim { -void KelvinIllegalInstruction(mpact::sim::generic::Instruction *inst); +void KelvinIllegalInstruction(mpact::sim::generic::Instruction* inst); -void KelvinNopInstruction(mpact::sim::generic::Instruction *inst); +void KelvinNopInstruction(mpact::sim::generic::Instruction* inst); -void KelvinIMpause(const mpact::sim::generic::Instruction *inst); +void KelvinIMpause(const mpact::sim::generic::Instruction* inst); -void KelvinLogInstruction(int log_mode, mpact::sim::generic::Instruction *inst); +void KelvinLogInstruction(int log_mode, mpact::sim::generic::Instruction* inst); template <typename T> -void KelvinIStore(mpact::sim::generic::Instruction *inst); +void KelvinIStore(mpact::sim::generic::Instruction* inst); } // namespace kelvin::sim
diff --git a/sim/kelvin_sim.cc b/sim/kelvin_sim.cc index ca5717a..97a67c1 100644 --- a/sim/kelvin_sim.cc +++ b/sim/kelvin_sim.cc
@@ -50,7 +50,7 @@ "Optionally set the entry point of the program."); // Static pointer to the top instance. Used by the control-C handler. -static kelvin::sim::KelvinTop *top = nullptr; +static kelvin::sim::KelvinTop* top = nullptr; // Control-c handler to interrupt any running simulation. static void sim_sigint_handler(int arg) { @@ -65,8 +65,8 @@ // Custom debug command to print all the scalar register values. static bool PrintRegisters( absl::string_view input, - const mpact::sim::riscv::DebugCommandShell::CoreAccess &core_access, - std::string &output) { + const mpact::sim::riscv::DebugCommandShell::CoreAccess& core_access, + std::string& output) { LazyRE2 xreg_info_re{R"(\s*reg\s+info\s*)"}; if (!RE2::FullMatch(input, *xreg_info_re)) { return false; @@ -90,8 +90,8 @@ // Custom debug command to print all the assigned vector register values. static bool PrintVectorRegisters( absl::string_view input, - const mpact::sim::riscv::DebugCommandShell::CoreAccess &core_access, - std::string &output) { + const mpact::sim::riscv::DebugCommandShell::CoreAccess& core_access, + std::string& output) { LazyRE2 vreg_info_re{R"(\s*vreg\s+info\s*)"}; if (!RE2::FullMatch(input, *vreg_info_re)) { return false; @@ -104,7 +104,7 @@ // Skip the register if error occurs. continue; } - auto *db = result.value(); + auto* db = result.value(); if (db == nullptr) { // Skip the register if the data buffer is not available. continue; @@ -124,19 +124,19 @@ } // Use ELF file's magic word to determine if the input file is an ELF file. -static bool IsElfFile(std::string &file_name) { +static bool IsElfFile(std::string& file_name) { std::ifstream image_file; image_file.open(file_name, std::ios::in | std::ios::binary); if (image_file.good()) { uint32_t magic_word; - image_file.read(reinterpret_cast<char *>(&magic_word), sizeof(magic_word)); + image_file.read(reinterpret_cast<char*>(&magic_word), sizeof(magic_word)); image_file.close(); return magic_word == 0x464c457f; // little endian ELF magic word. } return false; } -int main(int argc, char **argv) { +int main(int argc, char** argv) { absl::InitializeLog(); absl::SetProgramUsageMessage("Kelvin MPACT-Sim based CLI tool"); auto out_args = absl::ParseCommandLine(argc, argv);
diff --git a/sim/kelvin_state.cc b/sim/kelvin_state.cc index 36b06b6..1a7d150 100644 --- a/sim/kelvin_state.cc +++ b/sim/kelvin_state.cc
@@ -43,8 +43,8 @@ KelvinState::KelvinState( absl::string_view id, mpact::sim::riscv::RiscVXlen xlen, - mpact::sim::util::MemoryInterface *memory, - mpact::sim::util::AtomicMemoryOpInterface *atomic_memory) + mpact::sim::util::MemoryInterface* memory, + mpact::sim::util::AtomicMemoryOpInterface* atomic_memory) : mpact::sim::riscv::RiscVState(id, xlen, memory, atomic_memory), kisa_("kisa", static_cast<RiscVCsrEnum>(KelvinCsrEnum::kKIsa), this) { auto res = csr_set()->GetCsr("minstret"); @@ -65,21 +65,21 @@ LOG(FATAL) << "Failed to register kisa"; } - absl::StatusOr<RiscVCsrInterface *> result = csr_set()->GetCsr("misa"); + absl::StatusOr<RiscVCsrInterface*> result = csr_set()->GetCsr("misa"); if (!result.ok()) { LOG(FATAL) << "Failed to get misa"; } - auto *misa = *result; + auto* misa = *result; misa->Set(kKelvinMisaVal); } KelvinState::KelvinState(absl::string_view id, mpact::sim::riscv::RiscVXlen xlen, - mpact::sim::util::MemoryInterface *memory) + mpact::sim::util::MemoryInterface* memory) : KelvinState(id, xlen, memory, nullptr) {} -void KelvinState::MPause(const Instruction *inst) { - for (auto &handler : on_mpause_) { +void KelvinState::MPause(const Instruction* inst) { + for (auto& handler : on_mpause_) { bool res = handler(inst); if (res) return; } @@ -90,7 +90,7 @@ // Print the logging message based on log_args_. void KelvinState::PrintLog(absl::string_view format_string) { - char *print_ptr = const_cast<char *>(format_string.data()); + char* print_ptr = const_cast<char*>(format_string.data()); std::string log_string = ""; while (*print_ptr) { if (*print_ptr == '%') {
diff --git a/sim/kelvin_state.h b/sim/kelvin_state.h index c9fe51d..1e3631d 100644 --- a/sim/kelvin_state.h +++ b/sim/kelvin_state.h
@@ -61,38 +61,38 @@ class KelvinState : public mpact::sim::riscv::RiscVState { public: KelvinState(absl::string_view id, mpact::sim::riscv::RiscVXlen xlen, - mpact::sim::util::MemoryInterface *memory, - mpact::sim::util::AtomicMemoryOpInterface *atomic_memory); + mpact::sim::util::MemoryInterface* memory, + mpact::sim::util::AtomicMemoryOpInterface* atomic_memory); KelvinState(absl::string_view id, mpact::sim::riscv::RiscVXlen xlen, - mpact::sim::util::MemoryInterface *memory); + mpact::sim::util::MemoryInterface* memory); ~KelvinState() override = default; // Deleted Constructors and operators. - KelvinState(const KelvinState &) = delete; - KelvinState(KelvinState &&) = delete; - KelvinState &operator=(const KelvinState &) = delete; - KelvinState &operator=(KelvinState &&) = delete; + KelvinState(const KelvinState&) = delete; + KelvinState(KelvinState&&) = delete; + KelvinState& operator=(const KelvinState&) = delete; + KelvinState& operator=(KelvinState&&) = delete; void set_vector_length(uint32_t length) { vector_length_ = length; } uint32_t vector_length() const { return vector_length_; } - AccArrayType *acc_vec(int index) { return &(acc_register_[index]); } + AccArrayType* acc_vec(int index) { return &(acc_register_[index]); } AccArrayTemplate<AccArrayType> acc_register() const { return acc_register_; } - uint32_t *dw_acc_vec(int i) { return &depthwise_acc_register_[i]; } - DwAccArray &dw_acc_register() { return depthwise_acc_register_; } - const DwAccArray &dw_acc_register() const { return depthwise_acc_register_; } + uint32_t* dw_acc_vec(int i) { return &depthwise_acc_register_[i]; } + DwAccArray& dw_acc_register() { return depthwise_acc_register_; } + const DwAccArray& dw_acc_register() const { return depthwise_acc_register_; } void SetLogArgs(std::any data) { log_args_.emplace_back(std::move(data)); } - std::string *clog_string() { return &clog_string_; } + std::string* clog_string() { return &clog_string_; } void PrintLog(absl::string_view format_string); // Extra Kelvin terminating state. - void MPause(const Instruction *inst); + void MPause(const Instruction* inst); // Add terminating state handler. - void AddMpauseHandler(absl::AnyInvocable<bool(const Instruction *)> handler) { + void AddMpauseHandler(absl::AnyInvocable<bool(const Instruction*)> handler) { on_mpause_.emplace_back(std::move(handler)); } @@ -103,7 +103,7 @@ std::vector<std::any> log_args_; std::string clog_string_; // Extra state handlers - std::vector<absl::AnyInvocable<bool(const Instruction *)>> on_mpause_; + std::vector<absl::AnyInvocable<bool(const Instruction*)>> on_mpause_; // Convolution accumulation register, set to be uint32[VLENW][VLENW]. AccArrayTemplate<AccArrayType> acc_register_; @@ -115,8 +115,8 @@ mpact::sim::riscv::RiscV32SimpleCsr kisa_; // minstret CSR. - mpact::sim::riscv::RiscVCsrInterface *minstret_; - mpact::sim::riscv::RiscVCsrInterface *minstreth_; + mpact::sim::riscv::RiscVCsrInterface* minstret_; + mpact::sim::riscv::RiscVCsrInterface* minstreth_; }; } // namespace kelvin::sim
diff --git a/sim/kelvin_top.cc b/sim/kelvin_top.cc index 6cf7eba..fa313ea 100644 --- a/sim/kelvin_top.cc +++ b/sim/kelvin_top.cc
@@ -78,13 +78,13 @@ constexpr char kKelvinName[] = "Kelvin"; // Local helper function used to execute instructions. -static inline bool ExecuteInstruction(mpact::sim::util::Instruction *inst) { - for (auto *resource : inst->ResourceHold()) { +static inline bool ExecuteInstruction(mpact::sim::util::Instruction* inst) { + for (auto* resource : inst->ResourceHold()) { if (!resource->IsFree()) { return false; } } - for (auto *resource : inst->ResourceAcquire()) { + for (auto* resource : inst->ResourceAcquire()) { resource->Acquire(); } inst->Execute(nullptr); @@ -102,7 +102,7 @@ KelvinTop::KelvinTop(std::string name, uint64_t memory_block_size_bytes, uint64_t memory_size_bytes, - uint8_t **memory_block_ptr_list) + uint8_t** memory_block_ptr_list) : Component(std::move(name)), counter_num_instructions_{"num_instructions", 0}, counter_num_cycles_{"num_cycles", 0} { @@ -176,7 +176,7 @@ mpact::sim::riscv::RiscVArmSemihost::BitWidth::kWord32, memory_, memory_); // Set the software breakpoint callback. state_->AddEbreakHandler( - [this](const mpact::sim::generic::Instruction *inst) -> bool { + [this](const mpact::sim::generic::Instruction* inst) -> bool { if (inst != nullptr) { if (absl::GetFlag(FLAGS_use_semihost) && semihost_->IsSemihostingCall(inst)) { @@ -195,7 +195,7 @@ }); state_->AddMpauseHandler( - [this](const mpact::sim::generic::Instruction *inst) -> bool { + [this](const mpact::sim::generic::Instruction* inst) -> bool { if (inst != nullptr) { std::cout << "Program exits properly" << '\n'; RequestHalt(HaltReason::kUserRequest, inst); @@ -207,7 +207,7 @@ // Set trap callbacks. state_->set_on_trap([this](bool is_interrupt, uint64_t trap_value, uint64_t exception_code, uint64_t epc, - const Instruction *inst) -> bool { + const Instruction* inst) -> bool { auto code = static_cast<mpact::sim::riscv::ExceptionCode>(exception_code); bool result = false; switch (code) { @@ -237,24 +237,24 @@ // Connect counters to instret(h) and mcycle(h) CSRs. auto csr_res = state_->csr_set()->GetCsr("minstret"); // Minstret/minstreth. - auto *minstret = reinterpret_cast<RiscVCounterCsr<uint32_t, KelvinState> *>( + auto* minstret = reinterpret_cast<RiscVCounterCsr<uint32_t, KelvinState>*>( csr_res.value()); minstret->set_counter(&counter_num_instructions_); csr_res = state_->csr_set()->GetCsr("minstreth"); CHECK_OK(csr_res.status()) << "Failed to get minstret CSR"; - auto *minstreth = - reinterpret_cast<RiscVCounterCsrHigh<KelvinState> *>(csr_res.value()); + auto* minstreth = + reinterpret_cast<RiscVCounterCsrHigh<KelvinState>*>(csr_res.value()); minstreth->set_counter(&counter_num_instructions_); // Mcycle/mcycleh. csr_res = state_->csr_set()->GetCsr("mcycle"); CHECK_OK(csr_res.status()) << "Failed to get mcycle CSR"; - auto *mcycle = reinterpret_cast<RiscVCounterCsr<uint32_t, KelvinState> *>( + auto* mcycle = reinterpret_cast<RiscVCounterCsr<uint32_t, KelvinState>*>( csr_res.value()); mcycle->set_counter(&counter_num_cycles_); csr_res = state_->csr_set()->GetCsr("mcycleh"); CHECK_OK(csr_res.status()) << "Failed to get mcycleh CSR"; - auto *mcycleh = - reinterpret_cast<RiscVCounterCsrHigh<KelvinState> *>(csr_res.value()); + auto* mcycleh = + reinterpret_cast<RiscVCounterCsrHigh<KelvinState>*>(csr_res.value()); mcycleh->set_counter(&counter_num_cycles_); semihost_->set_exit_callback( @@ -344,7 +344,7 @@ uint64_t next_seq_pc; while (!halted_ && (count < num)) { pc = next_pc; - auto *inst = decode_cache_->GetDecodedInstruction(pc); + auto* inst = decode_cache_->GetDecodedInstruction(pc); next_seq_pc = pc + inst->size(); // Set the PC destination operand to next_seq_pc. Any branch that is // executed will overwrite this. @@ -424,7 +424,7 @@ std::fstream trace_file; proto::TraceData trace_data; - auto *inst_db = db_factory_.Allocate<uint32_t>(1); + auto* inst_db = db_factory_.Allocate<uint32_t>(1); if (absl::GetFlag(FLAGS_trace)) { std::string trace_path = absl::GetFlag(FLAGS_trace_path); std::string trace_dir = @@ -442,7 +442,7 @@ while (!halted_) { pc = next_pc; - auto *inst = decode_cache_->GetDecodedInstruction(pc); + auto* inst = decode_cache_->GetDecodedInstruction(pc); next_seq_pc = pc + inst->size(); // Set the PC destination operand to next_seq_pc. Any branch that is // executed will overwrite this. @@ -454,7 +454,7 @@ // Set trace entry {address, instruction} memory_->Load(pc, inst_db, nullptr, nullptr); auto inst_word = inst_db->Get<uint32_t>(0); - proto::TraceEntry *trace_entry = trace_data.add_entry(); + proto::TraceEntry* trace_entry = trace_data.add_entry(); trace_entry->set_address(pc); trace_entry->set_opcode(inst_word); if (absl::GetFlag(FLAGS_trace_disasm)) { @@ -528,7 +528,7 @@ return halt_reason_; } -absl::StatusOr<uint64_t> KelvinTop::ReadRegister(const std::string &name) { +absl::StatusOr<uint64_t> KelvinTop::ReadRegister(const std::string& name) { // The registers aren't protected by a mutex, so let's not read them while // the simulator is running. if (run_status_ != RunStatus::kHalted) { @@ -543,11 +543,11 @@ return absl::NotFoundError( absl::StrCat("Register '", name, "' not found")); } - auto *csr = *result; + auto* csr = *result; return csr->GetUint32(); } - auto *db = (iter->second)->data_buffer(); + auto* db = (iter->second)->data_buffer(); uint64_t value; switch (db->size<uint8_t>()) { case 1: @@ -568,7 +568,7 @@ return value; } -absl::Status KelvinTop::WriteRegister(const std::string &name, uint64_t value) { +absl::Status KelvinTop::WriteRegister(const std::string& name, uint64_t value) { // The registers aren't protected by a mutex, so let's not write them while // the simulator is running. if (run_status_ != RunStatus::kHalted) { @@ -582,7 +582,7 @@ return absl::NotFoundError( absl::StrCat("Register '", name, "' not found")); } - auto *csr = *result; + auto* csr = *result; csr->Set(static_cast<uint32_t>(value)); return absl::OkStatus(); } @@ -593,7 +593,7 @@ halt_reason_ = *HaltReason::kNone; } - auto *db = (iter->second)->data_buffer(); + auto* db = (iter->second)->data_buffer(); switch (db->size<uint8_t>()) { case 1: db->Set<uint8_t>(0, static_cast<uint8_t>(value)); @@ -613,8 +613,8 @@ return absl::OkStatus(); } -absl::StatusOr<DataBuffer *> KelvinTop::GetRegisterDataBuffer( - const std::string &name) { +absl::StatusOr<DataBuffer*> KelvinTop::GetRegisterDataBuffer( + const std::string& name) { // The registers aren't protected by a mutex, so let's not access them while // the simulator is running. if (run_status_ != RunStatus::kHalted) { @@ -628,7 +628,7 @@ return iter->second->data_buffer(); } -absl::StatusOr<size_t> KelvinTop::ReadMemory(uint64_t address, void *buffer, +absl::StatusOr<size_t> KelvinTop::ReadMemory(uint64_t address, void* buffer, size_t length) { if (run_status_ != RunStatus::kHalted) { return absl::FailedPreconditionError("ReadMemory: Core must be halted"); @@ -638,7 +638,7 @@ } length = std::min<size_t>(length, state_->max_physical_address() - address + 1); - auto *db = db_factory_.Allocate(length); + auto* db = db_factory_.Allocate(length); // Load bypassing any watch points/semihosting. state_->memory()->Load(address, db, nullptr, nullptr); std::memcpy(buffer, db->raw_ptr(), length); @@ -647,7 +647,7 @@ } absl::StatusOr<size_t> KelvinTop::WriteMemory(uint64_t address, - const void *buffer, + const void* buffer, size_t length) { if (run_status_ != RunStatus::kHalted) { return absl::FailedPreconditionError("WriteMemory: Core must be halted"); @@ -657,7 +657,7 @@ } length = std::min<size_t>(length, state_->max_physical_address() - address + 1); - auto *db = db_factory_.Allocate(length); + auto* db = db_factory_.Allocate(length); std::memcpy(db->raw_ptr(), buffer, length); // Store bypassing any watch points/semihosting. state_->memory()->Store(address, db); @@ -708,7 +708,7 @@ return absl::OkStatus(); } -absl::StatusOr<mpact::sim::generic::Instruction *> KelvinTop::GetInstruction( +absl::StatusOr<mpact::sim::generic::Instruction*> KelvinTop::GetInstruction( uint64_t address) { auto inst = decode_cache_->GetDecodedInstruction(address); return inst; @@ -720,7 +720,7 @@ return absl::FailedPreconditionError("GetDissasembly: Core must be halted"); } - mpact::sim::generic::Instruction *inst = nullptr; + mpact::sim::generic::Instruction* inst = nullptr; // If requesting the disassembly for an instruction at a breakpoint, return // that of the original instruction instead. // If requesting the disassembly for an instruction at an action point, return @@ -743,7 +743,7 @@ return disasm; } -absl::Status KelvinTop::LoadImage(const std::string &image_path, +absl::Status KelvinTop::LoadImage(const std::string& image_path, uint64_t start_address) { std::ifstream image_file; constexpr size_t kBufferSize = 4096; @@ -776,7 +776,7 @@ } void KelvinTop::RequestHalt(HaltReasonValueType halt_reason, - const mpact::sim::generic::Instruction *inst) { + const mpact::sim::generic::Instruction* inst) { // First set the halt_reason_, then the halt flag. halt_reason_ = halt_reason; halted_ = true; @@ -789,7 +789,7 @@ } void KelvinTop::RequestHalt(HaltReason halt_reason, - const mpact::sim::generic::Instruction *inst) { + const mpact::sim::generic::Instruction* inst) { RequestHalt(*halt_reason, inst); }
diff --git a/sim/kelvin_top.h b/sim/kelvin_top.h index 8721e08..015be6c 100644 --- a/sim/kelvin_top.h +++ b/sim/kelvin_top.h
@@ -70,7 +70,7 @@ explicit KelvinTop(std::string name); KelvinTop(std::string name, uint64_t memory_block_size_bytes, - uint64_t memory_size_bytes, uint8_t **memory_block_ptr_list); + uint64_t memory_size_bytes, uint8_t** memory_block_ptr_list); ~KelvinTop() override; @@ -86,15 +86,15 @@ absl::StatusOr<HaltReasonValueType> GetLastHaltReason() override; // Register access by register name. - absl::StatusOr<uint64_t> ReadRegister(const std::string &name) override; - absl::Status WriteRegister(const std::string &name, uint64_t value) override; - absl::StatusOr<DataBuffer *> GetRegisterDataBuffer( - const std::string &name) override; + absl::StatusOr<uint64_t> ReadRegister(const std::string& name) override; + absl::Status WriteRegister(const std::string& name, uint64_t value) override; + absl::StatusOr<DataBuffer*> GetRegisterDataBuffer( + const std::string& name) override; // Read and Write memory methods bypass any semihosting. - absl::StatusOr<size_t> ReadMemory(uint64_t address, void *buf, + absl::StatusOr<size_t> ReadMemory(uint64_t address, void* buf, size_t length) override; - absl::StatusOr<size_t> WriteMemory(uint64_t address, const void *buf, + absl::StatusOr<size_t> WriteMemory(uint64_t address, const void* buf, size_t length) override; bool HasBreakpoint(uint64_t address) override; @@ -103,22 +103,22 @@ absl::Status ClearAllSwBreakpoints() override; // Return the instruction object for the instruction at the given address. - absl::StatusOr<mpact::sim::generic::Instruction *> GetInstruction( + absl::StatusOr<mpact::sim::generic::Instruction*> GetInstruction( uint64_t address) override; // Return the string representation for the instruction at the given address. absl::StatusOr<std::string> GetDisassembly(uint64_t address) override; // Called when a halt is requested. void RequestHalt(HaltReasonValueType halt_reason, - const mpact::sim::generic::Instruction *inst); + const mpact::sim::generic::Instruction* inst); void RequestHalt(HaltReason halt_reason, - const mpact::sim::generic::Instruction *inst); + const mpact::sim::generic::Instruction* inst); // Load a binary image of the SW program. - absl::Status LoadImage(const std::string &image_path, uint64_t start_address); + absl::Status LoadImage(const std::string& image_path, uint64_t start_address); // Accessors. - sim::KelvinState *state() const { return state_; } - mpact::sim::util::MemoryInterface *memory() const { return memory_; } + sim::KelvinState* state() const { return state_; } + mpact::sim::util::MemoryInterface* memory() const { return memory_; } // Cycle helper function uint64_t GetCycleCount() const { return counter_num_cycles_.GetValue(); } @@ -142,27 +142,27 @@ static_cast<HaltReasonValueType>(HaltReason::kNone); // Halting flag. This is set to true when execution must halt. bool halted_ = false; - absl::Notification *run_halted_; + absl::Notification* run_halted_; // The local Kelvin state. - sim::KelvinState *state_; - mpact::sim::riscv::RiscVFPState *fp_state_; + sim::KelvinState* state_; + mpact::sim::riscv::RiscVFPState* fp_state_; // Memory interface used by action point manager. - KelvinActionPointMemoryInterface *kelvin_ap_memory_interface_ = nullptr; + KelvinActionPointMemoryInterface* kelvin_ap_memory_interface_ = nullptr; // Action point manager. - ActionPointManagerBase *ap_manager_ = nullptr; + ActionPointManagerBase* ap_manager_ = nullptr; // Breakpoint manager. - BreakpointManager *bp_manager_ = nullptr; + BreakpointManager* bp_manager_ = nullptr; // Flat to indicate that the current instruction is a break/action point that // needs to be stepped over. bool need_to_step_over_ = false; // The pc register instance. - mpact::sim::generic::RegisterBase *pc_; + mpact::sim::generic::RegisterBase* pc_; // Kelvin decoder decoder instance. - mpact::sim::generic::DecoderInterface *kelvin_decoder_ = nullptr; + mpact::sim::generic::DecoderInterface* kelvin_decoder_ = nullptr; // Decode cache, memory and memory watcher. - mpact::sim::generic::DecodeCache *decode_cache_ = nullptr; - mpact::sim::util::MemoryInterface *memory_ = nullptr; - mpact::sim::util::MemoryWatcher *watcher_ = nullptr; + mpact::sim::generic::DecodeCache* decode_cache_ = nullptr; + mpact::sim::util::MemoryInterface* memory_ = nullptr; + mpact::sim::util::MemoryWatcher* watcher_ = nullptr; // Counter for the number of instructions simulated. mpact::sim::generic::SimpleCounter<uint64_t> counter_opcode_[static_cast<int>(sim::isa32::OpcodeEnum::kPastMaxValue)]; @@ -170,7 +170,7 @@ mpact::sim::generic::SimpleCounter<uint64_t> counter_num_cycles_; absl::flat_hash_map<uint32_t, std::string> register_id_map_; // Setup arm semihosting. - mpact::sim::riscv::RiscVArmSemihost *semihost_ = nullptr; + mpact::sim::riscv::RiscVArmSemihost* semihost_ = nullptr; }; } // namespace kelvin::sim
diff --git a/sim/kelvin_vector_convolution_instructions.cc b/sim/kelvin_vector_convolution_instructions.cc index 46c1621..6a3c443 100644 --- a/sim/kelvin_vector_convolution_instructions.cc +++ b/sim/kelvin_vector_convolution_instructions.cc
@@ -44,8 +44,8 @@ // vs3 (wide) is the starting register of group of up-to 8 vector // registers. xs2 stores the convolution command. // `vd` is not used in the op. -void KelvinVConv(Instruction *inst) { - auto state = static_cast<KelvinState *>(inst->state()); +void KelvinVConv(Instruction* inst) { + auto state = static_cast<KelvinState*>(inst->state()); vconv_cmd_t conv_cmd; auto reg_data = GetInstructionSource<uint32_t>(inst, 1, 0); @@ -72,8 +72,8 @@ } // Read the narrow source. - auto vs1 = static_cast<RV32VectorSourceOperand *>(inst->Source(0)); - auto vs3 = static_cast<RV32VectorSourceOperand *>(inst->Source(2)); + auto vs1 = static_cast<RV32VectorSourceOperand*>(inst->Source(0)); + auto vs3 = static_cast<RV32VectorSourceOperand*>(inst->Source(2)); AccArrayTemplate<std::array<uint8_t, kVectorLenInByte>> vec_narrow; for (int vec_idx = 0; vec_idx < vec_narrow.size(); ++vec_idx) { auto source_span = vs1->GetRegister(vec_idx)->data_buffer()->Get<uint8_t>(); @@ -135,8 +135,8 @@ // vs3 (wide) is the starting register of group of 3 vector registers. // xs2 stores the convolution command. // `vd` is used if |write_acc| is set to true. -void KelvinVDwconv(bool write_acc, Instruction *inst) { - KelvinState *state = static_cast<KelvinState *>(inst->state()); +void KelvinVDwconv(bool write_acc, Instruction* inst) { + KelvinState* state = static_cast<KelvinState*>(inst->state()); uint32_t reg_data = GetInstructionSource<uint32_t>(inst, 1, 0); vdwconv_u8_t dwconv_cmd; memcpy(&dwconv_cmd, ®_data, sizeof(dwconv_cmd)); @@ -177,7 +177,7 @@ break; } - auto vs1 = static_cast<RV32VectorSourceOperand *>(inst->Source(0)); + auto vs1 = static_cast<RV32VectorSourceOperand*>(inst->Source(0)); absl::Span<uint32_t> vs10_span = vs1->GetRegister(vs1_idx[0])->data_buffer()->Get<uint32_t>(); absl::Span<uint32_t> vs11_span = @@ -213,12 +213,12 @@ /*epc=*/inst->address(), inst); } - auto vs3 = static_cast<RV32VectorSourceOperand *>(inst->Source(2)); - int32_t *acc = reinterpret_cast<int32_t *>(state->dw_acc_vec(0)); + auto vs3 = static_cast<RV32VectorSourceOperand*>(inst->Source(2)); + int32_t* acc = reinterpret_cast<int32_t*>(state->dw_acc_vec(0)); for (int r = 0; r < kDwRegisterProducts; r++) { absl::Span<uint8_t> a_span = absl::Span<uint8_t>( - reinterpret_cast<uint8_t *>(a_data + (r * kVectorLenInWord)), + reinterpret_cast<uint8_t*>(a_data + (r * kVectorLenInWord)), kVectorLenInByte); absl::Span<uint8_t> b_span = vs3->GetRegister(r)->data_buffer()->Get<uint8_t>(); @@ -242,9 +242,9 @@ return; } - auto vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); + auto vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); for (int i = 0; i < 4; i++) { - DataBuffer *dest_db = vd->AllocateDataBuffer(i); + DataBuffer* dest_db = vd->AllocateDataBuffer(i); absl::Span<uint32_t> dest_span = dest_db->Get<uint32_t>(); for (int j = 0; j < kVectorLenInWord; j++) { dest_span[j] = acc[i * kVectorLenInWord + j];
diff --git a/sim/kelvin_vector_convolution_instructions.h b/sim/kelvin_vector_convolution_instructions.h index b2d6861..6a0c7d5 100644 --- a/sim/kelvin_vector_convolution_instructions.h +++ b/sim/kelvin_vector_convolution_instructions.h
@@ -48,9 +48,9 @@ uint32_t sdata2 : 1; // 31 } vdwconv_u8_t; -void KelvinVConv(Instruction *inst); +void KelvinVConv(Instruction* inst); -void KelvinVDwconv(bool write_acc, Instruction *inst); +void KelvinVDwconv(bool write_acc, Instruction* inst); } // namespace kelvin::sim
diff --git a/sim/kelvin_vector_instructions.cc b/sim/kelvin_vector_instructions.cc index 41f9fd9..5f0d6bb 100644 --- a/sim/kelvin_vector_instructions.cc +++ b/sim/kelvin_vector_instructions.cc
@@ -47,10 +47,10 @@ } template <typename Vd, typename Vs1, typename Vs2> -Vs1 CommonBinaryOpGetArg1(const Instruction *inst, bool scalar, int num_ops, +Vs1 CommonBinaryOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(Vs1); auto src_element_index = op_index * elts_per_register + @@ -66,10 +66,10 @@ } template <typename Vd, typename Vs1, typename Vs2> -Vs2 CommonBinaryOpGetArg2(const Instruction *inst, bool scalar, int num_ops, +Vs2 CommonBinaryOpGetArg2(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(Vs2); auto src_element_index = op_index * elts_per_register + @@ -80,18 +80,18 @@ template <typename T, typename Vd, typename Vs1, typename Vs2> using SourceArgGetter = - std::function<T(const Instruction *inst, bool scalar, int num_ops, + std::function<T(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index)>; template <bool halftype = false, bool widen_dst = false, typename Vd, typename Vs1, typename Vs2, typename... VDArgs> -void KelvinBinaryVectorOp(const Instruction *inst, bool scalar, bool strip_mine, +void KelvinBinaryVectorOp(const Instruction* inst, bool scalar, bool strip_mine, std::function<Vd(VDArgs..., Vs1, Vs2)> op, SourceArgGetter<Vs1, Vd, Vs1, Vs2> arg1_getter = CommonBinaryOpGetArg1<Vd, Vs1, Vs2>, SourceArgGetter<Vs2, Vd, Vs1, Vs2> arg2_getter = CommonBinaryOpGetArg2<Vd, Vs1, Vs2>) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_dest_register = vector_size_in_bytes / sizeof(Vd); @@ -103,10 +103,10 @@ constexpr size_t dest_regs_per_op = is_widen_op ? 2 : 1; // Special case for VADD3 op which is adding dest value to vs1 + vs2. constexpr bool is_reading_dest = sizeof...(VDArgs) == 1; - auto vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); + auto vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); for (int op_index = 0; op_index < num_ops; ++op_index) { - DataBuffer *dest_db[dest_regs_per_op]; + DataBuffer* dest_db[dest_regs_per_op]; absl::Span<Vd> dest_span[dest_regs_per_op]; for (int i = 0; i < dest_regs_per_op; ++i) { @@ -136,20 +136,20 @@ } template <typename Vd, typename Vs> -void KelvinUnaryVectorOp(const Instruction *inst, bool strip_mine, +void KelvinUnaryVectorOp(const Instruction* inst, bool strip_mine, std::function<Vd(Vs)> op, SourceArgGetter<Vs, Vd, Vs, Vs> arg_getter = CommonBinaryOpGetArg1<Vd, Vs, Vs>) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_dest_register = vector_size_in_bytes / sizeof(Vd); // For kelvin, stripmining issues 4 contiguous vector ops. auto num_ops = strip_mine ? 4 : 1; - auto vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); + auto vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); for (int op_index = 0; op_index < num_ops; ++op_index) { - DataBuffer *dest_db = vd->AllocateDataBuffer(op_index); + DataBuffer* dest_db = vd->AllocateDataBuffer(op_index); absl::Span<Vd> dest_span = dest_db->template Get<Vd>(); for (int dst_element_index = 0; dst_element_index < elts_per_dest_register; @@ -164,7 +164,7 @@ } template <typename T> -void KelvinVAdd(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAdd(bool scalar, bool strip_mine, Instruction* inst) { // Return vs1 + vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { @@ -176,12 +176,12 @@ return static_cast<T>(uvs1 + uvs2); })); } -template void KelvinVAdd<int8_t>(bool, bool, Instruction *); -template void KelvinVAdd<int16_t>(bool, bool, Instruction *); -template void KelvinVAdd<int32_t>(bool, bool, Instruction *); +template void KelvinVAdd<int8_t>(bool, bool, Instruction*); +template void KelvinVAdd<int16_t>(bool, bool, Instruction*); +template void KelvinVAdd<int32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVSub(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSub(bool scalar, bool strip_mine, Instruction* inst) { // Return vs1 - vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { @@ -193,12 +193,12 @@ return static_cast<T>(uvs1 - uvs2); })); } -template void KelvinVSub<int8_t>(bool, bool, Instruction *); -template void KelvinVSub<int16_t>(bool, bool, Instruction *); -template void KelvinVSub<int32_t>(bool, bool, Instruction *); +template void KelvinVSub<int8_t>(bool, bool, Instruction*); +template void KelvinVSub<int16_t>(bool, bool, Instruction*); +template void KelvinVSub<int32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVRSub(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVRSub(bool scalar, bool strip_mine, Instruction* inst) { // Return vs2 - vs1. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { @@ -210,90 +210,90 @@ return static_cast<T>(uvs2 - uvs1); })); } -template void KelvinVRSub<int8_t>(bool, bool, Instruction *); -template void KelvinVRSub<int16_t>(bool, bool, Instruction *); -template void KelvinVRSub<int32_t>(bool, bool, Instruction *); +template void KelvinVRSub<int8_t>(bool, bool, Instruction*); +template void KelvinVRSub<int16_t>(bool, bool, Instruction*); +template void KelvinVRSub<int32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVEq(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVEq(bool scalar, bool strip_mine, Instruction* inst) { // Return 1 if vs1 and vs2 are equal, else returns 0. KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 == vs2; })); } -template void KelvinVEq<int8_t>(bool, bool, Instruction *); -template void KelvinVEq<int16_t>(bool, bool, Instruction *); -template void KelvinVEq<int32_t>(bool, bool, Instruction *); +template void KelvinVEq<int8_t>(bool, bool, Instruction*); +template void KelvinVEq<int16_t>(bool, bool, Instruction*); +template void KelvinVEq<int32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVNe(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVNe(bool scalar, bool strip_mine, Instruction* inst) { // Return 1 if vs1 and vs2 are not equal, else return 0. KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 != vs2; })); } -template void KelvinVNe<int8_t>(bool, bool, Instruction *); -template void KelvinVNe<int16_t>(bool, bool, Instruction *); -template void KelvinVNe<int32_t>(bool, bool, Instruction *); +template void KelvinVNe<int8_t>(bool, bool, Instruction*); +template void KelvinVNe<int16_t>(bool, bool, Instruction*); +template void KelvinVNe<int32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVLt(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVLt(bool scalar, bool strip_mine, Instruction* inst) { // Returns 1 if vs1 < vs2, else return 0. KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 < vs2; })); } -template void KelvinVLt<int8_t>(bool, bool, Instruction *); -template void KelvinVLt<int16_t>(bool, bool, Instruction *); -template void KelvinVLt<int32_t>(bool, bool, Instruction *); -template void KelvinVLt<uint8_t>(bool, bool, Instruction *); -template void KelvinVLt<uint16_t>(bool, bool, Instruction *); -template void KelvinVLt<uint32_t>(bool, bool, Instruction *); +template void KelvinVLt<int8_t>(bool, bool, Instruction*); +template void KelvinVLt<int16_t>(bool, bool, Instruction*); +template void KelvinVLt<int32_t>(bool, bool, Instruction*); +template void KelvinVLt<uint8_t>(bool, bool, Instruction*); +template void KelvinVLt<uint16_t>(bool, bool, Instruction*); +template void KelvinVLt<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVLe(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVLe(bool scalar, bool strip_mine, Instruction* inst) { // Returns 1 if vs1 <= vs2, else return 0. KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 <= vs2; })); } -template void KelvinVLe<int8_t>(bool, bool, Instruction *); -template void KelvinVLe<int16_t>(bool, bool, Instruction *); -template void KelvinVLe<int32_t>(bool, bool, Instruction *); -template void KelvinVLe<uint8_t>(bool, bool, Instruction *); -template void KelvinVLe<uint16_t>(bool, bool, Instruction *); -template void KelvinVLe<uint32_t>(bool, bool, Instruction *); +template void KelvinVLe<int8_t>(bool, bool, Instruction*); +template void KelvinVLe<int16_t>(bool, bool, Instruction*); +template void KelvinVLe<int32_t>(bool, bool, Instruction*); +template void KelvinVLe<uint8_t>(bool, bool, Instruction*); +template void KelvinVLe<uint16_t>(bool, bool, Instruction*); +template void KelvinVLe<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVGt(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVGt(bool scalar, bool strip_mine, Instruction* inst) { // Returns 1 if vs1 > vs2, else return 0. KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 > vs2; })); } -template void KelvinVGt<int8_t>(bool, bool, Instruction *); -template void KelvinVGt<int16_t>(bool, bool, Instruction *); -template void KelvinVGt<int32_t>(bool, bool, Instruction *); -template void KelvinVGt<uint8_t>(bool, bool, Instruction *); -template void KelvinVGt<uint16_t>(bool, bool, Instruction *); -template void KelvinVGt<uint32_t>(bool, bool, Instruction *); +template void KelvinVGt<int8_t>(bool, bool, Instruction*); +template void KelvinVGt<int16_t>(bool, bool, Instruction*); +template void KelvinVGt<int32_t>(bool, bool, Instruction*); +template void KelvinVGt<uint8_t>(bool, bool, Instruction*); +template void KelvinVGt<uint16_t>(bool, bool, Instruction*); +template void KelvinVGt<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVGe(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVGe(bool scalar, bool strip_mine, Instruction* inst) { // Returns 1 if vs1 >= vs2, else return 0. KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 >= vs2; })); } -template void KelvinVGe<int8_t>(bool, bool, Instruction *); -template void KelvinVGe<int16_t>(bool, bool, Instruction *); -template void KelvinVGe<int32_t>(bool, bool, Instruction *); -template void KelvinVGe<uint8_t>(bool, bool, Instruction *); -template void KelvinVGe<uint16_t>(bool, bool, Instruction *); -template void KelvinVGe<uint32_t>(bool, bool, Instruction *); +template void KelvinVGe<int8_t>(bool, bool, Instruction*); +template void KelvinVGe<int16_t>(bool, bool, Instruction*); +template void KelvinVGe<int32_t>(bool, bool, Instruction*); +template void KelvinVGe<uint8_t>(bool, bool, Instruction*); +template void KelvinVGe<uint16_t>(bool, bool, Instruction*); +template void KelvinVGe<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVAbsd(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAbsd(bool scalar, bool strip_mine, Instruction* inst) { // Returns the absolute difference between vs1 and vs2. // Note: for signed(INTx_MAX - INTx_MIN) the result will be UINTx_MAX. KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, @@ -309,45 +309,45 @@ return vs1 > vs2 ? uvs1 - uvs2 : uvs2 - uvs1; })); } -template void KelvinVAbsd<int8_t>(bool, bool, Instruction *); -template void KelvinVAbsd<int16_t>(bool, bool, Instruction *); -template void KelvinVAbsd<int32_t>(bool, bool, Instruction *); -template void KelvinVAbsd<uint8_t>(bool, bool, Instruction *); -template void KelvinVAbsd<uint16_t>(bool, bool, Instruction *); -template void KelvinVAbsd<uint32_t>(bool, bool, Instruction *); +template void KelvinVAbsd<int8_t>(bool, bool, Instruction*); +template void KelvinVAbsd<int16_t>(bool, bool, Instruction*); +template void KelvinVAbsd<int32_t>(bool, bool, Instruction*); +template void KelvinVAbsd<uint8_t>(bool, bool, Instruction*); +template void KelvinVAbsd<uint16_t>(bool, bool, Instruction*); +template void KelvinVAbsd<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVMax(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMax(bool scalar, bool strip_mine, Instruction* inst) { // Return the max of vs1 and vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return std::max(vs1, vs2); })); } -template void KelvinVMax<int8_t>(bool, bool, Instruction *); -template void KelvinVMax<int16_t>(bool, bool, Instruction *); -template void KelvinVMax<int32_t>(bool, bool, Instruction *); -template void KelvinVMax<uint8_t>(bool, bool, Instruction *); -template void KelvinVMax<uint16_t>(bool, bool, Instruction *); -template void KelvinVMax<uint32_t>(bool, bool, Instruction *); +template void KelvinVMax<int8_t>(bool, bool, Instruction*); +template void KelvinVMax<int16_t>(bool, bool, Instruction*); +template void KelvinVMax<int32_t>(bool, bool, Instruction*); +template void KelvinVMax<uint8_t>(bool, bool, Instruction*); +template void KelvinVMax<uint16_t>(bool, bool, Instruction*); +template void KelvinVMax<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVMin(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMin(bool scalar, bool strip_mine, Instruction* inst) { // Return the min of vs1 and vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return std::min(vs1, vs2); })); } -template void KelvinVMin<int8_t>(bool, bool, Instruction *); -template void KelvinVMin<int16_t>(bool, bool, Instruction *); -template void KelvinVMin<int32_t>(bool, bool, Instruction *); -template void KelvinVMin<uint8_t>(bool, bool, Instruction *); -template void KelvinVMin<uint16_t>(bool, bool, Instruction *); -template void KelvinVMin<uint32_t>(bool, bool, Instruction *); +template void KelvinVMin<int8_t>(bool, bool, Instruction*); +template void KelvinVMin<int16_t>(bool, bool, Instruction*); +template void KelvinVMin<int32_t>(bool, bool, Instruction*); +template void KelvinVMin<uint8_t>(bool, bool, Instruction*); +template void KelvinVMin<uint16_t>(bool, bool, Instruction*); +template void KelvinVMin<uint32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVAdd3(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAdd3(bool scalar, bool strip_mine, Instruction* inst) { // Return the summation of vd, vs1, and vs2. KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, T, T, T, T>( inst, scalar, strip_mine, @@ -359,9 +359,9 @@ return static_cast<T>(uvd + uvs1 + uvs2); })); } -template void KelvinVAdd3<int8_t>(bool, bool, Instruction *); -template void KelvinVAdd3<int16_t>(bool, bool, Instruction *); -template void KelvinVAdd3<int32_t>(bool, bool, Instruction *); +template void KelvinVAdd3<int8_t>(bool, bool, Instruction*); +template void KelvinVAdd3<int16_t>(bool, bool, Instruction*); +template void KelvinVAdd3<int32_t>(bool, bool, Instruction*); // Helper function for Vadds (saturated signed addition). // Uses unsigned arithmetic for the addition to avoid signed overflow, which, @@ -381,14 +381,14 @@ } template <typename T> -void KelvinVAdds(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAdds(bool scalar, bool strip_mine, Instruction* inst) { // Return saturated sum of vs1 and vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>(VAddsHelper<T>)); } -template void KelvinVAdds<int8_t>(bool, bool, Instruction *); -template void KelvinVAdds<int16_t>(bool, bool, Instruction *); -template void KelvinVAdds<int32_t>(bool, bool, Instruction *); +template void KelvinVAdds<int8_t>(bool, bool, Instruction*); +template void KelvinVAdds<int16_t>(bool, bool, Instruction*); +template void KelvinVAdds<int32_t>(bool, bool, Instruction*); // Helper function for Vaddsu (saturated unsigned addition). template <typename T> @@ -401,14 +401,14 @@ } template <typename T> -void KelvinVAddsu(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAddsu(bool scalar, bool strip_mine, Instruction* inst) { // Return saturated sum of unsigned vs1 and vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>(VAddsuHelper<T>)); } -template void KelvinVAddsu<uint8_t>(bool, bool, Instruction *); -template void KelvinVAddsu<uint16_t>(bool, bool, Instruction *); -template void KelvinVAddsu<uint32_t>(bool, bool, Instruction *); +template void KelvinVAddsu<uint8_t>(bool, bool, Instruction*); +template void KelvinVAddsu<uint16_t>(bool, bool, Instruction*); +template void KelvinVAddsu<uint32_t>(bool, bool, Instruction*); // Helper function for Vsubs (saturated signed subtraction). template <typename T> @@ -426,55 +426,55 @@ } template <typename T> -void KelvinVSubs(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSubs(bool scalar, bool strip_mine, Instruction* inst) { // Return saturated sub of vs1 and vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>(VSubsHelper<T>)); } -template void KelvinVSubs<int8_t>(bool, bool, Instruction *); -template void KelvinVSubs<int16_t>(bool, bool, Instruction *); -template void KelvinVSubs<int32_t>(bool, bool, Instruction *); +template void KelvinVSubs<int8_t>(bool, bool, Instruction*); +template void KelvinVSubs<int16_t>(bool, bool, Instruction*); +template void KelvinVSubs<int32_t>(bool, bool, Instruction*); template <typename T> -void KelvinVSubsu(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSubsu(bool scalar, bool strip_mine, Instruction* inst) { // Return saturated sub of unsigned vs1 and vs2. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 < vs2 ? 0 : vs1 - vs2; })); } -template void KelvinVSubsu<uint8_t>(bool, bool, Instruction *); -template void KelvinVSubsu<uint16_t>(bool, bool, Instruction *); -template void KelvinVSubsu<uint32_t>(bool, bool, Instruction *); +template void KelvinVSubsu<uint8_t>(bool, bool, Instruction*); +template void KelvinVSubsu<uint16_t>(bool, bool, Instruction*); +template void KelvinVSubsu<uint32_t>(bool, bool, Instruction*); template <typename Td, typename Ts> -void KelvinVAddw(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAddw(bool scalar, bool strip_mine, Instruction* inst) { // Adds operands with widening. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<Td(Ts, Ts)>([](Ts vs1, Ts vs2) -> Td { return static_cast<Td>(vs1) + static_cast<Td>(vs2); })); } -template void KelvinVAddw<int16_t, int8_t>(bool, bool, Instruction *); -template void KelvinVAddw<int32_t, int16_t>(bool, bool, Instruction *); -template void KelvinVAddw<uint16_t, uint8_t>(bool, bool, Instruction *); -template void KelvinVAddw<uint32_t, uint16_t>(bool, bool, Instruction *); +template void KelvinVAddw<int16_t, int8_t>(bool, bool, Instruction*); +template void KelvinVAddw<int32_t, int16_t>(bool, bool, Instruction*); +template void KelvinVAddw<uint16_t, uint8_t>(bool, bool, Instruction*); +template void KelvinVAddw<uint32_t, uint16_t>(bool, bool, Instruction*); template <typename Td, typename Ts> -void KelvinVSubw(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSubw(bool scalar, bool strip_mine, Instruction* inst) { // Subtracts operands with widening. KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<Td(Ts, Ts)>([](Ts vs1, Ts vs2) -> Td { return static_cast<Td>(vs1) - static_cast<Td>(vs2); })); } -template void KelvinVSubw<int16_t, int8_t>(bool, bool, Instruction *); -template void KelvinVSubw<int32_t, int16_t>(bool, bool, Instruction *); -template void KelvinVSubw<uint16_t, uint8_t>(bool, bool, Instruction *); -template void KelvinVSubw<uint32_t, uint16_t>(bool, bool, Instruction *); +template void KelvinVSubw<int16_t, int8_t>(bool, bool, Instruction*); +template void KelvinVSubw<int32_t, int16_t>(bool, bool, Instruction*); +template void KelvinVSubw<uint16_t, uint8_t>(bool, bool, Instruction*); +template void KelvinVSubw<uint32_t, uint16_t>(bool, bool, Instruction*); template <typename Td, typename Ts2> -void KelvinVAcc(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAcc(bool scalar, bool strip_mine, Instruction* inst) { // Accumulates operands with widening. KelvinBinaryVectorOp( inst, scalar, strip_mine, @@ -483,16 +483,16 @@ return static_cast<Td>(static_cast<UTd>(vs1) + static_cast<UTd>(vs2)); })); } -template void KelvinVAcc<int16_t, int8_t>(bool, bool, Instruction *); -template void KelvinVAcc<int32_t, int16_t>(bool, bool, Instruction *); -template void KelvinVAcc<uint16_t, uint8_t>(bool, bool, Instruction *); -template void KelvinVAcc<uint32_t, uint16_t>(bool, bool, Instruction *); +template void KelvinVAcc<int16_t, int8_t>(bool, bool, Instruction*); +template void KelvinVAcc<int32_t, int16_t>(bool, bool, Instruction*); +template void KelvinVAcc<uint16_t, uint8_t>(bool, bool, Instruction*); +template void KelvinVAcc<uint32_t, uint16_t>(bool, bool, Instruction*); template <typename Vd, typename Vs1, typename Vs2> -Vs1 PackedBinaryOpGetArg1(const Instruction *inst, bool scalar, int num_ops, +Vs1 PackedBinaryOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(Vs1); auto src_element_index = op_index * elts_per_register + @@ -501,10 +501,10 @@ } template <typename Vd, typename Vs1, typename Vs2> -Vs2 PackedBinaryOpGetArg2(const Instruction *inst, bool scalar, int num_ops, +Vs2 PackedBinaryOpGetArg2(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(Vs2); auto src_element_index = op_index * elts_per_register + @@ -513,7 +513,7 @@ } template <typename Td, typename Ts> -void KelvinVPadd(bool strip_mine, Instruction *inst) { +void KelvinVPadd(bool strip_mine, Instruction* inst) { // Adds lane pairs. KelvinBinaryVectorOp<true /* halftype */, false /* widen_dst */, Td, Ts, Ts>( inst, false /* scalar */, strip_mine, @@ -523,13 +523,13 @@ SourceArgGetter<Ts, Td, Ts, Ts>(PackedBinaryOpGetArg1<Td, Ts, Ts>), SourceArgGetter<Ts, Td, Ts, Ts>(PackedBinaryOpGetArg2<Td, Ts, Ts>)); } -template void KelvinVPadd<int16_t, int8_t>(bool, Instruction *); -template void KelvinVPadd<int32_t, int16_t>(bool, Instruction *); -template void KelvinVPadd<uint16_t, uint8_t>(bool, Instruction *); -template void KelvinVPadd<uint32_t, uint16_t>(bool, Instruction *); +template void KelvinVPadd<int16_t, int8_t>(bool, Instruction*); +template void KelvinVPadd<int32_t, int16_t>(bool, Instruction*); +template void KelvinVPadd<uint16_t, uint8_t>(bool, Instruction*); +template void KelvinVPadd<uint32_t, uint16_t>(bool, Instruction*); template <typename Td, typename Ts> -void KelvinVPsub(bool strip_mine, Instruction *inst) { +void KelvinVPsub(bool strip_mine, Instruction* inst) { // Subtracts lane pairs. KelvinBinaryVectorOp<true /* halftype */, false /* widen_dst */, Td, Ts, Ts>( inst, false /* scalar */, strip_mine, @@ -539,10 +539,10 @@ SourceArgGetter<Ts, Td, Ts, Ts>(PackedBinaryOpGetArg1<Td, Ts, Ts>), SourceArgGetter<Ts, Td, Ts, Ts>(PackedBinaryOpGetArg2<Td, Ts, Ts>)); } -template void KelvinVPsub<int16_t, int8_t>(bool, Instruction *); -template void KelvinVPsub<int32_t, int16_t>(bool, Instruction *); -template void KelvinVPsub<uint16_t, uint8_t>(bool, Instruction *); -template void KelvinVPsub<uint32_t, uint16_t>(bool, Instruction *); +template void KelvinVPsub<int16_t, int8_t>(bool, Instruction*); +template void KelvinVPsub<int32_t, int16_t>(bool, Instruction*); +template void KelvinVPsub<uint16_t, uint8_t>(bool, Instruction*); +template void KelvinVPsub<uint32_t, uint16_t>(bool, Instruction*); // Halving addition with optional rounding bit. template <typename T> @@ -553,17 +553,17 @@ } template <typename T> -void KelvinVHadd(bool scalar, bool strip_mine, bool round, Instruction *inst) { +void KelvinVHadd(bool scalar, bool strip_mine, bool round, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>(absl::bind_front(&KelvinVHaddHelper<T>, round))); } -template void KelvinVHadd<int8_t>(bool, bool, bool, Instruction *); -template void KelvinVHadd<int16_t>(bool, bool, bool, Instruction *); -template void KelvinVHadd<int32_t>(bool, bool, bool, Instruction *); -template void KelvinVHadd<uint8_t>(bool, bool, bool, Instruction *); -template void KelvinVHadd<uint16_t>(bool, bool, bool, Instruction *); -template void KelvinVHadd<uint32_t>(bool, bool, bool, Instruction *); +template void KelvinVHadd<int8_t>(bool, bool, bool, Instruction*); +template void KelvinVHadd<int16_t>(bool, bool, bool, Instruction*); +template void KelvinVHadd<int32_t>(bool, bool, bool, Instruction*); +template void KelvinVHadd<uint8_t>(bool, bool, bool, Instruction*); +template void KelvinVHadd<uint16_t>(bool, bool, bool, Instruction*); +template void KelvinVHadd<uint32_t>(bool, bool, bool, Instruction*); // Halving subtraction with optional rounding bit. template <typename T> @@ -574,54 +574,54 @@ } template <typename T> -void KelvinVHsub(bool scalar, bool strip_mine, bool round, Instruction *inst) { +void KelvinVHsub(bool scalar, bool strip_mine, bool round, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>(absl::bind_front(&KelvinVHsubHelper<T>, round))); } -template void KelvinVHsub<int8_t>(bool, bool, bool, Instruction *); -template void KelvinVHsub<int16_t>(bool, bool, bool, Instruction *); -template void KelvinVHsub<int32_t>(bool, bool, bool, Instruction *); -template void KelvinVHsub<uint8_t>(bool, bool, bool, Instruction *); -template void KelvinVHsub<uint16_t>(bool, bool, bool, Instruction *); -template void KelvinVHsub<uint32_t>(bool, bool, bool, Instruction *); +template void KelvinVHsub<int8_t>(bool, bool, bool, Instruction*); +template void KelvinVHsub<int16_t>(bool, bool, bool, Instruction*); +template void KelvinVHsub<int32_t>(bool, bool, bool, Instruction*); +template void KelvinVHsub<uint8_t>(bool, bool, bool, Instruction*); +template void KelvinVHsub<uint16_t>(bool, bool, bool, Instruction*); +template void KelvinVHsub<uint32_t>(bool, bool, bool, Instruction*); // Bitwise and. template <typename T> -void KelvinVAnd(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVAnd(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 & vs2; })); } -template void KelvinVAnd<uint8_t>(bool, bool, Instruction *); -template void KelvinVAnd<uint16_t>(bool, bool, Instruction *); -template void KelvinVAnd<uint32_t>(bool, bool, Instruction *); +template void KelvinVAnd<uint8_t>(bool, bool, Instruction*); +template void KelvinVAnd<uint16_t>(bool, bool, Instruction*); +template void KelvinVAnd<uint32_t>(bool, bool, Instruction*); // Bitwise or. template <typename T> -void KelvinVOr(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVOr(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 | vs2; })); } -template void KelvinVOr<uint8_t>(bool, bool, Instruction *); -template void KelvinVOr<uint16_t>(bool, bool, Instruction *); -template void KelvinVOr<uint32_t>(bool, bool, Instruction *); +template void KelvinVOr<uint8_t>(bool, bool, Instruction*); +template void KelvinVOr<uint16_t>(bool, bool, Instruction*); +template void KelvinVOr<uint32_t>(bool, bool, Instruction*); // Bitwise xor. template <typename T> -void KelvinVXor(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVXor(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1 ^ vs2; })); } -template void KelvinVXor<uint8_t>(bool, bool, Instruction *); -template void KelvinVXor<uint16_t>(bool, bool, Instruction *); -template void KelvinVXor<uint32_t>(bool, bool, Instruction *); +template void KelvinVXor<uint8_t>(bool, bool, Instruction*); +template void KelvinVXor<uint16_t>(bool, bool, Instruction*); +template void KelvinVXor<uint32_t>(bool, bool, Instruction*); // Generalized reverse using bit ladder. template <typename T> -void KelvinVRev(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVRev(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { T r = vs1; @@ -636,13 +636,13 @@ return r; })); } -template void KelvinVRev<uint8_t>(bool, bool, Instruction *); -template void KelvinVRev<uint16_t>(bool, bool, Instruction *); -template void KelvinVRev<uint32_t>(bool, bool, Instruction *); +template void KelvinVRev<uint8_t>(bool, bool, Instruction*); +template void KelvinVRev<uint16_t>(bool, bool, Instruction*); +template void KelvinVRev<uint32_t>(bool, bool, Instruction*); // Cyclic rotation right using a bit ladder. template <typename T> -void KelvinVRor(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVRor(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { T r = vs1; @@ -654,13 +654,13 @@ return r; })); } -template void KelvinVRor<uint8_t>(bool, bool, Instruction *); -template void KelvinVRor<uint16_t>(bool, bool, Instruction *); -template void KelvinVRor<uint32_t>(bool, bool, Instruction *); +template void KelvinVRor<uint8_t>(bool, bool, Instruction*); +template void KelvinVRor<uint16_t>(bool, bool, Instruction*); +template void KelvinVRor<uint32_t>(bool, bool, Instruction*); // Returns Arg1 as either vs1 or vs2 based on dst_reg_index. template <typename Vd, typename Vs1, typename Vs2> -Vs1 VMvpOpGetArg1(const Instruction *inst, bool scalar, int num_ops, +Vs1 VMvpOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { return dst_reg_index == 0 ? CommonBinaryOpGetArg1<Vd, Vs1, Vs2>( @@ -671,7 +671,7 @@ // Copies a pair of registers. template <typename T> -void KelvinVMvp(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMvp(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, true /* widen_dst */, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), @@ -680,48 +680,48 @@ // getter expects extra source registers for widening ops. SourceArgGetter<T, T, T, T>(VMvpOpGetArg1<T, T, T>)); } -template void KelvinVMvp<uint8_t>(bool, bool, Instruction *); -template void KelvinVMvp<uint16_t>(bool, bool, Instruction *); -template void KelvinVMvp<uint32_t>(bool, bool, Instruction *); +template void KelvinVMvp<uint8_t>(bool, bool, Instruction*); +template void KelvinVMvp<uint16_t>(bool, bool, Instruction*); +template void KelvinVMvp<uint32_t>(bool, bool, Instruction*); // Logical shift left. template <typename T> -void KelvinVSll(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSll(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { size_t shift = vs2 & (sizeof(T) * 8 - 1); return vs1 << shift; })); } -template void KelvinVSll<uint8_t>(bool, bool, Instruction *); -template void KelvinVSll<uint16_t>(bool, bool, Instruction *); -template void KelvinVSll<uint32_t>(bool, bool, Instruction *); +template void KelvinVSll<uint8_t>(bool, bool, Instruction*); +template void KelvinVSll<uint16_t>(bool, bool, Instruction*); +template void KelvinVSll<uint32_t>(bool, bool, Instruction*); // Arithmetic shift right. template <typename T> -void KelvinVSra(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSra(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { size_t shift = vs2 & (sizeof(T) * 8 - 1); return vs1 >> shift; })); } -template void KelvinVSra<int8_t>(bool, bool, Instruction *); -template void KelvinVSra<int16_t>(bool, bool, Instruction *); -template void KelvinVSra<int32_t>(bool, bool, Instruction *); +template void KelvinVSra<int8_t>(bool, bool, Instruction*); +template void KelvinVSra<int16_t>(bool, bool, Instruction*); +template void KelvinVSra<int32_t>(bool, bool, Instruction*); // Logical shift right. template <typename T> -void KelvinVSrl(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSrl(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { size_t shift = vs2 & (sizeof(T) * 8 - 1); return vs1 >> shift; })); } -template void KelvinVSrl<uint8_t>(bool, bool, Instruction *); -template void KelvinVSrl<uint16_t>(bool, bool, Instruction *); -template void KelvinVSrl<uint32_t>(bool, bool, Instruction *); +template void KelvinVSrl<uint8_t>(bool, bool, Instruction*); +template void KelvinVSrl<uint16_t>(bool, bool, Instruction*); +template void KelvinVSrl<uint32_t>(bool, bool, Instruction*); // Logical and arithmetic left/right shift with saturating shift amount and // result. @@ -785,75 +785,75 @@ } template <typename T> -void KelvinVShift(bool round, bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVShift(bool round, bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>(absl::bind_front(&KelvinVShiftHelper<T>, round))); } -template void KelvinVShift<int8_t>(bool, bool, bool, Instruction *); -template void KelvinVShift<int16_t>(bool, bool, bool, Instruction *); -template void KelvinVShift<int32_t>(bool, bool, bool, Instruction *); -template void KelvinVShift<uint8_t>(bool, bool, bool, Instruction *); -template void KelvinVShift<uint16_t>(bool, bool, bool, Instruction *); -template void KelvinVShift<uint32_t>(bool, bool, bool, Instruction *); +template void KelvinVShift<int8_t>(bool, bool, bool, Instruction*); +template void KelvinVShift<int16_t>(bool, bool, bool, Instruction*); +template void KelvinVShift<int32_t>(bool, bool, bool, Instruction*); +template void KelvinVShift<uint8_t>(bool, bool, bool, Instruction*); +template void KelvinVShift<uint16_t>(bool, bool, bool, Instruction*); +template void KelvinVShift<uint32_t>(bool, bool, bool, Instruction*); // Bitwise not. template <typename T> -void KelvinVNot(bool strip_mine, Instruction *inst) { +void KelvinVNot(bool strip_mine, Instruction* inst) { KelvinUnaryVectorOp(inst, strip_mine, std::function<T(T)>([](T vs) -> T { return ~vs; })); } -template void KelvinVNot<int32_t>(bool, Instruction *); +template void KelvinVNot<int32_t>(bool, Instruction*); // Count the leading bits. template <typename T> -void KelvinVClb(bool strip_mine, Instruction *inst) { +void KelvinVClb(bool strip_mine, Instruction* inst) { KelvinUnaryVectorOp(inst, strip_mine, std::function<T(T)>([](T vs) -> T { return (vs & (1u << (sizeof(T) * 8 - 1))) ? absl::countl_one(vs) : absl::countl_zero(vs); })); } -template void KelvinVClb<uint8_t>(bool, Instruction *); -template void KelvinVClb<uint16_t>(bool, Instruction *); -template void KelvinVClb<uint32_t>(bool, Instruction *); +template void KelvinVClb<uint8_t>(bool, Instruction*); +template void KelvinVClb<uint16_t>(bool, Instruction*); +template void KelvinVClb<uint32_t>(bool, Instruction*); // Count the leading zeros. template <typename T> -void KelvinVClz(bool strip_mine, Instruction *inst) { +void KelvinVClz(bool strip_mine, Instruction* inst) { KelvinUnaryVectorOp(inst, strip_mine, std::function<T(T)>([](T vs) -> T { return absl::countl_zero(vs); })); } -template void KelvinVClz<uint8_t>(bool, Instruction *); -template void KelvinVClz<uint16_t>(bool, Instruction *); -template void KelvinVClz<uint32_t>(bool, Instruction *); +template void KelvinVClz<uint8_t>(bool, Instruction*); +template void KelvinVClz<uint16_t>(bool, Instruction*); +template void KelvinVClz<uint32_t>(bool, Instruction*); // Count the set bits. template <typename T> -void KelvinVCpop(bool strip_mine, Instruction *inst) { +void KelvinVCpop(bool strip_mine, Instruction* inst) { KelvinUnaryVectorOp(inst, strip_mine, std::function<T(T)>([](T vs) -> T { return absl::popcount(vs); })); } -template void KelvinVCpop<uint8_t>(bool, Instruction *); -template void KelvinVCpop<uint16_t>(bool, Instruction *); -template void KelvinVCpop<uint32_t>(bool, Instruction *); +template void KelvinVCpop<uint8_t>(bool, Instruction*); +template void KelvinVCpop<uint16_t>(bool, Instruction*); +template void KelvinVCpop<uint32_t>(bool, Instruction*); // Move a register. template <typename T> -void KelvinVMv(bool strip_mine, Instruction *inst) { +void KelvinVMv(bool strip_mine, Instruction* inst) { KelvinUnaryVectorOp(inst, strip_mine, std::function<T(T)>([](T vs) -> T { return vs; })); } -template void KelvinVMv<int32_t>(bool, Instruction *); +template void KelvinVMv<int32_t>(bool, Instruction*); // Alternates Vs1 register used for odd/even destination indices. template <typename Vd, typename Vs1, typename Vs2> -Vs1 VSransOpGetArg1(const Instruction *inst, bool scalar, int num_ops, +Vs1 VSransOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { static_assert(2 * sizeof(Vd) == sizeof(Vs1) || 4 * sizeof(Vd) == sizeof(Vs1)); - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(Vs1); auto src_element_index = op_index * elts_per_register + @@ -893,23 +893,23 @@ } template <typename Td, typename Ts> -void KelvinVSrans(bool round, bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSrans(bool round, bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<Td(Ts, Td)>( absl::bind_front(&KelvinVSransHelper<Td, Ts>, round)), SourceArgGetter<Ts, Td, Ts, Td>(VSransOpGetArg1<Td, Ts, Td>)); } -template void KelvinVSrans<int8_t, int16_t>(bool, bool, bool, Instruction *); -template void KelvinVSrans<int16_t, int32_t>(bool, bool, bool, Instruction *); -template void KelvinVSrans<uint8_t, uint16_t>(bool, bool, bool, Instruction *); -template void KelvinVSrans<uint16_t, uint32_t>(bool, bool, bool, Instruction *); -template void KelvinVSrans<int8_t, int32_t>(bool, bool, bool, Instruction *); -template void KelvinVSrans<uint8_t, uint32_t>(bool, bool, bool, Instruction *); +template void KelvinVSrans<int8_t, int16_t>(bool, bool, bool, Instruction*); +template void KelvinVSrans<int16_t, int32_t>(bool, bool, bool, Instruction*); +template void KelvinVSrans<uint8_t, uint16_t>(bool, bool, bool, Instruction*); +template void KelvinVSrans<uint16_t, uint32_t>(bool, bool, bool, Instruction*); +template void KelvinVSrans<int8_t, int32_t>(bool, bool, bool, Instruction*); +template void KelvinVSrans<uint8_t, uint32_t>(bool, bool, bool, Instruction*); // Multiplication of vector elements. template <typename T> -void KelvinVMul(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMul(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { using WT = typename mpact::sim::generic::WideType<T>::type; @@ -917,13 +917,13 @@ return static_cast<T>(static_cast<WT>(vs1) * static_cast<WT>(vs2)); })); } -template void KelvinVMul<int8_t>(bool, bool, Instruction *); -template void KelvinVMul<int16_t>(bool, bool, Instruction *); -template void KelvinVMul<int32_t>(bool, bool, Instruction *); +template void KelvinVMul<int8_t>(bool, bool, Instruction*); +template void KelvinVMul<int16_t>(bool, bool, Instruction*); +template void KelvinVMul<int32_t>(bool, bool, Instruction*); // Multiplication of vector elements with saturation. template <typename T> -void KelvinVMuls(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMuls(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { using WT = typename mpact::sim::generic::WideType<T>::type; @@ -940,25 +940,25 @@ return result; })); } -template void KelvinVMuls<int8_t>(bool, bool, Instruction *); -template void KelvinVMuls<int16_t>(bool, bool, Instruction *); -template void KelvinVMuls<int32_t>(bool, bool, Instruction *); -template void KelvinVMuls<uint8_t>(bool, bool, Instruction *); -template void KelvinVMuls<uint16_t>(bool, bool, Instruction *); -template void KelvinVMuls<uint32_t>(bool, bool, Instruction *); +template void KelvinVMuls<int8_t>(bool, bool, Instruction*); +template void KelvinVMuls<int16_t>(bool, bool, Instruction*); +template void KelvinVMuls<int32_t>(bool, bool, Instruction*); +template void KelvinVMuls<uint8_t>(bool, bool, Instruction*); +template void KelvinVMuls<uint16_t>(bool, bool, Instruction*); +template void KelvinVMuls<uint32_t>(bool, bool, Instruction*); // Multiplication of vector elements with widening. template <typename Td, typename Ts> -void KelvinVMulw(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMulw(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<Td(Ts, Ts)>([](Ts vs1, Ts vs2) -> Td { return static_cast<Td>(vs1) * static_cast<Td>(vs2); })); } -template void KelvinVMulw<int16_t, int8_t>(bool, bool, Instruction *); -template void KelvinVMulw<int32_t, int16_t>(bool, bool, Instruction *); -template void KelvinVMulw<uint16_t, uint8_t>(bool, bool, Instruction *); -template void KelvinVMulw<uint32_t, uint16_t>(bool, bool, Instruction *); +template void KelvinVMulw<int16_t, int8_t>(bool, bool, Instruction*); +template void KelvinVMulw<int32_t, int16_t>(bool, bool, Instruction*); +template void KelvinVMulw<uint16_t, uint8_t>(bool, bool, Instruction*); +template void KelvinVMulw<uint32_t, uint16_t>(bool, bool, Instruction*); // Multiplication of vector elements with widening and optional rounding. // Returns high half. @@ -973,17 +973,17 @@ } template <typename T> -void KelvinVMulh(bool scalar, bool strip_mine, bool round, Instruction *inst) { +void KelvinVMulh(bool scalar, bool strip_mine, bool round, Instruction* inst) { KelvinBinaryVectorOp( inst, scalar, strip_mine, std::function<T(T, T)>(absl::bind_front(&KelvinVMulhHelper<T>, round))); } -template void KelvinVMulh<int8_t>(bool, bool, bool, Instruction *); -template void KelvinVMulh<int16_t>(bool, bool, bool, Instruction *); -template void KelvinVMulh<int32_t>(bool, bool, bool, Instruction *); -template void KelvinVMulh<uint8_t>(bool, bool, bool, Instruction *); -template void KelvinVMulh<uint16_t>(bool, bool, bool, Instruction *); -template void KelvinVMulh<uint32_t>(bool, bool, bool, Instruction *); +template void KelvinVMulh<int8_t>(bool, bool, bool, Instruction*); +template void KelvinVMulh<int16_t>(bool, bool, bool, Instruction*); +template void KelvinVMulh<int32_t>(bool, bool, bool, Instruction*); +template void KelvinVMulh<uint8_t>(bool, bool, bool, Instruction*); +template void KelvinVMulh<uint16_t>(bool, bool, bool, Instruction*); +template void KelvinVMulh<uint32_t>(bool, bool, bool, Instruction*); // Saturating signed doubling multiply returning high half with optional // rounding. @@ -1008,18 +1008,18 @@ } template <typename T> void KelvinVDmulh(bool scalar, bool strip_mine, bool round, bool round_neg, - Instruction *inst) { + Instruction* inst) { KelvinBinaryVectorOp(inst, scalar, strip_mine, std::function<T(T, T)>(absl::bind_front( &KelvinVDmulhHelper<T>, round, round_neg))); } -template void KelvinVDmulh<int8_t>(bool, bool, bool, bool, Instruction *); -template void KelvinVDmulh<int16_t>(bool, bool, bool, bool, Instruction *); -template void KelvinVDmulh<int32_t>(bool, bool, bool, bool, Instruction *); +template void KelvinVDmulh<int8_t>(bool, bool, bool, bool, Instruction*); +template void KelvinVDmulh<int16_t>(bool, bool, bool, bool, Instruction*); +template void KelvinVDmulh<int32_t>(bool, bool, bool, bool, Instruction*); // Multiply accumulate. template <typename T> -void KelvinVMacc(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMacc(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, T, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T, T)>([](T vd, T vs1, T vs2) -> T { @@ -1028,13 +1028,13 @@ static_cast<WT>(vs1) * static_cast<WT>(vs2); })); } -template void KelvinVMacc<int8_t>(bool, bool, Instruction *); -template void KelvinVMacc<int16_t>(bool, bool, Instruction *); -template void KelvinVMacc<int32_t>(bool, bool, Instruction *); +template void KelvinVMacc<int8_t>(bool, bool, Instruction*); +template void KelvinVMacc<int16_t>(bool, bool, Instruction*); +template void KelvinVMacc<int32_t>(bool, bool, Instruction*); // Multiply add. template <typename T> -void KelvinVMadd(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVMadd(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, T, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T, T)>([](T vd, T vs1, T vs2) -> T { @@ -1043,17 +1043,17 @@ static_cast<WT>(vd) * static_cast<WT>(vs2); })); } -template void KelvinVMadd<int8_t>(bool, bool, Instruction *); -template void KelvinVMadd<int16_t>(bool, bool, Instruction *); -template void KelvinVMadd<int32_t>(bool, bool, Instruction *); +template void KelvinVMadd<int8_t>(bool, bool, Instruction*); +template void KelvinVMadd<int16_t>(bool, bool, Instruction*); +template void KelvinVMadd<int32_t>(bool, bool, Instruction*); // Computes slide index for next register and takes result from either vs1 or // vs2. template <typename T> -T VSlidenOpGetArg1(bool horizontal, int index, const Instruction *inst, +T VSlidenOpGetArg1(bool horizontal, int index, const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(T); @@ -1097,37 +1097,37 @@ // Slide next register vertically by index. template <typename T> -void KelvinVSlidevn(int index, bool strip_mine, Instruction *inst) { +void KelvinVSlidevn(int index, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, false /* scalar */, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>(absl::bind_front( VSlidenOpGetArg1<T>, false /* horizontal */, index))); } -template void KelvinVSlidevn<int8_t>(int, bool, Instruction *); -template void KelvinVSlidevn<int16_t>(int, bool, Instruction *); -template void KelvinVSlidevn<int32_t>(int, bool, Instruction *); +template void KelvinVSlidevn<int8_t>(int, bool, Instruction*); +template void KelvinVSlidevn<int16_t>(int, bool, Instruction*); +template void KelvinVSlidevn<int32_t>(int, bool, Instruction*); // Slide next register horizontally by index. template <typename T> -void KelvinVSlidehn(int index, Instruction *inst) { +void KelvinVSlidehn(int index, Instruction* inst) { KelvinBinaryVectorOp( inst, false /* scalar */, true /* strip_mine */, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>( absl::bind_front(VSlidenOpGetArg1<T>, true /* horizontal */, index))); } -template void KelvinVSlidehn<int8_t>(int, Instruction *); -template void KelvinVSlidehn<int16_t>(int, Instruction *); -template void KelvinVSlidehn<int32_t>(int, Instruction *); +template void KelvinVSlidehn<int8_t>(int, Instruction*); +template void KelvinVSlidehn<int16_t>(int, Instruction*); +template void KelvinVSlidehn<int32_t>(int, Instruction*); // Computes slide index for previous register and takes result from either vs1 // or vs2. template <typename T> -T VSlidepOpGetArg1(bool horizontal, int index, const Instruction *inst, +T VSlidepOpGetArg1(bool horizontal, int index, const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; auto elts_per_register = vector_size_in_bytes / sizeof(T); @@ -1171,50 +1171,50 @@ // Slide previous register vertically by index. template <typename T> -void KelvinVSlidevp(int index, bool strip_mine, Instruction *inst) { +void KelvinVSlidevp(int index, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp( inst, false /* scalar */, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>(absl::bind_front( VSlidepOpGetArg1<T>, false /* horizontal */, index))); } -template void KelvinVSlidevp<int8_t>(int, bool, Instruction *); -template void KelvinVSlidevp<int16_t>(int, bool, Instruction *); -template void KelvinVSlidevp<int32_t>(int, bool, Instruction *); +template void KelvinVSlidevp<int8_t>(int, bool, Instruction*); +template void KelvinVSlidevp<int16_t>(int, bool, Instruction*); +template void KelvinVSlidevp<int32_t>(int, bool, Instruction*); // Slide previous register horizontally by index. template <typename T> -void KelvinVSlidehp(int index, Instruction *inst) { +void KelvinVSlidehp(int index, Instruction* inst) { KelvinBinaryVectorOp( inst, false /* scalar */, true /* strip_mine */, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>( absl::bind_front(VSlidepOpGetArg1<T>, true /* horizontal */, index))); } -template void KelvinVSlidehp<int8_t>(int, Instruction *); -template void KelvinVSlidehp<int16_t>(int, Instruction *); -template void KelvinVSlidehp<int32_t>(int, Instruction *); +template void KelvinVSlidehp<int8_t>(int, Instruction*); +template void KelvinVSlidehp<int16_t>(int, Instruction*); +template void KelvinVSlidehp<int32_t>(int, Instruction*); template <typename T> -void KelvinVSel(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSel(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSel(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVSel(bool scalar, bool strip_mine, Instruction* inst) { // Select lanes from two operands with vector selection boolean. KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, T, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T, T)>( [](T vd, T vs1, T vs2) -> T { return vs1 & 1 ? vd : vs2; })); } -template void KelvinVSel<int8_t>(bool, bool, Instruction *); -template void KelvinVSel<int16_t>(bool, bool, Instruction *); -template void KelvinVSel<int32_t>(bool, bool, Instruction *); +template void KelvinVSel<int8_t>(bool, bool, Instruction*); +template void KelvinVSel<int16_t>(bool, bool, Instruction*); +template void KelvinVSel<int32_t>(bool, bool, Instruction*); // Returns even elements of concatenated registers. template <typename T> -T VEvnOpGetArg1(const Instruction *inst, bool scalar, int num_ops, int op_index, +T VEvnOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const int elts_per_register = vector_size_in_bytes / sizeof(T); @@ -1231,22 +1231,22 @@ } template <typename T> -void KelvinVEvn(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVEvn(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>(VEvnOpGetArg1<T>), SourceArgGetter<T, T, T, T>(VEvnOpGetArg1<T>)); } -template void KelvinVEvn<int8_t>(bool, bool, Instruction *); -template void KelvinVEvn<int16_t>(bool, bool, Instruction *); -template void KelvinVEvn<int32_t>(bool, bool, Instruction *); +template void KelvinVEvn<int8_t>(bool, bool, Instruction*); +template void KelvinVEvn<int16_t>(bool, bool, Instruction*); +template void KelvinVEvn<int32_t>(bool, bool, Instruction*); // Returns odd elements of concatenated registers. template <typename T> -T VOddOpGetArg1(const Instruction *inst, bool scalar, int num_ops, int op_index, +T VOddOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const int elts_per_register = vector_size_in_bytes / sizeof(T); @@ -1263,20 +1263,20 @@ } template <typename T> -void KelvinVOdd(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVOdd(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, false /* widen_dst */, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>(VOddOpGetArg1<T>), SourceArgGetter<T, T, T, T>(VOddOpGetArg1<T>)); } -template void KelvinVOdd<int8_t>(bool, bool, Instruction *); -template void KelvinVOdd<int16_t>(bool, bool, Instruction *); -template void KelvinVOdd<int32_t>(bool, bool, Instruction *); +template void KelvinVOdd<int8_t>(bool, bool, Instruction*); +template void KelvinVOdd<int16_t>(bool, bool, Instruction*); +template void KelvinVOdd<int32_t>(bool, bool, Instruction*); // Returns evn/odd elements of concatenated registers based on dst_reg_index. template <typename T> -T VEvnoddOpGetArg1(const Instruction *inst, bool scalar, int num_ops, +T VEvnoddOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { return dst_reg_index == 0 ? VEvnOpGetArg1<T>(inst, scalar, num_ops, op_index, @@ -1286,23 +1286,23 @@ } template <typename T> -void KelvinVEvnodd(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVEvnodd(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, true /* widen_dst */, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>(VEvnoddOpGetArg1<T>), SourceArgGetter<T, T, T, T>(VEvnoddOpGetArg1<T>)); } -template void KelvinVEvnodd<int8_t>(bool, bool, Instruction *); -template void KelvinVEvnodd<int16_t>(bool, bool, Instruction *); -template void KelvinVEvnodd<int32_t>(bool, bool, Instruction *); +template void KelvinVEvnodd<int8_t>(bool, bool, Instruction*); +template void KelvinVEvnodd<int16_t>(bool, bool, Instruction*); +template void KelvinVEvnodd<int32_t>(bool, bool, Instruction*); // Interleave even/odd lanes of two operands. // Returns even elements of concatenated registers. template <typename T> -T VZipOpGetArg1(const Instruction *inst, bool scalar, int num_ops, int op_index, +T VZipOpGetArg1(const Instruction* inst, bool scalar, int num_ops, int op_index, int dst_element_index, int dst_reg_index) { - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const int elts_per_register = vector_size_in_bytes / sizeof(T); const int half_elts_per_register = elts_per_register / 2; @@ -1321,14 +1321,14 @@ } template <typename T> -void KelvinVZip(bool scalar, bool strip_mine, Instruction *inst) { +void KelvinVZip(bool scalar, bool strip_mine, Instruction* inst) { KelvinBinaryVectorOp<false /* halftype */, true /* widen_dst */, T, T, T>( inst, scalar, strip_mine, std::function<T(T, T)>([](T vs1, T vs2) -> T { return vs1; }), SourceArgGetter<T, T, T, T>(VZipOpGetArg1<T>), SourceArgGetter<T, T, T, T>(VZipOpGetArg1<T>)); } -template void KelvinVZip<int8_t>(bool, bool, Instruction *); -template void KelvinVZip<int16_t>(bool, bool, Instruction *); -template void KelvinVZip<int32_t>(bool, bool, Instruction *); +template void KelvinVZip<int8_t>(bool, bool, Instruction*); +template void KelvinVZip<int16_t>(bool, bool, Instruction*); +template void KelvinVZip<int32_t>(bool, bool, Instruction*); } // namespace kelvin::sim
diff --git a/sim/kelvin_vector_instructions.h b/sim/kelvin_vector_instructions.h index 30a6a1e..a8d18d7 100644 --- a/sim/kelvin_vector_instructions.h +++ b/sim/kelvin_vector_instructions.h
@@ -25,173 +25,173 @@ // Vector 2-arg .vv, .vx arithmetic operations. template <typename T> -void KelvinVAdd(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAdd(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSub(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSub(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVRSub(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVRSub(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVEq(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVEq(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVNe(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVNe(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVLt(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVLt(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVLe(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVLe(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVGt(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVGt(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVGe(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVGe(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVAbsd(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAbsd(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMax(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMax(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMin(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMin(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVAdd3(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAdd3(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVAdds(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAdds(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVAddsu(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAddsu(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSubs(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSubs(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSubsu(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSubsu(bool scalar, bool strip_mine, Instruction* inst); template <typename Td, typename Ts> -void KelvinVAddw(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAddw(bool scalar, bool strip_mine, Instruction* inst); template <typename Td, typename Ts> -void KelvinVSubw(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSubw(bool scalar, bool strip_mine, Instruction* inst); template <typename Td, typename Ts2> -void KelvinVAcc(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAcc(bool scalar, bool strip_mine, Instruction* inst); template <typename Td, typename Ts> -void KelvinVPadd(bool strip_mine, Instruction *inst); +void KelvinVPadd(bool strip_mine, Instruction* inst); template <typename Td, typename Ts> -void KelvinVPsub(bool strip_mine, Instruction *inst); +void KelvinVPsub(bool strip_mine, Instruction* inst); template <typename T> -void KelvinVHadd(bool scalar, bool strip_mine, bool round, Instruction *inst); +void KelvinVHadd(bool scalar, bool strip_mine, bool round, Instruction* inst); template <typename T> -void KelvinVHsub(bool scalar, bool strip_mine, bool round, Instruction *inst); +void KelvinVHsub(bool scalar, bool strip_mine, bool round, Instruction* inst); template <typename T> -void KelvinVAnd(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVAnd(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVOr(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVOr(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVXor(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVXor(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVRev(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVRev(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVRor(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVRor(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMvp(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMvp(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSll(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSll(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSra(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSra(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSrl(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSrl(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVShift(bool round, bool scalar, bool strip_mine, Instruction *inst); +void KelvinVShift(bool round, bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVNot(bool strip_mine, Instruction *inst); +void KelvinVNot(bool strip_mine, Instruction* inst); template <typename T> -void KelvinVClb(bool strip_mine, Instruction *inst); +void KelvinVClb(bool strip_mine, Instruction* inst); template <typename T> -void KelvinVClz(bool strip_mine, Instruction *inst); +void KelvinVClz(bool strip_mine, Instruction* inst); template <typename T> -void KelvinVCpop(bool strip_mine, Instruction *inst); +void KelvinVCpop(bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMv(bool strip_mine, Instruction *inst); +void KelvinVMv(bool strip_mine, Instruction* inst); template <typename Td, typename Ts> -void KelvinVSrans(bool round, bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSrans(bool round, bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMul(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMul(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMuls(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMuls(bool scalar, bool strip_mine, Instruction* inst); template <typename Td, typename Ts> -void KelvinVMulw(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMulw(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMulh(bool scalar, bool strip_mine, bool round, Instruction *inst); +void KelvinVMulh(bool scalar, bool strip_mine, bool round, Instruction* inst); template <typename T> void KelvinVDmulh(bool scalar, bool strip_mine, bool round, bool round_neg, - Instruction *inst); + Instruction* inst); template <typename T> -void KelvinVMacc(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMacc(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVMadd(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVMadd(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSlidevn(int index, bool strip_mine, Instruction *inst); +void KelvinVSlidevn(int index, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSlidehn(int index, Instruction *inst); +void KelvinVSlidehn(int index, Instruction* inst); template <typename T> -void KelvinVSlidevp(int index, bool strip_mine, Instruction *inst); +void KelvinVSlidevp(int index, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVSlidehp(int index, Instruction *inst); +void KelvinVSlidehp(int index, Instruction* inst); template <typename T> -void KelvinVSel(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVSel(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVEvn(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVEvn(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVOdd(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVOdd(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVEvnodd(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVEvnodd(bool scalar, bool strip_mine, Instruction* inst); template <typename T> -void KelvinVZip(bool scalar, bool strip_mine, Instruction *inst); +void KelvinVZip(bool scalar, bool strip_mine, Instruction* inst); } // namespace kelvin::sim #endif // SIM_KELVIN_VECTOR_INSTRUCTIONS_H_
diff --git a/sim/kelvin_vector_memory_instructions.cc b/sim/kelvin_vector_memory_instructions.cc index c63b943..a13a259 100644 --- a/sim/kelvin_vector_memory_instructions.cc +++ b/sim/kelvin_vector_memory_instructions.cc
@@ -37,8 +37,8 @@ // register post-increment. template <typename T> void KelvinVLd(bool has_length, bool has_stride, bool strip_mine, - Instruction *inst) { - auto state = static_cast<KelvinState *>(inst->state()); + Instruction* inst) { + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const uint32_t elts_per_register = vector_size_in_bytes / sizeof(T); @@ -65,11 +65,11 @@ stride_elts = stride_arg; } - auto *db_factory = inst->state()->db_factory(); - auto *address_db = db_factory->Allocate<uint64_t>(elts_to_load); - auto *mask_db = db_factory->Allocate<bool>(elts_to_load); + auto* db_factory = inst->state()->db_factory(); + auto* address_db = db_factory->Allocate<uint64_t>(elts_to_load); + auto* mask_db = db_factory->Allocate<bool>(elts_to_load); // Allocate the value data buffer that the loaded data is returned in. - auto *value_db = db_factory->Allocate<T>(elts_to_load); + auto* value_db = db_factory->Allocate<T>(elts_to_load); auto addresses = address_db->Get<uint64_t>(); auto masks = mask_db->Get<bool>(); @@ -84,7 +84,7 @@ elts_left -= count; base += stride_elts * sizeof(T); } - auto *context = new LoadContext(value_db); + auto* context = new LoadContext(value_db); value_db->set_latency(0); state->LoadMemory(inst, address_db, mask_db, sizeof(T), value_db, inst->child(), context); @@ -96,9 +96,8 @@ const bool post_increment = inst->DestinationsSize() == 1; if (post_increment) { - auto *reg = - static_cast< - mpact::sim::generic::RegisterDestinationOperand<uint32_t> *>( + auto* reg = + static_cast<mpact::sim::generic::RegisterDestinationOperand<uint32_t>*>( inst->Destination(0)) ->GetRegister(); @@ -120,24 +119,24 @@ reg->data_buffer()->template Set<uint32_t>(0, addr); } } -template void KelvinVLd<int8_t>(bool, bool, bool, Instruction *); -template void KelvinVLd<int16_t>(bool, bool, bool, Instruction *); -template void KelvinVLd<int32_t>(bool, bool, bool, Instruction *); +template void KelvinVLd<int8_t>(bool, bool, bool, Instruction*); +template void KelvinVLd<int16_t>(bool, bool, bool, Instruction*); +template void KelvinVLd<int32_t>(bool, bool, bool, Instruction*); // VLd child instruction which writes data loaded to destination register(s). template <typename T> -void KelvinVLdRegWrite(bool strip_mine, Instruction *inst) { - auto state = static_cast<KelvinState *>(inst->state()); +void KelvinVLdRegWrite(bool strip_mine, Instruction* inst) { + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const uint32_t elts_per_register = vector_size_in_bytes / sizeof(T); const auto num_ops = strip_mine ? 4 : 1; - auto *context = static_cast<LoadContext *>(inst->context()); + auto* context = static_cast<LoadContext*>(inst->context()); auto values = context->value_db->template Get<T>(); - auto vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); + auto vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); for (int op_index = 0; op_index < num_ops; ++op_index) { - DataBuffer *dest_db = vd->AllocateDataBuffer(op_index); + DataBuffer* dest_db = vd->AllocateDataBuffer(op_index); absl::Span<T> dest_span = dest_db->template Get<T>(); for (int dst_element_index = 0; dst_element_index < elts_per_register; @@ -152,9 +151,9 @@ dest_db->Submit(); } } -template void KelvinVLdRegWrite<int8_t>(bool, Instruction *); -template void KelvinVLdRegWrite<int16_t>(bool, Instruction *); -template void KelvinVLdRegWrite<int32_t>(bool, Instruction *); +template void KelvinVLdRegWrite<int8_t>(bool, Instruction*); +template void KelvinVLdRegWrite<int16_t>(bool, Instruction*); +template void KelvinVLdRegWrite<int32_t>(bool, Instruction*); // Vector store instruction with the optional data length, stride and address // register post-increment. @@ -162,8 +161,8 @@ // register with xs2 stride. template <typename T> void VectorStoreHelper(bool has_length, bool has_stride, bool strip_mine, - bool is_quad, Instruction *inst) { - auto state = static_cast<KelvinState *>(inst->state()); + bool is_quad, Instruction* inst) { + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const uint32_t elts_per_register = vector_size_in_bytes / sizeof(T); @@ -173,7 +172,7 @@ kKelvinMaxMemoryAddress) { // exclude semihost tests mem_addr &= kMemMask; } - auto vs = static_cast<RV32VectorSourceOperand *>(inst->Source(0)); + auto vs = static_cast<RV32VectorSourceOperand*>(inst->Source(0)); auto base_addr = mem_addr; @@ -190,9 +189,9 @@ } // Allocate the store memory - auto *value_db = state->db_factory()->Allocate(elts_to_store * sizeof(T)); - auto *address_db = state->db_factory()->Allocate<uint64_t>(elts_to_store); - auto *mask_db = state->db_factory()->Allocate<bool>(elts_to_store); + auto* value_db = state->db_factory()->Allocate(elts_to_store * sizeof(T)); + auto* address_db = state->db_factory()->Allocate<uint64_t>(elts_to_store); + auto* mask_db = state->db_factory()->Allocate<bool>(elts_to_store); auto addresses = address_db->Get<uint64_t>(); auto value = value_db->Get<T>(); auto mask = mask_db->Get<bool>(); @@ -228,9 +227,8 @@ const bool post_increment = inst->DestinationsSize() == 1; if (post_increment) { - auto *reg = - static_cast< - mpact::sim::generic::RegisterDestinationOperand<uint32_t> *>( + auto* reg = + static_cast<mpact::sim::generic::RegisterDestinationOperand<uint32_t>*>( inst->Destination(0)) ->GetRegister(); if (elts_to_store > 0) { @@ -254,30 +252,30 @@ template <typename T> void KelvinVSt(bool has_length, bool has_stride, bool strip_mine, - Instruction *inst) { + Instruction* inst) { VectorStoreHelper<T>(has_length, has_stride, strip_mine, /*is_quad=*/false, inst); } -template void KelvinVSt<int8_t>(bool, bool, bool, Instruction *); -template void KelvinVSt<int16_t>(bool, bool, bool, Instruction *); -template void KelvinVSt<int32_t>(bool, bool, bool, Instruction *); +template void KelvinVSt<int8_t>(bool, bool, bool, Instruction*); +template void KelvinVSt<int16_t>(bool, bool, bool, Instruction*); +template void KelvinVSt<int32_t>(bool, bool, bool, Instruction*); // Duplicate a scalar value into a vector register. template <typename T> -void KelvinVDup(bool strip_mine, Instruction *inst) { - auto *state = static_cast<KelvinState *>(inst->state()); +void KelvinVDup(bool strip_mine, Instruction* inst) { + auto* state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; const uint32_t elts_per_register = vector_size_in_bytes / sizeof(T); const auto num_ops = strip_mine ? 4 : 1; // Gets destination register and scalar value. - auto *vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); + auto* vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); auto value = GetInstructionSource<T>(inst, 0); // Fill destination buffer and write to register. for (int op_index = 0; op_index < num_ops; ++op_index) { - DataBuffer *dest_db = vd->AllocateDataBuffer(op_index); + DataBuffer* dest_db = vd->AllocateDataBuffer(op_index); absl::Span<T> dest_span = dest_db->template Get<T>(); for (int dst_element_index = 0; dst_element_index < elts_per_register; ++dst_element_index) { @@ -287,30 +285,30 @@ } } -template void KelvinVDup<int8_t>(bool, Instruction *); -template void KelvinVDup<int16_t>(bool, Instruction *); -template void KelvinVDup<int32_t>(bool, Instruction *); +template void KelvinVDup<int8_t>(bool, Instruction*); +template void KelvinVDup<int16_t>(bool, Instruction*); +template void KelvinVDup<int32_t>(bool, Instruction*); template <typename T> -void KelvinVStQ(bool strip_mine, Instruction *inst) { +void KelvinVStQ(bool strip_mine, Instruction* inst) { VectorStoreHelper<T>(/*has_length=*/false, /*has_stride=*/true, strip_mine, /*is_quad=*/true, inst); } -template void KelvinVStQ<int8_t>(bool, Instruction *); -template void KelvinVStQ<int16_t>(bool, Instruction *); -template void KelvinVStQ<int32_t>(bool, Instruction *); +template void KelvinVStQ<int8_t>(bool, Instruction*); +template void KelvinVStQ<int16_t>(bool, Instruction*); +template void KelvinVStQ<int32_t>(bool, Instruction*); // Return the supported vl length. It starts with the maximum value based on // vector_length and then is capped to the minimum by the additional inputs. template <typename T> void KelvinGetVl(bool strip_mine, bool is_rs1, bool is_rs2, - const mpact::sim::generic::Instruction *inst) { - auto *dest_reg = - static_cast<mpact::sim::generic::RegisterDestinationOperand<uint32_t> *>( + const mpact::sim::generic::Instruction* inst) { + auto* dest_reg = + static_cast<mpact::sim::generic::RegisterDestinationOperand<uint32_t>*>( inst->Destination(0)) ->GetRegister(); - auto state = static_cast<KelvinState *>(inst->state()); + auto state = static_cast<KelvinState*>(inst->state()); const int vector_size_in_bytes = state->vector_length() / 8; uint32_t vlen = vector_size_in_bytes / sizeof(T); if (strip_mine) { @@ -327,20 +325,20 @@ } dest_reg->data_buffer()->Set<uint32_t>(0, vlen); } -template void KelvinGetVl<int8_t>(bool, bool, bool, const Instruction *); -template void KelvinGetVl<int16_t>(bool, bool, bool, const Instruction *); -template void KelvinGetVl<int32_t>(bool, bool, bool, const Instruction *); +template void KelvinGetVl<int8_t>(bool, bool, bool, const Instruction*); +template void KelvinGetVl<int16_t>(bool, bool, bool, const Instruction*); +template void KelvinGetVl<int32_t>(bool, bool, bool, const Instruction*); // Copy convolution accumulation registers into general vector register. In HW, // it is set to be v48..55. -void KelvinVcGet(const mpact::sim::generic::Instruction *inst) { - auto vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); - auto *state = static_cast<KelvinState *>(inst->state()); +void KelvinVcGet(const mpact::sim::generic::Instruction* inst) { + auto vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); + auto* state = static_cast<KelvinState*>(inst->state()); const uint32_t kVecLenInWord = state->vector_length() / 32; for (int op_index = 0; op_index < kVecLenInWord; ++op_index) { - DataBuffer *dest_db = vd->AllocateDataBuffer(op_index); + DataBuffer* dest_db = vd->AllocateDataBuffer(op_index); absl::Span<uint32_t> dest_span = dest_db->Get<uint32_t>(); - auto *acc_vec = state->acc_vec(op_index); + auto* acc_vec = state->acc_vec(op_index); for (int i = 0; i < dest_span.size(); ++i) { dest_span[i] = (*acc_vec)[i]; } @@ -353,19 +351,19 @@ // accumulation register. In HW, vs has to be 16-register aligned, and vd has // to be set to v48. void KelvinAcSet(bool is_transpose, - const mpact::sim::generic::Instruction *inst) { - auto vs = static_cast<RV32VectorSourceOperand *>(inst->Source(0)); - auto *state = static_cast<KelvinState *>(inst->state()); + const mpact::sim::generic::Instruction* inst) { + auto vs = static_cast<RV32VectorSourceOperand*>(inst->Source(0)); + auto* state = static_cast<KelvinState*>(inst->state()); const uint32_t kVecLenInWord = state->vector_length() / 32; for (int op_index = 0; op_index < kVecLenInWord; ++op_index) { auto source_span = vs->GetRegister(op_index)->data_buffer()->Get<uint32_t>(); for (int i = 0; i < source_span.size(); ++i) { if (is_transpose) { - auto *acc_vec = state->acc_vec(i); + auto* acc_vec = state->acc_vec(i); (*acc_vec)[op_index] = source_span[i]; } else { - auto *acc_vec = state->acc_vec(op_index); + auto* acc_vec = state->acc_vec(op_index); (*acc_vec)[i] = source_span[i]; } } @@ -375,23 +373,23 @@ // Copy the content from the source `vs1` banks to the `vd` banks to prepare the // depthwise convolution. Due to compiler encoding, this op is typeless and only // assumes `vs1` and `vd` content in 8-bit type. -void KelvinADwInit(const mpact::sim::generic::Instruction *inst) { - auto *state = static_cast<KelvinState *>(inst->state()); +void KelvinADwInit(const mpact::sim::generic::Instruction* inst) { + auto* state = static_cast<KelvinState*>(inst->state()); // Only set a quarter of the to prepare for double-widening in depth-wise // convolution. const uint32_t init_n = state->vector_length() / (8 * 4); constexpr int kInitSize = 4; - auto vs = static_cast<RV32VectorSourceOperand *>(inst->Source(0)); - auto vd = static_cast<RV32VectorDestinationOperand *>(inst->Destination(0)); + auto vs = static_cast<RV32VectorSourceOperand*>(inst->Source(0)); + auto vd = static_cast<RV32VectorDestinationOperand*>(inst->Destination(0)); for (int op_index = 0; op_index < kInitSize; ++op_index) { auto source_span = vs->GetRegister(op_index)->data_buffer()->Get<uint8_t>(); - uint8_t *dwacc_span = - reinterpret_cast<uint8_t *>(state->dw_acc_vec(8 * op_index)); + uint8_t* dwacc_span = + reinterpret_cast<uint8_t*>(state->dw_acc_vec(8 * op_index)); for (int i = 0; i < 32; i++) { dwacc_span[i] = source_span[i]; } - DataBuffer *dest_db = vd->AllocateDataBuffer(op_index); + DataBuffer* dest_db = vd->AllocateDataBuffer(op_index); absl::Span<uint8_t> dest_span = dest_db->Get<uint8_t>(); for (int i = 0; i < init_n; ++i) { dest_span[i] = source_span[i];
diff --git a/sim/kelvin_vector_memory_instructions.h b/sim/kelvin_vector_memory_instructions.h index 6369f1a..25ed24e 100644 --- a/sim/kelvin_vector_memory_instructions.h +++ b/sim/kelvin_vector_memory_instructions.h
@@ -25,31 +25,31 @@ template <typename T> void KelvinVLd(bool has_length, bool has_stride, bool strip_mine, - Instruction *inst); + Instruction* inst); template <typename T> -void KelvinVLdRegWrite(bool strip_mine, Instruction *inst); +void KelvinVLdRegWrite(bool strip_mine, Instruction* inst); template <typename T> void KelvinVSt(bool has_length, bool has_stride, bool strip_mine, - Instruction *inst); + Instruction* inst); template <typename T> -void KelvinVDup(bool strip_mine, Instruction *inst); +void KelvinVDup(bool strip_mine, Instruction* inst); template <typename T> -void KelvinVStQ(bool strip_mine, Instruction *inst); +void KelvinVStQ(bool strip_mine, Instruction* inst); template <typename T> void KelvinGetVl(bool strip_mine, bool is_rs1, bool is_rs2, - const mpact::sim::generic::Instruction *inst); + const mpact::sim::generic::Instruction* inst); -void KelvinVcGet(const mpact::sim::generic::Instruction *inst); +void KelvinVcGet(const mpact::sim::generic::Instruction* inst); void KelvinAcSet(bool is_transpose, - const mpact::sim::generic::Instruction *inst); + const mpact::sim::generic::Instruction* inst); -void KelvinADwInit(const mpact::sim::generic::Instruction *inst); +void KelvinADwInit(const mpact::sim::generic::Instruction* inst); } // namespace kelvin::sim
diff --git a/sim/proto/BUILD b/sim/proto/BUILD index 690d9c1..ad1de67 100644 --- a/sim/proto/BUILD +++ b/sim/proto/BUILD
@@ -24,6 +24,7 @@ srcs = [ "kelvin_trace.proto", ], + ) cc_proto_library(
diff --git a/sim/proto/kelvin_trace.proto b/sim/proto/kelvin_trace.proto index 02e0c88..dc54bc4 100644 --- a/sim/proto/kelvin_trace.proto +++ b/sim/proto/kelvin_trace.proto
@@ -16,6 +16,9 @@ package kelvin.sim.proto; + + + option features.utf8_validation = NONE; option java_multiple_files = true;
diff --git a/sim/renode/BUILD b/sim/renode/BUILD index 660e6f7..5eda89f 100644 --- a/sim/renode/BUILD +++ b/sim/renode/BUILD
@@ -14,6 +14,8 @@ # Build Renode interface for kelvin + + package( default_visibility = ["//visibility:public"], ) @@ -32,7 +34,6 @@ "@com_google_absl//absl/container:flat_hash_map", "@com_google_absl//absl/log", "@com_google_absl//absl/strings", - "@com_google_mpact-sim//mpact/sim/generic:core_debug_interface", "@com_google_mpact-sim//mpact/sim/generic:type_helpers", "@com_google_mpact-sim//mpact/sim/util/program_loader:elf_loader", ],
diff --git a/sim/renode/kelvin_renode.cc b/sim/renode/kelvin_renode.cc index ffb5a8f..89c1c87 100644 --- a/sim/renode/kelvin_renode.cc +++ b/sim/renode/kelvin_renode.cc
@@ -30,15 +30,15 @@ #include "mpact/sim/generic/data_buffer.h" #include "mpact/sim/generic/instruction.h" -kelvin::sim::renode::RenodeDebugInterface *CreateKelvinSim(std::string name) { - auto *top = new kelvin::sim::KelvinRenode(name); +kelvin::sim::renode::RenodeDebugInterface* CreateKelvinSim(std::string name) { + auto* top = new kelvin::sim::KelvinRenode(name); return top; } -kelvin::sim::renode::RenodeDebugInterface *CreateKelvinSim( +kelvin::sim::renode::RenodeDebugInterface* CreateKelvinSim( std::string name, uint64_t memory_block_size_bytes, - uint64_t memory_size_bytes, uint8_t **block_ptr_list) { - auto *top = new kelvin::sim::KelvinRenode(name, memory_block_size_bytes, + uint64_t memory_size_bytes, uint8_t** block_ptr_list) { + auto* top = new kelvin::sim::KelvinRenode(name, memory_block_size_bytes, memory_size_bytes, block_ptr_list); return top; } @@ -57,7 +57,7 @@ KelvinRenode::KelvinRenode(std::string name, uint64_t memory_block_size_bytes, uint64_t memory_size_bytes, - uint8_t **block_ptr_list) { + uint8_t** block_ptr_list) { kelvin_top_ = new KelvinTop(name, memory_block_size_bytes, memory_size_bytes, block_ptr_list); } @@ -83,28 +83,28 @@ return kelvin_top_->GetLastHaltReason(); } -absl::StatusOr<uint64_t> KelvinRenode::ReadRegister(const std::string &name) { +absl::StatusOr<uint64_t> KelvinRenode::ReadRegister(const std::string& name) { return kelvin_top_->ReadRegister(name); } -absl::Status KelvinRenode::WriteRegister(const std::string &name, +absl::Status KelvinRenode::WriteRegister(const std::string& name, uint64_t value) { return kelvin_top_->WriteRegister(name, value); } -absl::StatusOr<size_t> KelvinRenode::ReadMemory(uint64_t address, void *buf, +absl::StatusOr<size_t> KelvinRenode::ReadMemory(uint64_t address, void* buf, size_t length) { return kelvin_top_->ReadMemory(address, buf, length); } absl::StatusOr<size_t> KelvinRenode::WriteMemory(uint64_t address, - const void *buf, + const void* buf, size_t length) { return kelvin_top_->WriteMemory(address, buf, length); } -absl::StatusOr<mpact::sim::generic::DataBuffer *> -KelvinRenode::GetRegisterDataBuffer(const std::string &name) { +absl::StatusOr<mpact::sim::generic::DataBuffer*> +KelvinRenode::GetRegisterDataBuffer(const std::string& name) { return kelvin_top_->GetRegisterDataBuffer(name); } @@ -124,7 +124,7 @@ return kelvin_top_->ClearAllSwBreakpoints(); } -absl::StatusOr<mpact::sim::generic::Instruction *> KelvinRenode::GetInstruction( +absl::StatusOr<mpact::sim::generic::Instruction*> KelvinRenode::GetInstruction( uint64_t address) { return kelvin_top_->GetInstruction(address); } @@ -133,7 +133,7 @@ return kelvin_top_->GetDisassembly(address); } -absl::Status KelvinRenode::LoadImage(const std::string &image_path, +absl::Status KelvinRenode::LoadImage(const std::string& image_path, uint64_t start_address) { return kelvin_top_->LoadImage(image_path, start_address); } @@ -163,15 +163,15 @@ } absl::Status KelvinRenode::GetRenodeRegisterInfo(int32_t index, int32_t max_len, - char *name, - RenodeCpuRegister &info) { - auto const ®ister_info = KelvinRenodeRegisterInfo::GetRenodeRegisterInfo(); + char* name, + RenodeCpuRegister& info) { + auto const& register_info = KelvinRenodeRegisterInfo::GetRenodeRegisterInfo(); if ((index < 0 || index >= register_info.size())) { return absl::OutOfRangeError( absl::StrCat("Register info index (", index, ") out of range")); } info = register_info[index]; - auto const ®_map = RiscVDebugInfo::Instance()->debug_register_map(); + auto const& reg_map = RiscVDebugInfo::Instance()->debug_register_map(); auto ptr = reg_map.find(info.index); if (ptr == reg_map.end()) { name[0] = '\0';
diff --git a/sim/renode/kelvin_renode.h b/sim/renode/kelvin_renode.h index 809651e..a672c39 100644 --- a/sim/renode/kelvin_renode.h +++ b/sim/renode/kelvin_renode.h
@@ -33,12 +33,12 @@ // class defines a global namespace function that is used by the renode wrapper // to create a top simulator instance. -extern kelvin::sim::renode::RenodeDebugInterface *CreateKelvinSim( +extern kelvin::sim::renode::RenodeDebugInterface* CreateKelvinSim( std::string name); -extern kelvin::sim::renode::RenodeDebugInterface *CreateKelvinSim( +extern kelvin::sim::renode::RenodeDebugInterface* CreateKelvinSim( std::string name, uint64_t memory_block_size_bytes, - uint64_t memory_size_bytes, uint8_t **block_ptr_list); + uint64_t memory_size_bytes, uint8_t** block_ptr_list); namespace kelvin::sim { @@ -50,7 +50,7 @@ explicit KelvinRenode(std::string name); explicit KelvinRenode(std::string name, uint64_t memory_block_size_bytes, - uint64_t memory_size_bytes, uint8_t **block_ptr_list); + uint64_t memory_size_bytes, uint8_t** block_ptr_list); ~KelvinRenode() override; @@ -72,18 +72,18 @@ // Returns the reason for the most recent halt. absl::StatusOr<HaltReasonValueType> GetLastHaltReason() override; // Read/write the named registers. - absl::StatusOr<uint64_t> ReadRegister(const std::string &name) override; - absl::Status WriteRegister(const std::string &name, uint64_t value) override; + absl::StatusOr<uint64_t> ReadRegister(const std::string& name) override; + absl::Status WriteRegister(const std::string& name, uint64_t value) override; // Read/write the numeric id registers. absl::StatusOr<uint64_t> ReadRegister(uint32_t reg_id) override; absl::Status WriteRegister(uint32_t reg_id, uint64_t value) override; - absl::StatusOr<mpact::sim::generic::DataBuffer *> GetRegisterDataBuffer( - const std::string &name) override; + absl::StatusOr<mpact::sim::generic::DataBuffer*> GetRegisterDataBuffer( + const std::string& name) override; // Read/write the buffers to memory. - absl::StatusOr<size_t> ReadMemory(uint64_t address, void *buf, + absl::StatusOr<size_t> ReadMemory(uint64_t address, void* buf, size_t length) override; - absl::StatusOr<size_t> WriteMemory(uint64_t address, const void *buf, + absl::StatusOr<size_t> WriteMemory(uint64_t address, const void* buf, size_t length) override; bool HasBreakpoint(uint64_t address) override; // Set/Clear software breakpoints at the given addresses. @@ -91,20 +91,20 @@ absl::Status ClearSwBreakpoint(uint64_t address) override; // Remove all software breakpoints. absl::Status ClearAllSwBreakpoints() override; - absl::StatusOr<mpact::sim::generic::Instruction *> GetInstruction( + absl::StatusOr<mpact::sim::generic::Instruction*> GetInstruction( uint64_t address) override; // Return the string representation for the instruction at the given address. absl::StatusOr<std::string> GetDisassembly(uint64_t address) override; // Return register information. int32_t GetRenodeRegisterInfoSize() const override; - absl::Status GetRenodeRegisterInfo(int32_t index, int32_t max_len, char *name, - RenodeCpuRegister &info) override; + absl::Status GetRenodeRegisterInfo(int32_t index, int32_t max_len, char* name, + RenodeCpuRegister& info) override; - absl::Status LoadImage(const std::string &image_path, + absl::Status LoadImage(const std::string& image_path, uint64_t start_address) override; private: - KelvinTop *kelvin_top_ = nullptr; + KelvinTop* kelvin_top_ = nullptr; }; } // namespace kelvin::sim
diff --git a/sim/renode/kelvin_renode_memory.cc b/sim/renode/kelvin_renode_memory.cc index 2d5c9c8..57a4004 100644 --- a/sim/renode/kelvin_renode_memory.cc +++ b/sim/renode/kelvin_renode_memory.cc
@@ -26,7 +26,7 @@ KelvinRenodeMemory::KelvinRenodeMemory(uint64_t block_size_bytes, uint64_t memory_size_bytes, - uint8_t **block_ptr_list, + uint8_t** block_ptr_list, uint64_t base_address, unsigned addressable_unit_size) : addressable_unit_size_(addressable_unit_size), @@ -49,13 +49,13 @@ return (address >= base_address_) && (high_address <= max_address_); } -void KelvinRenodeMemory::Load(uint64_t address, DataBuffer *db, - Instruction *inst, ReferenceCount *context) { +void KelvinRenodeMemory::Load(uint64_t address, DataBuffer* db, + Instruction* inst, ReferenceCount* context) { int size_in_units = db->size<uint8_t>() / addressable_unit_size_; uint64_t high = address + size_in_units; ABSL_HARDENING_ASSERT(IsValidAddress(address, high)); ABSL_HARDENING_ASSERT(size_in_units > 0); - uint8_t *byte_ptr = static_cast<uint8_t *>(db->raw_ptr()); + uint8_t* byte_ptr = static_cast<uint8_t*>(db->raw_ptr()); // Load the data into the data buffer. LoadStoreHelper(address, byte_ptr, size_in_units, true); // Execute the instruction to process and write back the load data. @@ -76,12 +76,12 @@ } } -void KelvinRenodeMemory::Load(DataBuffer *address_db, DataBuffer *mask_db, - int el_size, DataBuffer *db, Instruction *inst, - ReferenceCount *context) { +void KelvinRenodeMemory::Load(DataBuffer* address_db, DataBuffer* mask_db, + int el_size, DataBuffer* db, Instruction* inst, + ReferenceCount* context) { auto mask_span = mask_db->Get<bool>(); auto address_span = address_db->Get<uint64_t>(); - uint8_t *byte_ptr = static_cast<uint8_t *>(db->raw_ptr()); + uint8_t* byte_ptr = static_cast<uint8_t*>(db->raw_ptr()); int size_in_units = el_size / addressable_unit_size_; ABSL_HARDENING_ASSERT(size_in_units > 0); // This is either a gather load, or a unit stride load depending on size of @@ -112,20 +112,20 @@ } } -void KelvinRenodeMemory::Store(uint64_t address, DataBuffer *db) { +void KelvinRenodeMemory::Store(uint64_t address, DataBuffer* db) { int size_in_units = db->size<uint8_t>() / addressable_unit_size_; uint64_t high = address + size_in_units; ABSL_HARDENING_ASSERT(IsValidAddress(address, high)); ABSL_HARDENING_ASSERT(size_in_units > 0); - uint8_t *byte_ptr = static_cast<uint8_t *>(db->raw_ptr()); + uint8_t* byte_ptr = static_cast<uint8_t*>(db->raw_ptr()); LoadStoreHelper(address, byte_ptr, size_in_units, /*is_load*/ false); } -void KelvinRenodeMemory::Store(DataBuffer *address_db, DataBuffer *mask_db, - int el_size, DataBuffer *db) { +void KelvinRenodeMemory::Store(DataBuffer* address_db, DataBuffer* mask_db, + int el_size, DataBuffer* db) { auto mask_span = mask_db->Get<bool>(); auto address_span = address_db->Get<uint64_t>(); - uint8_t *byte_ptr = static_cast<uint8_t *>(db->raw_ptr()); + uint8_t* byte_ptr = static_cast<uint8_t*>(db->raw_ptr()); int size_in_units = el_size / addressable_unit_size_; ABSL_HARDENING_ASSERT(size_in_units > 0); // If the address_span.size() > 1, then this is a scatter store, otherwise @@ -142,14 +142,14 @@ } } -void KelvinRenodeMemory::LoadStoreHelper(uint64_t address, uint8_t *byte_ptr, +void KelvinRenodeMemory::LoadStoreHelper(uint64_t address, uint8_t* byte_ptr, int size_in_units, bool is_load) { ABSL_HARDENING_ASSERT(address < max_address_); do { // Find the block in the map. uint64_t block_idx = address / memory_block_size_bytes_; - uint8_t *block = block_map_[block_idx]; + uint8_t* block = block_map_[block_idx]; int block_unit_offset = (address - block_idx * memory_block_size_bytes_);
diff --git a/sim/renode/kelvin_renode_memory.h b/sim/renode/kelvin_renode_memory.h index ae26c5d..3ca98ba 100644 --- a/sim/renode/kelvin_renode_memory.h +++ b/sim/renode/kelvin_renode_memory.h
@@ -40,10 +40,10 @@ class KelvinRenodeMemory : public mpact::sim::util::MemoryInterface { public: KelvinRenodeMemory(uint64_t block_size_bytes, uint64_t memory_size_bytes, - uint8_t **block_ptr_list, uint64_t base_address, + uint8_t** block_ptr_list, uint64_t base_address, unsigned addressable_unit_size); KelvinRenodeMemory(uint64_t block_size_bytes, uint64_t memory_size_bytes, - uint8_t **block_ptr_list) + uint8_t** block_ptr_list) : KelvinRenodeMemory(block_size_bytes, memory_size_bytes, block_ptr_list, 0, 1) {} @@ -52,34 +52,34 @@ ~KelvinRenodeMemory() override = default; // Implementation of the MemoryInterface methods. - void Load(uint64_t address, DataBuffer *db, Instruction *inst, - ReferenceCount *context) override; + void Load(uint64_t address, DataBuffer* db, Instruction* inst, + ReferenceCount* context) override; - void Load(DataBuffer *address_db, DataBuffer *mask_db, int el_size, - DataBuffer *db, Instruction *inst, - ReferenceCount *context) override; + void Load(DataBuffer* address_db, DataBuffer* mask_db, int el_size, + DataBuffer* db, Instruction* inst, + ReferenceCount* context) override; // Convenience template function that calls the above function with the // element size as the sizeof() the template parameter type. template <typename T> - void Load(DataBuffer *address_db, DataBuffer *mask_db, DataBuffer *db, - Instruction *inst, ReferenceCount *context) { + void Load(DataBuffer* address_db, DataBuffer* mask_db, DataBuffer* db, + Instruction* inst, ReferenceCount* context) { Load(address_db, mask_db, sizeof(T), db, inst, context); } - void Store(uint64_t address, DataBuffer *db) override; - void Store(DataBuffer *address_db, DataBuffer *mask_db, int el_size, - DataBuffer *db) override; + void Store(uint64_t address, DataBuffer* db) override; + void Store(DataBuffer* address_db, DataBuffer* mask_db, int el_size, + DataBuffer* db) override; // Convenience template function that calls the above function with the // element size as the sizeof() the template parameter type. template <typename T> - void Store(DataBuffer *address_db, DataBuffer *mask_db, DataBuffer *db) { + void Store(DataBuffer* address_db, DataBuffer* mask_db, DataBuffer* db) { Store(address_db, mask_db, sizeof(T), db); } private: - void LoadStoreHelper(uint64_t address, uint8_t *byte_ptr, int size_in_units, + void LoadStoreHelper(uint64_t address, uint8_t* byte_ptr, int size_in_units, bool is_load); bool IsValidAddress(uint64_t address, uint64_t high_address); @@ -90,7 +90,7 @@ uint64_t base_address_; uint64_t max_address_; - std::vector<uint8_t *> block_map_; + std::vector<uint8_t*> block_map_; }; } // namespace kelvin::sim::renode
diff --git a/sim/renode/kelvin_renode_register_info.h b/sim/renode/kelvin_renode_register_info.h index b96cc68..aa0f676 100644 --- a/sim/renode/kelvin_renode_register_info.h +++ b/sim/renode/kelvin_renode_register_info.h
@@ -29,15 +29,15 @@ class KelvinRenodeRegisterInfo { public: using RenodeRegisterInfo = std::vector<renode::RenodeCpuRegister>; - static const RenodeRegisterInfo &GetRenodeRegisterInfo(); + static const RenodeRegisterInfo& GetRenodeRegisterInfo(); private: KelvinRenodeRegisterInfo(); - static KelvinRenodeRegisterInfo *Instance(); + static KelvinRenodeRegisterInfo* Instance(); void InitializeRenodeRegisterInfo(); - const RenodeRegisterInfo &GetRenodeRegisterInfoPrivate(); + const RenodeRegisterInfo& GetRenodeRegisterInfoPrivate(); - static KelvinRenodeRegisterInfo *instance_; + static KelvinRenodeRegisterInfo* instance_; RenodeRegisterInfo renode_register_info_; };
diff --git a/sim/renode/kelvin_renode_reigster_info.cc b/sim/renode/kelvin_renode_reigster_info.cc index 5359915..ad2b9f1 100644 --- a/sim/renode/kelvin_renode_reigster_info.cc +++ b/sim/renode/kelvin_renode_reigster_info.cc
@@ -20,7 +20,7 @@ using ::mpact::sim::generic::operator*; // NOLINT: used below (clange error). -KelvinRenodeRegisterInfo *KelvinRenodeRegisterInfo::instance_ = nullptr; +KelvinRenodeRegisterInfo* KelvinRenodeRegisterInfo::instance_ = nullptr; void KelvinRenodeRegisterInfo::InitializeRenodeRegisterInfo() { using DbgReg = mpact::sim::riscv::DebugRegisterEnum; @@ -50,19 +50,19 @@ InitializeRenodeRegisterInfo(); } -const KelvinRenodeRegisterInfo::RenodeRegisterInfo & +const KelvinRenodeRegisterInfo::RenodeRegisterInfo& KelvinRenodeRegisterInfo::GetRenodeRegisterInfo() { return Instance()->GetRenodeRegisterInfoPrivate(); } -KelvinRenodeRegisterInfo *KelvinRenodeRegisterInfo::Instance() { +KelvinRenodeRegisterInfo* KelvinRenodeRegisterInfo::Instance() { if (instance_ == nullptr) { instance_ = new KelvinRenodeRegisterInfo(); } return instance_; } -const KelvinRenodeRegisterInfo::RenodeRegisterInfo & +const KelvinRenodeRegisterInfo::RenodeRegisterInfo& KelvinRenodeRegisterInfo::GetRenodeRegisterInfoPrivate() { return renode_register_info_; }
diff --git a/sim/renode/renode_debug_interface.h b/sim/renode/renode_debug_interface.h index 3951222..fe44b80 100644 --- a/sim/renode/renode_debug_interface.h +++ b/sim/renode/renode_debug_interface.h
@@ -49,10 +49,10 @@ // Get register information. virtual int32_t GetRenodeRegisterInfoSize() const = 0; virtual absl::Status GetRenodeRegisterInfo(int32_t index, int32_t max_len, - char *name, - RenodeCpuRegister &info) = 0; + char* name, + RenodeCpuRegister& info) = 0; - virtual absl::Status LoadImage(const std::string &image_path, + virtual absl::Status LoadImage(const std::string& image_path, uint64_t start_address) = 0; };
diff --git a/sim/renode/renode_mpact.cc b/sim/renode/renode_mpact.cc index 1648dc2..9a82c03 100644 --- a/sim/renode/renode_mpact.cc +++ b/sim/renode/renode_mpact.cc
@@ -26,12 +26,12 @@ #include "mpact/sim/util/program_loader/elf_program_loader.h" // This function must be defined in the library. -extern kelvin::sim::renode::RenodeDebugInterface *CreateKelvinSim(std::string); +extern kelvin::sim::renode::RenodeDebugInterface* CreateKelvinSim(std::string); -extern kelvin::sim::renode::RenodeDebugInterface *CreateKelvinSim(std::string, +extern kelvin::sim::renode::RenodeDebugInterface* CreateKelvinSim(std::string, uint64_t, uint64_t, - uint8_t **); + uint8_t**); // External "C" functions visible to Renode. using kelvin::sim::renode::RenodeAgent; @@ -46,7 +46,7 @@ int32_t construct_with_memory(int32_t max_name_length, uint64_t memory_block_size_bytes, uint64_t memory_size_bytes, - uint8_t **mem_block_ptr_list) { + uint8_t** mem_block_ptr_list) { return RenodeAgent::Instance()->Construct( max_name_length, memory_block_size_bytes, memory_size_bytes, mem_block_ptr_list); @@ -57,48 +57,48 @@ int32_t get_reg_info_size(int32_t id) { return RenodeAgent::Instance()->GetRegisterInfoSize(id); } -int32_t get_reg_info(int32_t id, int32_t index, char *name, void *info) { +int32_t get_reg_info(int32_t id, int32_t index, char* name, void* info) { if (info == nullptr) return -1; return RenodeAgent::Instance()->GetRegisterInfo( - id, index, name, static_cast<RenodeCpuRegister *>(info)); + id, index, name, static_cast<RenodeCpuRegister*>(info)); } -uint64_t load_executable(int32_t id, const char *elf_file_name, - int32_t *status) { +uint64_t load_executable(int32_t id, const char* elf_file_name, + int32_t* status) { return RenodeAgent::Instance()->LoadExecutable(id, elf_file_name, status); } -int32_t load_image(int32_t id, const char *file_name, uint64_t address) { +int32_t load_image(int32_t id, const char* file_name, uint64_t address) { return RenodeAgent::Instance()->LoadImage(id, file_name, address); } -int32_t read_register(int32_t id, uint32_t reg_id, uint64_t *value) { +int32_t read_register(int32_t id, uint32_t reg_id, uint64_t* value) { return RenodeAgent::Instance()->ReadRegister(id, reg_id, value); } int32_t write_register(int32_t id, uint32_t reg_id, uint64_t value) { return RenodeAgent::Instance()->WriteRegister(id, reg_id, value); } -uint64_t read_memory(int32_t id, uint64_t address, char *buffer, +uint64_t read_memory(int32_t id, uint64_t address, char* buffer, uint64_t length) { return RenodeAgent::Instance()->ReadMemory(id, address, buffer, length); } -uint64_t write_memory(int32_t id, uint64_t address, const char *buffer, +uint64_t write_memory(int32_t id, uint64_t address, const char* buffer, uint64_t length) { return RenodeAgent::Instance()->WriteMemory(id, address, buffer, length); } -uint64_t step(int32_t id, uint64_t num_to_step, int32_t *status) { +uint64_t step(int32_t id, uint64_t num_to_step, int32_t* status) { return RenodeAgent::Instance()->Step(id, num_to_step, status); } -int32_t halt(int32_t id, int32_t *status) { +int32_t halt(int32_t id, int32_t* status) { return RenodeAgent::Instance()->Halt(id, status); } namespace kelvin::sim::renode { -RenodeAgent *RenodeAgent::instance_ = nullptr; +RenodeAgent* RenodeAgent::instance_ = nullptr; uint32_t RenodeAgent::count_ = 0; // Create the debug instance by calling the factory function. int32_t RenodeAgent::Construct(int32_t max_name_length) { std::string name = absl::StrCat("renode", count_); - auto *dbg = CreateKelvinSim(name); + auto* dbg = CreateKelvinSim(name); if (dbg == nullptr) { return -1; } @@ -110,9 +110,9 @@ int32_t RenodeAgent::Construct(int32_t max_name_length, uint64_t memory_block_size_bytes, uint64_t memory_size_bytes, - uint8_t **mem_block_ptr_list) { + uint8_t** mem_block_ptr_list) { std::string name = absl::StrCat("renode", count_); - auto *dbg = CreateKelvinSim(name, memory_block_size_bytes, memory_size_bytes, + auto* dbg = CreateKelvinSim(name, memory_block_size_bytes, memory_size_bytes, mem_block_ptr_list); if (dbg == nullptr) { return -1; @@ -144,17 +144,17 @@ // Check for valid instance. auto dbg_iter = core_dbg_instances_.find(id); if (dbg_iter == core_dbg_instances_.end()) return -1; - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; return dbg->GetRenodeRegisterInfoSize(); } -int32_t RenodeAgent::GetRegisterInfo(int32_t id, int32_t index, char *name, - RenodeCpuRegister *info) { +int32_t RenodeAgent::GetRegisterInfo(int32_t id, int32_t index, char* name, + RenodeCpuRegister* info) { // Check for valid instance. if (info == nullptr) return -1; auto dbg_iter = core_dbg_instances_.find(id); if (dbg_iter == core_dbg_instances_.end()) return -1; - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; int32_t max_len = name_length_map_.at(id); auto result = dbg->GetRenodeRegisterInfo(index, max_len, name, *info); if (!result.ok()) return -1; @@ -163,13 +163,13 @@ // Read the register given by the id. int32_t RenodeAgent::ReadRegister(int32_t id, uint32_t reg_id, - uint64_t *value) { + uint64_t* value) { // Check for valid instance. if (value == nullptr) return -1; auto dbg_iter = core_dbg_instances_.find(id); if (dbg_iter == core_dbg_instances_.end()) return -1; // Read register. - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; auto result = dbg->ReadRegister(reg_id); if (!result.ok()) return -1; *value = result.value(); @@ -182,13 +182,13 @@ auto dbg_iter = core_dbg_instances_.find(id); if (dbg_iter == core_dbg_instances_.end()) return -1; // Write register. - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; auto result = dbg->WriteRegister(reg_id, value); if (!result.ok()) return -1; return 0; } -uint64_t RenodeAgent::ReadMemory(int32_t id, uint64_t address, char *buffer, +uint64_t RenodeAgent::ReadMemory(int32_t id, uint64_t address, char* buffer, uint64_t length) { // Check for valid desktop. auto dbg_iter = core_dbg_instances_.find(id); @@ -196,28 +196,28 @@ LOG(ERROR) << "No such core dbg instance: " << id; return 0; } - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; auto res = dbg->ReadMemory(address, buffer, length); if (!res.ok()) return 0; return res.value(); } uint64_t RenodeAgent::WriteMemory(int32_t id, uint64_t address, - const char *buffer, uint64_t length) { + const char* buffer, uint64_t length) { // Check for valid desktop. auto dbg_iter = core_dbg_instances_.find(id); if (dbg_iter == core_dbg_instances_.end()) { LOG(ERROR) << "No such core dbg instance: " << id; return 0; } - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; auto res = dbg->WriteMemory(address, buffer, length); if (!res.ok()) return 0; return res.value(); } -uint64_t RenodeAgent::LoadExecutable(int32_t id, const char *file_name, - int32_t *status) { +uint64_t RenodeAgent::LoadExecutable(int32_t id, const char* file_name, + int32_t* status) { // Check for valid desktop. auto dbg_iter = core_dbg_instances_.find(id); if (dbg_iter == core_dbg_instances_.end()) { @@ -226,7 +226,7 @@ return 0; } // Instantiate loader and try to load the file. - auto *dbg = dbg_iter->second; + auto* dbg = dbg_iter->second; mpact::sim::util::ElfProgramLoader loader(dbg); auto load_res = loader.LoadProgram(file_name); if (!load_res.ok()) { @@ -244,7 +244,7 @@ return entry; } -int32_t RenodeAgent::LoadImage(int32_t id, const char *file_name, +int32_t RenodeAgent::LoadImage(int32_t id, const char* file_name, uint64_t address) { // Get the debug interface. auto dbg_iter = core_dbg_instances_.find(id); @@ -252,8 +252,8 @@ LOG(ERROR) << "No such core dbg instance: " << id; return -1; } - auto *dbg = dbg_iter->second; - auto res = dbg->LoadImage(std::string(file_name), address); + auto* dbg = dbg_iter->second; + auto res = dbg->LoadImage(file_name, address); if (!res.ok()) { LOG(ERROR) << "Failed to load image: " << res.message(); return -1; @@ -261,14 +261,14 @@ return 0; } -uint64_t RenodeAgent::Step(int32_t id, uint64_t num_to_step, int32_t *status) { +uint64_t RenodeAgent::Step(int32_t id, uint64_t num_to_step, int32_t* status) { // Set the default execution status if (status != nullptr) { *status = static_cast<int32_t>(ExecutionResult::kAborted); } // Get the core debug if object. - auto *dbg = RenodeAgent::Instance()->core_dbg(id); + auto* dbg = RenodeAgent::Instance()->core_dbg(id); // Is the debug interface valid? if (dbg == nullptr) { return 0; @@ -358,9 +358,9 @@ } // Signal the simulator to halt. -int32_t RenodeAgent::Halt(int32_t id, int32_t *status) { +int32_t RenodeAgent::Halt(int32_t id, int32_t* status) { // Get the core debug if object. - auto *dbg = RenodeAgent::Instance()->core_dbg(id); + auto* dbg = RenodeAgent::Instance()->core_dbg(id); // Is the debug interface valid? if (dbg == nullptr) { return -1;
diff --git a/sim/renode/renode_mpact.h b/sim/renode/renode_mpact.h index 756c4d8..617929f 100644 --- a/sim/renode/renode_mpact.h +++ b/sim/renode/renode_mpact.h
@@ -37,7 +37,7 @@ int32_t construct_with_memory(int32_t max_name_length, uint64_t memory_block_size_bytes, uint64_t memory_size_bytes, - uint8_t **mem_block_ptr_list); + uint8_t** mem_block_ptr_list); // Destruct the given debug instance. A negative return value indicates an // error. int32_t destruct(int32_t id); @@ -45,31 +45,31 @@ int32_t get_reg_info_size(int32_t id); // Return the register entry with the given index. The info pointer should // store an object of type RenodeCpuRegister. -int32_t get_reg_info(int32_t id, int32_t index, char *name, void *info); +int32_t get_reg_info(int32_t id, int32_t index, char* name, void* info); // Load the given executable into the instance with the given id. Return the // entry point. -uint64_t load_executable(int32_t id, const char *elf_file_name, - int32_t *status); +uint64_t load_executable(int32_t id, const char* elf_file_name, + int32_t* status); // Load the content of the given file into memory, starting at the given // address. -int32_t load_image(int32_t id, const char *file_name, uint64_t address); +int32_t load_image(int32_t id, const char* file_name, uint64_t address); // Read register reg_id in the instance id, store the value in the pointer // given. A return value < 0 is an error. -int32_t read_register(int32_t id, uint32_t reg_id, uint64_t *value); +int32_t read_register(int32_t id, uint32_t reg_id, uint64_t* value); // Write register reg_id in the instance id. A return value < 0 is an error. int32_t write_register(int32_t id, uint32_t reg_id, uint64_t value); -uint64_t read_memory(int32_t id, uint64_t address, char *buffer, +uint64_t read_memory(int32_t id, uint64_t address, char* buffer, uint64_t length); -uint64_t write_memory(int32_t id, uint64_t address, const char *buffer, +uint64_t write_memory(int32_t id, uint64_t address, const char* buffer, uint64_t length); // Reset the instance. A return value < 0 is an error. int32_t reset(int32_t id); // Step the instance id by num_to_step instructions. Return the number of // instructions stepped. The status is written to the pointer *status. -uint64_t step(int32_t id, uint64_t num_to_step, int32_t *status); +uint64_t step(int32_t id, uint64_t num_to_step, int32_t* status); // Halt a free running simulator. -int32_t halt(int32_t id, int32_t *status); +int32_t halt(int32_t id, int32_t* status); } namespace kelvin::sim::renode { @@ -91,7 +91,7 @@ using RenodeCpuRegister = kelvin::sim::renode::RenodeCpuRegister; constexpr static size_t kBufferSize = 64 * 1024; // This is a singleton class, so need a static Instance method. - static RenodeAgent *Instance() { + static RenodeAgent* Instance() { if (instance_ != nullptr) return instance_; instance_ = new RenodeAgent(); return instance_; @@ -99,35 +99,35 @@ // These methods correspond to the C methods defined above. int32_t Construct(int32_t max_name_length); int32_t Construct(int32_t max_name_length, uint64_t memory_block_size_bytes, - uint64_t memory_size_bytes, uint8_t **mem_block_ptr_list); + uint64_t memory_size_bytes, uint8_t** mem_block_ptr_list); int32_t Destroy(int32_t id); int32_t Reset(int32_t id); int32_t GetRegisterInfoSize(int32_t id) const; - int32_t GetRegisterInfo(int32_t id, int32_t index, char *name, - RenodeCpuRegister *info); - int32_t ReadRegister(int32_t id, uint32_t reg_id, uint64_t *value); + int32_t GetRegisterInfo(int32_t id, int32_t index, char* name, + RenodeCpuRegister* info); + int32_t ReadRegister(int32_t id, uint32_t reg_id, uint64_t* value); int32_t WriteRegister(int32_t id, uint32_t reg_id, uint64_t value); - uint64_t ReadMemory(int32_t id, uint64_t address, char *buffer, + uint64_t ReadMemory(int32_t id, uint64_t address, char* buffer, uint64_t length); - uint64_t WriteMemory(int32_t id, uint64_t address, const char *buffer, + uint64_t WriteMemory(int32_t id, uint64_t address, const char* buffer, uint64_t length); - uint64_t LoadExecutable(int32_t id, const char *elf_file_name, - int32_t *status); - int32_t LoadImage(int32_t id, const char *file_name, uint64_t address); - uint64_t Step(int32_t id, uint64_t num_to_step, int32_t *status); - int32_t Halt(int32_t id, int32_t *status); + uint64_t LoadExecutable(int32_t id, const char* elf_file_name, + int32_t* status); + int32_t LoadImage(int32_t id, const char* file_name, uint64_t address); + uint64_t Step(int32_t id, uint64_t num_to_step, int32_t* status); + int32_t Halt(int32_t id, int32_t* status); // Accessor. - kelvin::sim::renode::RenodeDebugInterface *core_dbg(int32_t id) const { + kelvin::sim::renode::RenodeDebugInterface* core_dbg(int32_t id) const { auto ptr = core_dbg_instances_.find(id); if (ptr != core_dbg_instances_.end()) return ptr->second; return nullptr; } private: - static RenodeAgent *instance_; + static RenodeAgent* instance_; static uint32_t count_; RenodeAgent() = default; - absl::flat_hash_map<uint32_t, kelvin::sim::renode::RenodeDebugInterface *> + absl::flat_hash_map<uint32_t, kelvin::sim::renode::RenodeDebugInterface*> core_dbg_instances_; absl::flat_hash_map<uint32_t, int32_t> name_length_map_; };
diff --git a/sim/renode/test/BUILD b/sim/renode/test/BUILD index ae3b053..0e45fa0 100644 --- a/sim/renode/test/BUILD +++ b/sim/renode/test/BUILD
@@ -15,6 +15,8 @@ # This project contains a small set of tests to test the functionality of # the MPACT-Sim/Renode interface. + + cc_test( name = "renode_mpact_test", size = "small",
diff --git a/sim/renode/test/kelvin_renode_test.cc b/sim/renode/test/kelvin_renode_test.cc index 8b15f4b..f267021 100644 --- a/sim/renode/test/kelvin_renode_test.cc +++ b/sim/renode/test/kelvin_renode_test.cc
@@ -47,7 +47,7 @@ ~KelvinRenodeTest() override { delete top_; } - RenodeDebugInterface *top_ = nullptr; + RenodeDebugInterface* top_ = nullptr; }; // Test the implementation of the added methods in the RenodeDebugInterface. @@ -74,7 +74,7 @@ TEST_F(KelvinRenodeTest, RunElfProgram) { std::string file_name = absl::StrCat(kDepotPath, "testfiles/", kFileName); // Load the program. - auto *loader = new mpact::sim::util::ElfProgramLoader(top_); + auto* loader = new mpact::sim::util::ElfProgramLoader(top_); auto result = loader->LoadProgram(file_name); CHECK_OK(result); auto entry_point = result.value(); @@ -98,7 +98,7 @@ std::string file_name = absl::StrCat(kDepotPath, "testfiles/", kEbreakFileName); // Load the program. - auto *loader = new mpact::sim::util::ElfProgramLoader(top_); + auto* loader = new mpact::sim::util::ElfProgramLoader(top_); auto result = loader->LoadProgram(file_name); CHECK_OK(result); auto entry_point = result.value(); @@ -151,7 +151,7 @@ // Setup the external memory. constexpr uint64_t kMemoryBlockSize = 0x40000; // 256KB constexpr uint64_t kNumBlock = 16; // 4MB / 256KB - uint8_t *memory_block[kNumBlock] = {nullptr}; + uint8_t* memory_block[kNumBlock] = {nullptr}; // Allocate memory blocks. for (int i = 0; i < kNumBlock; ++i) { memory_block[i] = new uint8_t[kMemoryBlockSize];
diff --git a/sim/renode/test/renode_mpact_test.cc b/sim/renode/test/renode_mpact_test.cc index ad5ffad..7ec5224 100644 --- a/sim/renode/test/renode_mpact_test.cc +++ b/sim/renode/test/renode_mpact_test.cc
@@ -119,23 +119,23 @@ TEST_F(RenodeMpactTest, ReadWriteMem) { constexpr uint8_t kBytes[] = {0x01, 0x02, 0x03, 0x04, 0xff, 0xfe, 0xfd, 0xfc}; int res = - write_memory(sim_id_, 0x100, reinterpret_cast<const char *>(kBytes), 8); + write_memory(sim_id_, 0x100, reinterpret_cast<const char*>(kBytes), 8); EXPECT_EQ(res, 8); uint8_t mem_bytes[8] = {0xde, 0xad, 0xbe, 0xef, 0x5a, 0xa5, 0xff, 0x00}; - res = read_memory(sim_id_, 0x104, reinterpret_cast<char *>(mem_bytes), 1); + res = read_memory(sim_id_, 0x104, reinterpret_cast<char*>(mem_bytes), 1); EXPECT_EQ(res, 1); EXPECT_EQ(mem_bytes[0], kBytes[4]); - res = read_memory(sim_id_, 0x100, reinterpret_cast<char *>(mem_bytes), 8); + res = read_memory(sim_id_, 0x100, reinterpret_cast<char*>(mem_bytes), 8); for (int i = 0; i < 8; i++) EXPECT_EQ(kBytes[i], mem_bytes[i]); // Read memory from out of bound address constexpr uint64_t kOutOfBoundAddress = 0x3'FFFF'FFFFULL; res = read_memory(sim_id_, kOutOfBoundAddress, - reinterpret_cast<char *>(mem_bytes), 1); + reinterpret_cast<char*>(mem_bytes), 1); EXPECT_EQ(res, 0); // Write to out of bound memory address res = write_memory(sim_id_, kOutOfBoundAddress, - reinterpret_cast<const char *>(mem_bytes), 1); + reinterpret_cast<const char*>(mem_bytes), 1); EXPECT_EQ(res, 0); } @@ -266,7 +266,7 @@ // Setup the external memory. constexpr uint64_t kMemoryBlockSize = 0x40000; // 256KB constexpr uint64_t kNumBlock = 16; // 4MB / 256KB - uint8_t *memory_block[kNumBlock] = {nullptr}; + uint8_t* memory_block[kNumBlock] = {nullptr}; // Allocate memory blocks. for (int i = 0; i < kNumBlock; ++i) { memory_block[i] = new uint8_t[kMemoryBlockSize];
diff --git a/sim/test/BUILD b/sim/test/BUILD index efcca3b..f966a87 100644 --- a/sim/test/BUILD +++ b/sim/test/BUILD
@@ -14,6 +14,9 @@ # Unit tests for kelvin simulator. + + + exports_files( srcs = [ "testfiles/hello_world_mpause.bin", @@ -201,3 +204,12 @@ "@com_google_mpact-sim//mpact/sim/generic:instruction", ], ) + +cc_test( + name = "kelvin_cosim_dpi_wrapper_test", + srcs = ["kelvin_cosim_dpi_wrapper_test.cc"], + deps = [ + "//sim/cosim:kelvin_cosim_lib", + "@com_google_googletest//:gtest_main", + ], +)
diff --git a/sim/test/kelvin_cosim_dpi_wrapper_test.cc b/sim/test/kelvin_cosim_dpi_wrapper_test.cc new file mode 100644 index 0000000..0c5fca5 --- /dev/null +++ b/sim/test/kelvin_cosim_dpi_wrapper_test.cc
@@ -0,0 +1,66 @@ +#include <cstdint> + +#include "sim/cosim/kelvin_cosim_dpi.h" +#include "googletest/include/gtest/gtest.h" +#include "external/svdpi_h_file/file/svdpi.h" + +namespace { + +const uint32_t kLoadImmediateToX5 = 0b11011110101011011011'00101'0110111; +const uint32_t kAddImmediateToX5_2047 = 0b011111111111'00101'000'00101'0010011; +const uint32_t kAddImmediateToX5_1776 = 0b011011110000'00101'000'00101'0010011; +const uint32_t kExpectedX5Value = 0xdeadbeef; +const uint32_t kNopInstruction = 0x00000013; // x0 = x0 + 0 (nop) +const uint32_t kMcycleCsrAddress = 0xb00; + +class CosimFixture : public ::testing::Test { + public: + CosimFixture() { mpact_init(); } + ~CosimFixture() override { mpact_fini(); } +}; + +TEST_F(CosimFixture, Step) { + svLogicVecVal instruction; + instruction.aval = 0x00000000; + EXPECT_EQ(mpact_step(&instruction), 0); +} + +TEST_F(CosimFixture, GetPc) { EXPECT_EQ(mpact_get_pc(), 0); } + +TEST_F(CosimFixture, GetPcAfterStep) { + svLogicVecVal instruction; + instruction.aval = kNopInstruction; + EXPECT_EQ(mpact_step(&instruction), 0); + EXPECT_EQ(mpact_get_pc(), 4); +} + +TEST_F(CosimFixture, GetPcAfterReset) { + svLogicVecVal instruction; + instruction.aval = kNopInstruction; // x0 = x0 + 0 (nop) + EXPECT_EQ(mpact_step(&instruction), 0); + EXPECT_NE(mpact_get_pc(), 0); + EXPECT_EQ(mpact_reset(), 0); + EXPECT_EQ(mpact_get_pc(), 0); +} + +TEST_F(CosimFixture, CheckGpr) { + EXPECT_EQ(mpact_get_gpr(5), 0); + svLogicVecVal instruction; + instruction.aval = kLoadImmediateToX5; + EXPECT_EQ(mpact_step(&instruction), 0); + instruction.aval = kAddImmediateToX5_2047; + EXPECT_EQ(mpact_step(&instruction), 0); + instruction.aval = kAddImmediateToX5_1776; + EXPECT_EQ(mpact_step(&instruction), 0); + EXPECT_EQ(mpact_get_gpr(5), kExpectedX5Value); +} + +TEST_F(CosimFixture, GetMcycleCsr) { + EXPECT_EQ(mpact_get_csr(kMcycleCsrAddress), 0); + svLogicVecVal instruction; + instruction.aval = kNopInstruction; // x0 = x0 + 0 (nop) + EXPECT_EQ(mpact_step(&instruction), 0); + EXPECT_EQ(mpact_get_csr(kMcycleCsrAddress), 1); +} + +} // namespace
diff --git a/sim/test/kelvin_decoder_test.cc b/sim/test/kelvin_decoder_test.cc index d719f8b..a68365b 100644 --- a/sim/test/kelvin_decoder_test.cc +++ b/sim/test/kelvin_decoder_test.cc
@@ -55,7 +55,7 @@ auto result = loader_.LoadProgram(input_file); CHECK_OK(result.status()); elf_reader_.load(input_file); - auto *symtab = elf_reader_.sections[".symtab"]; + auto* symtab = elf_reader_.sections[".symtab"]; CHECK_NE(symtab, nullptr); symbol_accessor_ = new SymbolAccessor(elf_reader_, symtab); } @@ -67,7 +67,7 @@ kelvin::sim::KelvinState state_; mpact::sim::util::ElfProgramLoader loader_; kelvin::sim::KelvinDecoder decoder_; - SymbolAccessor *symbol_accessor_; + SymbolAccessor* symbol_accessor_; }; // This test is really pretty simple. It decodes the instructions in "main". @@ -88,15 +88,15 @@ while (address < value + size) { LOG(INFO) << "Address: " << std::hex << address; EXPECT_FALSE(state_.program_error_controller()->HasError()); - auto *inst = decoder_.DecodeInstruction(address); + auto* inst = decoder_.DecodeInstruction(address); ASSERT_NE(inst, nullptr); inst->Execute(nullptr); if (state_.program_error_controller()->HasError()) { auto errvec = state_.program_error_controller()->GetUnmaskedErrorNames(); - for (auto &err : errvec) { + for (auto& err : errvec) { LOG(INFO) << "Error: " << err; auto msgvec = state_.program_error_controller()->GetErrorMessages(err); - for (auto &msg : msgvec) { + for (auto& msg : msgvec) { LOG(INFO) << " " << msg; } } @@ -111,7 +111,7 @@ // Even with a bad address, a valid instruction object should be returned. TEST_F(KelvinDecoderTest, BadAddress) { - auto *inst = decoder_.DecodeInstruction(0x4321); + auto* inst = decoder_.DecodeInstruction(0x4321); ASSERT_NE(inst, nullptr); inst->Execute(nullptr); inst->DecRef();
diff --git a/sim/test/kelvin_encoding_test.cc b/sim/test/kelvin_encoding_test.cc index 8200b90..683efa3 100644 --- a/sim/test/kelvin_encoding_test.cc +++ b/sim/test/kelvin_encoding_test.cc
@@ -153,24 +153,24 @@ } template <typename T> - T *EncodeOpHelper(uint32_t inst_word, OpcodeEnum opcode, std::any op) const { + T* EncodeOpHelper(uint32_t inst_word, OpcodeEnum opcode, std::any op) const { enc_->ParseInstruction(inst_word); EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), opcode); if (std::is_same<T, RV32SourceOperand>::value || std::is_same<T, RV32VectorSourceOperand>::value) { - auto *source = enc_->GetSource(SlotEnum::kKelvin, 0, opcode, + auto* source = enc_->GetSource(SlotEnum::kKelvin, 0, opcode, std::any_cast<SourceOpEnum>(op), 0); - return reinterpret_cast<T *>(source); + return reinterpret_cast<T*>(source); } - auto *dest = enc_->GetDestination(SlotEnum::kKelvin, 0, opcode, + auto* dest = enc_->GetDestination(SlotEnum::kKelvin, 0, opcode, std::any_cast<DestOpEnum>(op), 0, /*latency=*/0); - return reinterpret_cast<T *>(dest); + return reinterpret_cast<T*>(dest); } - FlatDemandMemory *memory_; - KelvinState *state_; - KelvinEncoding *enc_; + FlatDemandMemory* memory_; + KelvinState* state_; + KelvinEncoding* enc_; }; constexpr int kRdValue = 1; @@ -422,18 +422,18 @@ TEST_F(KelvinEncodingTest, NoSourceDest) { enc_->ParseInstruction(kVld); - auto *src = enc_->GetSource(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, + auto* src = enc_->GetSource(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, SourceOpEnum::kNone, 0); EXPECT_EQ(src, nullptr); - auto *src_op = enc_->GetSource(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, + auto* src_op = enc_->GetSource(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, SourceOpEnum::kPastMaxValue, 0); EXPECT_EQ(src_op, nullptr); - auto *dest = enc_->GetDestination(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, + auto* dest = enc_->GetDestination(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, DestOpEnum::kNone, 0, /*latency=*/0); EXPECT_EQ(dest, nullptr); - auto *dest_op = + auto* dest_op = enc_->GetDestination(SlotEnum::kKelvin, 0, OpcodeEnum::kVldBX, DestOpEnum::kPastMaxValue, 0, /*latency=*/0); EXPECT_EQ(dest_op, nullptr); @@ -445,7 +445,7 @@ enc_->ParseInstruction(SetSz(SetRs1(kVld, kRdValue), 0b1)); EXPECT_EQ(enc_->GetOpcode(SlotEnum::kKelvin, 0), OpcodeEnum::kVldHX); // Test vld.b.x (x = x0) - auto *src = EncodeOpHelper<RV32SourceOperand>(kVld, OpcodeEnum::kVldBX, + auto* src = EncodeOpHelper<RV32SourceOperand>(kVld, OpcodeEnum::kVldBX, SourceOpEnum::kVs1); EXPECT_EQ(src->AsString(), "zero"); delete src; @@ -468,13 +468,13 @@ TEST_F(KelvinEncodingTest, KelvinVstEncodeXs1Xs2Vd) { constexpr uint32_t kVstBase = 0b001000'000000'000000'00'000000'0'111'11; // Test vd in vst.b.x as source - auto *v_src = EncodeOpHelper<RV32VectorSourceOperand>( + auto* v_src = EncodeOpHelper<RV32VectorSourceOperand>( SetRs1(kVstBase, kRdValue), OpcodeEnum::kVstBX, SourceOpEnum::kVd); EXPECT_EQ(v_src->AsString(), "v0"); delete v_src; // Test xs1 as x0 - auto *dest = EncodeOpHelper<RV32DestOperand>(kVstBase, OpcodeEnum::kVstBX, + auto* dest = EncodeOpHelper<RV32DestOperand>(kVstBase, OpcodeEnum::kVstBX, DestOpEnum::kVs1); EXPECT_EQ(dest->AsString(), "zero"); delete dest; @@ -488,7 +488,7 @@ delete dest; // Test xs2 in vstq.b.s.xx as source - auto *src = EncodeOpHelper<RV32SourceOperand>( + auto* src = EncodeOpHelper<RV32SourceOperand>( SetRs1(kVstBase, kRdValue) | (1 << 30 /* vstq */) | (0b10 << 20 /* xs2 */) | (1 << 27 /* stride */), OpcodeEnum::kVstqBSXx, SourceOpEnum::kVs2); @@ -498,7 +498,7 @@ TEST_F(KelvinEncodingTest, KelvinWideningVs1) { constexpr uint32_t kVSransBase = 0b010000'000001'000000'00'001000'0'010'00; - auto *v_src = EncodeOpHelper<RV32VectorSourceOperand>( + auto* v_src = EncodeOpHelper<RV32VectorSourceOperand>( kVSransBase, OpcodeEnum::kVsransBVv, SourceOpEnum::kVs1); EXPECT_EQ(v_src->size(), 2); delete v_src; @@ -587,7 +587,7 @@ TEST_F(KelvinEncodingTest, KelvinWideningVd) { // No widening for vld - auto *v_dest = EncodeOpHelper<RV32VectorDestOperand>( + auto* v_dest = EncodeOpHelper<RV32VectorDestOperand>( SetRs1(kVld, kRdValue), OpcodeEnum::kVldBX, DestOpEnum::kVd); EXPECT_EQ(v_dest->size(), 1); delete v_dest; @@ -683,7 +683,7 @@ } TEST_F(KelvinEncodingTest, KelvinEncodeVs3) { - auto *v_src = EncodeOpHelper<RV32VectorSourceOperand>( + auto* v_src = EncodeOpHelper<RV32VectorSourceOperand>( kAconvBase, OpcodeEnum::kAconvVxv, SourceOpEnum::kVs3); EXPECT_EQ(v_src->AsString(), "v8"); EXPECT_EQ(v_src->size(), 8); @@ -691,13 +691,13 @@ } TEST_F(KelvinEncodingTest, KelvinEncodeVs2) { - auto *v_src = EncodeOpHelper<RV32VectorSourceOperand>( + auto* v_src = EncodeOpHelper<RV32VectorSourceOperand>( kVAddBase, OpcodeEnum::kVaddBVv, SourceOpEnum::kVs2); EXPECT_EQ(v_src->size(), 1); EXPECT_EQ(v_src->AsString(), "v0"); delete v_src; - auto *src = EncodeOpHelper<RV32SourceOperand>( + auto* src = EncodeOpHelper<RV32SourceOperand>( kVAddBase | 0b10, OpcodeEnum::kVaddBVx, SourceOpEnum::kVs2); EXPECT_EQ(src->AsString(), "zero"); delete src;
diff --git a/sim/test/kelvin_log_instructions_test.cc b/sim/test/kelvin_log_instructions_test.cc index fa3f842..e43e89e 100644 --- a/sim/test/kelvin_log_instructions_test.cc +++ b/sim/test/kelvin_log_instructions_test.cc
@@ -40,7 +40,7 @@ constexpr char kHelloString[] = "Hello World!\n"; // Initialize memory. - auto *db = state_->db_factory()->Allocate<char>(sizeof(kHelloString)); + auto* db = state_->db_factory()->Allocate<char>(sizeof(kHelloString)); for (int i = 0; i < sizeof(kHelloString); ++i) { db->Set<char>(i, kHelloString[i]); } @@ -65,7 +65,7 @@ constexpr uint32_t kPrintNum = 2200000000; // a number > INT32_MAX // Initialize memory. - auto *db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); + auto* db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); for (int i = 0; i < sizeof(kFormatString); ++i) { db->Set<char>(i, kFormatString[i]); } @@ -102,7 +102,7 @@ constexpr int32_t kPrintNum = -1337; // Initialize memory. - auto *db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); + auto* db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); for (int i = 0; i < sizeof(kFormatString); ++i) { db->Set<char>(i, kFormatString[i]); } @@ -139,7 +139,7 @@ constexpr uint32_t kCharStream[] = {0x6c6c6548, 0x0000006f}; // "Hello" // Initialize memory. - auto *db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); + auto* db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); for (int i = 0; i < sizeof(kFormatString); ++i) { db->Set<char>(i, kFormatString[i]); } @@ -179,7 +179,7 @@ constexpr uint32_t kPrintNum = 0xbaddecaf; // Initialize memory. - auto *db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); + auto* db = state_->db_factory()->Allocate<char>(sizeof(kFormatString)); for (int i = 0; i < sizeof(kFormatString); ++i) { db->Set<char>(i, kFormatString[i]); } @@ -189,7 +189,7 @@ CreateInstruction(), CreateInstruction(), CreateInstruction()}; // Also store the kCharStream elsewhere in the memory. - auto *str_db = state_->db_factory()->Allocate<uint32_t>(sizeof(1)); + auto* str_db = state_->db_factory()->Allocate<uint32_t>(sizeof(1)); str_db->Set<uint32_t>(0, kCharStream); str_db->DecRef();
diff --git a/sim/test/kelvin_top_test.cc b/sim/test/kelvin_top_test.cc index 3d9a956..e4595b8 100644 --- a/sim/test/kelvin_top_test.cc +++ b/sim/test/kelvin_top_test.cc
@@ -85,9 +85,9 @@ } uint32_t entry_point_; - KelvinTop *kelvin_top_ = nullptr; - ElfProgramLoader *loader_ = nullptr; - FlatDemandMemory *memory_ = nullptr; + KelvinTop* kelvin_top_ = nullptr; + ElfProgramLoader* loader_ = nullptr; + FlatDemandMemory* memory_ = nullptr; }; // Check the max memory size @@ -435,7 +435,7 @@ EXPECT_EQ(kelvin_top_->WriteRegister("x32", word_value).code(), absl::StatusCode::kNotFound); // Aliases. - for (auto &[name, alias] : {std::tuple<std::string, std::string>{"x1", "ra"}, + for (auto& [name, alias] : {std::tuple<std::string, std::string>{"x1", "ra"}, {"x4", "tp"}, {"x8", "s0"}}) { uint32_t write_value = 0xba5eba11; @@ -453,7 +453,7 @@ // CSRs that diverge from stock values in MPACT. constexpr uint32_t kMisaValue = 0x40801100; - for (auto &[name, expected_value] : + for (auto& [name, expected_value] : {std::tuple<std::string, uint32_t>{"misa", kMisaValue}}) { auto result = kelvin_top_->ReadRegister(name); EXPECT_OK(result.status()); @@ -525,9 +525,9 @@ } uint32_t entry_point_; - KelvinTop *kelvin_top_ = nullptr; - ElfProgramLoader *loader_ = nullptr; - uint8_t *memory_blocks_[kNumMemoryBlocks] = {nullptr}; + KelvinTop* kelvin_top_ = nullptr; + ElfProgramLoader* loader_ = nullptr; + uint8_t* memory_blocks_[kNumMemoryBlocks] = {nullptr}; uint64_t memory_size_; };
diff --git a/sim/test/kelvin_vector_convolution_instructions_test.cc b/sim/test/kelvin_vector_convolution_instructions_test.cc index 8dbefe6..f673305 100644 --- a/sim/test/kelvin_vector_convolution_instructions_test.cc +++ b/sim/test/kelvin_vector_convolution_instructions_test.cc
@@ -94,15 +94,15 @@ AppendVectorRegisterOperands(instruction.get(), 1, 3, kVs3, {}, false /* widen_dst*/, {}); if (kWriteAcc) { - std::vector<kelvin::sim::test::RegisterBase *> reg_vec; + std::vector<kelvin::sim::test::RegisterBase*> reg_vec; for (int i = 0; i < 4; i++) { auto reg_name = absl::StrCat("v", kVd + i); reg_vec.push_back( state_->GetRegister<kelvin::sim::test::RVVectorRegister>(reg_name) .first); } - auto *op = new kelvin::sim::test::RV32VectorDestinationOperand( - absl::Span<kelvin::sim::test::RegisterBase *>(reg_vec), 0, + auto* op = new kelvin::sim::test::RV32VectorDestinationOperand( + absl::Span<kelvin::sim::test::RegisterBase*>(reg_vec), 0, absl::StrCat("v", kVd)); instruction->AppendDestination(op); } @@ -314,10 +314,10 @@ private: bool execution_fail_; - std::function<bool(bool, uint64_t, uint64_t, uint64_t, const Instruction *)> + std::function<bool(bool, uint64_t, uint64_t, uint64_t, const Instruction*)> trap_call_back_ = [this](bool is_interrupt, uint64_t trap_value, uint64_t exception_code, uint64_t epc, - const Instruction *instruction) { + const Instruction* instruction) { auto code = static_cast<mpact::sim::riscv::ExceptionCode>(exception_code); if (code == mpact::sim::riscv::ExceptionCode::kIllegalInstruction) {
diff --git a/sim/test/kelvin_vector_instructions_test.cc b/sim/test/kelvin_vector_instructions_test.cc index 652181a..e430af5 100644 --- a/sim/test/kelvin_vector_instructions_test.cc +++ b/sim/test/kelvin_vector_instructions_test.cc
@@ -282,7 +282,7 @@ int64_t vs2_ext = static_cast<int64_t>(vs2); return static_cast<Vd>(vs1_ext + vs2_ext); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAdd<Vd>(scalar, strip_mine, inst); } }; @@ -298,7 +298,7 @@ int64_t vs2_ext = static_cast<int64_t>(vs2); return static_cast<Vd>(vs1_ext - vs2_ext); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSub<Vd>(scalar, strip_mine, inst); } }; @@ -314,7 +314,7 @@ int64_t vs2_ext = static_cast<int64_t>(vs2); return static_cast<Vd>(vs2_ext - vs1_ext); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVRSub<Vd>(scalar, strip_mine, inst); } }; @@ -326,7 +326,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VEqOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 == vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVEq<Vd>(scalar, strip_mine, inst); } }; @@ -338,7 +338,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VNeOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 != vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVNe<Vd>(scalar, strip_mine, inst); } }; @@ -350,7 +350,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VLtOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 < vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVLt<Vd>(scalar, strip_mine, inst); } }; @@ -367,7 +367,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VLeOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 <= vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVLe<Vd>(scalar, strip_mine, inst); } }; @@ -384,7 +384,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VGtOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 > vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVGt<Vd>(scalar, strip_mine, inst); } }; @@ -401,7 +401,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VGeOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 >= vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVGe<Vd>(scalar, strip_mine, inst); } }; @@ -423,7 +423,7 @@ auto result = vs1_ext > vs2_ext ? vs1_ext - vs2_ext : vs2_ext - vs1_ext; return static_cast<Vd>(result); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAbsd<Vs1>(scalar, strip_mine, inst); } }; @@ -442,7 +442,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VMaxOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return std::max(vs1, vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMax<Vd>(scalar, strip_mine, inst); } }; @@ -459,7 +459,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VMinOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return std::min(vs1, vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMin<Vd>(scalar, strip_mine, inst); } }; @@ -481,7 +481,7 @@ int64_t vd_ext = static_cast<int64_t>(vd); return static_cast<Vd>(vd_ext + vs1_ext + vs2_ext); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAdd3<Vd>(scalar, strip_mine, inst); } }; @@ -500,7 +500,7 @@ std::max<int64_t>(std::numeric_limits<Vd>::min(), sum), std::numeric_limits<Vd>::max()); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAdds<Vd>(scalar, strip_mine, inst); } }; @@ -516,7 +516,7 @@ uint64_t sum = static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2); return std::min<uint64_t>(std::numeric_limits<Vd>::max(), sum); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAddsu<Vd>(scalar, strip_mine, inst); } }; @@ -536,7 +536,7 @@ std::max<int64_t>(std::numeric_limits<Vd>::min(), sub), std::numeric_limits<Vd>::max()); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSubs<Vd>(scalar, strip_mine, inst); } }; @@ -549,7 +549,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VSubsuOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 < vs2 ? 0 : vs1 - vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSubsu<Vd>(scalar, strip_mine, inst); } }; @@ -564,7 +564,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return static_cast<Vd>(vs1) + static_cast<Vd>(vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAddw<Vd, Vs1>(scalar, strip_mine, inst); } }; @@ -585,7 +585,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return static_cast<Vd>(vs1) - static_cast<Vd>(vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSubw<Vd, Vs1>(scalar, strip_mine, inst); } }; @@ -608,7 +608,7 @@ int64_t vs2_ext = static_cast<int64_t>(vs2); return static_cast<Vd>(vs1_ext + vs2_ext); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAcc<Vd, Vs2>(scalar, strip_mine, inst); } }; @@ -628,8 +628,8 @@ static std::pair<T, T> PairwiseOpArgsGetter( int num_ops, int op_num, int dest_reg_sub_index, int element_index, int vd_size, bool widen_dst, int src1_widen_factor, int vs1_size, - const std::vector<T> &vs1_value, int vs2_size, bool s2_scalar, - const std::vector<T> &vs2_value, T rs2_value, bool halftype_op, + const std::vector<T>& vs1_value, int vs2_size, bool s2_scalar, + const std::vector<T>& vs2_value, T rs2_value, bool halftype_op, bool vmvp_op) { int start_index = (op_num * vs1_size) + (2 * element_index); if (dest_reg_sub_index == 0) { @@ -645,7 +645,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return static_cast<Vd>(vs1) + static_cast<Vd>(vs2); } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVPadd<Vd, Vs2>(strip_mine, inst); } }; @@ -666,7 +666,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return static_cast<Vd>(vs1) - static_cast<Vd>(vs2); } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVPsub<Vd, Vs2>(strip_mine, inst); } }; @@ -693,7 +693,7 @@ return static_cast<Vd>( (static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2)) >> 1); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVHadd<Vd>(scalar, strip_mine, false /* round */, inst); } }; @@ -718,7 +718,7 @@ return static_cast<Vd>( (static_cast<uint64_t>(vs1) + static_cast<uint64_t>(vs2) + 1) >> 1); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVHadd<Vd>(scalar, strip_mine, true /* round */, inst); } }; @@ -743,7 +743,7 @@ return static_cast<Vd>( (static_cast<uint64_t>(vs1) - static_cast<uint64_t>(vs2)) >> 1); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVHsub<Vd>(scalar, strip_mine, false /* round */, inst); } }; @@ -768,7 +768,7 @@ return static_cast<Vd>( (static_cast<uint64_t>(vs1) - static_cast<uint64_t>(vs2) + 1) >> 1); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVHsub<Vd>(scalar, strip_mine, true /* round */, inst); } }; @@ -785,7 +785,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VAndOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 & vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVAnd<Vd>(scalar, strip_mine, inst); } }; @@ -798,7 +798,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VOrOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 | vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVOr<Vd>(scalar, strip_mine, inst); } }; @@ -811,7 +811,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VXorOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 ^ vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVXor<Vd>(scalar, strip_mine, inst); } }; @@ -824,7 +824,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VSllOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 << (vs2 & (sizeof(Vd) * 8 - 1)); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSll<Vd>(scalar, strip_mine, inst); } }; @@ -837,7 +837,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VSrlOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 >> (vs2 & (sizeof(Vd) * 8 - 1)); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSrl<Vd>(scalar, strip_mine, inst); } }; @@ -850,7 +850,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VSraOp { static Vd Op(Vs1 vs1, Vs2 vs2) { return vs1 >> (vs2 & (sizeof(Vd) * 8 - 1)); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSra<Vd>(scalar, strip_mine, inst); } }; @@ -874,7 +874,7 @@ if (count & 16) r = ((r & 0x0000FFFF) << 16) | ((r & 0xFFFF0000) >> 16); return r; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVRev<Vd>(scalar, strip_mine, inst); } }; @@ -896,7 +896,7 @@ } return r; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVRor<Vd>(scalar, strip_mine, inst); } }; @@ -911,7 +911,7 @@ template <typename T> struct VMvpOp { static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMvp<T>(scalar, strip_mine, inst); } }; @@ -1020,7 +1020,7 @@ } static void KelvinOp(bool round, bool scalar, bool strip_mine, - Instruction *inst) { + Instruction* inst) { KelvinVShift<Vd>(round, scalar, strip_mine, inst); } }; @@ -1034,7 +1034,7 @@ template <typename Vd, typename Vs> struct VNotOp { static Vd Op(Vs vs) { return ~vs; } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVNot<Vs>(strip_mine, inst); } }; @@ -1058,7 +1058,7 @@ } return n; } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVClb<Vs>(strip_mine, inst); } }; @@ -1080,7 +1080,7 @@ } return n; } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVClz<Vs>(strip_mine, inst); } }; @@ -1094,7 +1094,7 @@ template <typename Vd, typename Vs> struct VCpopOp { static Vd Op(Vs vs) { return absl::popcount(vs); } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVCpop<Vs>(strip_mine, inst); } }; @@ -1108,7 +1108,7 @@ template <typename Vd, typename Vs> struct VMvOp { static Vd Op(Vs vs) { return vs; } - static void KelvinOp(bool strip_mine, Instruction *inst) { + static void KelvinOp(bool strip_mine, Instruction* inst) { KelvinVMv<Vs>(strip_mine, inst); } }; @@ -1137,7 +1137,7 @@ if (zero) return 0; return res; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSrans<Vd, Vs1>(kNonRounding, scalar, strip_mine, inst); } }; @@ -1169,7 +1169,7 @@ if (zero) return 0; return res; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSrans<Vd, Vs1>(kIsRounding, scalar, strip_mine, inst); } }; @@ -1202,7 +1202,7 @@ return static_cast<Vd>(static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2)); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMul<Vd>(scalar, strip_mine, inst); } }; @@ -1226,7 +1226,7 @@ m = std::min(static_cast<uint64_t>(std::numeric_limits<Vd>::max()), m); return m; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMuls<Vd>(scalar, strip_mine, inst); } }; @@ -1245,7 +1245,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return static_cast<Vd>(vs1) * static_cast<Vd>(vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMulw<Vd, Vs1>(scalar, strip_mine, inst); } }; @@ -1273,7 +1273,7 @@ uint64_t result = static_cast<uint64_t>(vs1) * static_cast<uint64_t>(vs2); return result >> n; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMulh<Vd>(scalar, strip_mine, false /* round */, inst); } }; @@ -1302,7 +1302,7 @@ result += 1ull << (n - 1); return result >> n; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMulh<Vd>(scalar, strip_mine, true /* round */, inst); } }; @@ -1341,7 +1341,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return KelvinVDmulhHelper<Vd>(kNonRounding, false /* round_neg*/, vs1, vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVDmulh<Vd>(scalar, strip_mine, kNonRounding, false /* round_neg*/, inst); } @@ -1352,7 +1352,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return KelvinVDmulhHelper<Vd>(kIsRounding, false /* round_neg*/, vs1, vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVDmulh<Vd>(scalar, strip_mine, kIsRounding, false /* round_neg*/, inst); } @@ -1363,7 +1363,7 @@ static Vd Op(Vs1 vs1, Vs2 vs2) { return KelvinVDmulhHelper<Vd>(kIsRounding, true /* round_neg*/, vs1, vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVDmulh<Vd>(scalar, strip_mine, kIsRounding, true /* round_neg*/, inst); } @@ -1388,7 +1388,7 @@ return static_cast<int64_t>(vd) + static_cast<int64_t>(vs1) * static_cast<int64_t>(vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMacc<Vd>(scalar, strip_mine, inst); } }; @@ -1404,7 +1404,7 @@ return static_cast<int64_t>(vs1) + static_cast<int64_t>(vd) * static_cast<int64_t>(vs2); } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVMadd<Vd>(scalar, strip_mine, inst); } }; @@ -1418,8 +1418,8 @@ static std::pair<T, T> SlidenArgsGetter( bool horizontal, int index, int num_ops, int op_num, int dest_reg_sub_index, int element_index, int vd_size, bool widen_dst, int src1_widen_factor, - int vs1_size, const std::vector<T> &vs1_value, int vs2_size, bool s2_scalar, - const std::vector<T> &vs2_value, T rs2_value, bool halftype_op, + int vs1_size, const std::vector<T>& vs1_value, int vs2_size, bool s2_scalar, + const std::vector<T>& vs2_value, T rs2_value, bool halftype_op, bool vmvp_op) { assert(!s2_scalar && !halftype_op && !vmvp_op && dest_reg_sub_index == 0); @@ -1458,7 +1458,7 @@ struct VSlidehnOp { static constexpr auto kArgsGetter = SlidenArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(int index, bool strip_mine, Instruction *inst) { + static void KelvinOp(int index, bool strip_mine, Instruction* inst) { KelvinVSlidehn<T>(index, inst); } }; @@ -1472,7 +1472,7 @@ struct VSlidevnOp { static constexpr auto kArgsGetter = SlidenArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(int index, bool strip_mine, Instruction *inst) { + static void KelvinOp(int index, bool strip_mine, Instruction* inst) { KelvinVSlidevn<T>(index, strip_mine, inst); } }; @@ -1532,7 +1532,7 @@ struct VSlidehpOp { static constexpr auto kArgsGetter = SlidepArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(int index, bool strip_mine, Instruction *inst) { + static void KelvinOp(int index, bool strip_mine, Instruction* inst) { KelvinVSlidehp<T>(index, inst); } }; @@ -1546,7 +1546,7 @@ struct VSlidevpOp { static constexpr auto kArgsGetter = SlidepArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(int index, bool strip_mine, Instruction *inst) { + static void KelvinOp(int index, bool strip_mine, Instruction* inst) { KelvinVSlidevp<T>(index, strip_mine, inst); } }; @@ -1565,7 +1565,7 @@ template <typename Vd, typename Vs1, typename Vs2> struct VSelOp { static Vd Op(Vd vd, Vs1 vs1, Vs2 vs2) { return vs1 & 1 ? vd : vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVSel<Vd>(scalar, strip_mine, inst); } }; @@ -1578,8 +1578,8 @@ static std::pair<T, T> EvnOddOpArgsGetter( int num_ops, int op_num, int dest_reg_sub_index, int element_index, int vd_size, bool widen_dst, int src1_widen_factor, int vs1_size, - const std::vector<T> &vs1_value, int vs2_size, bool s2_scalar, - const std::vector<T> &vs2_value, T rs2_value, bool halftype_op, + const std::vector<T>& vs1_value, int vs2_size, bool s2_scalar, + const std::vector<T>& vs2_value, T rs2_value, bool halftype_op, bool vmvp_op) { const int combined_element_index = (op_num * vs1_size + element_index) * 2; const int elts_per_src = num_ops * vs1_size; @@ -1602,7 +1602,7 @@ struct VEvnOp { static constexpr auto kArgsGetter = EvnOddOpArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVEvn<T>(scalar, strip_mine, inst); } }; @@ -1614,7 +1614,7 @@ struct VOddOp { static constexpr auto kArgsGetter = EvnOddOpArgsGetter<T>; static T Op(T vs1, T vs2) { return vs2; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVOdd<T>(scalar, strip_mine, inst); } }; @@ -1626,7 +1626,7 @@ struct VEvnoddOp { static constexpr auto kArgsGetter = EvnOddOpArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVEvnodd<T>(scalar, strip_mine, inst); } }; @@ -1640,8 +1640,8 @@ static std::pair<T, T> ZipOpArgsGetter( int num_ops, int op_num, int dest_reg_sub_index, int element_index, int vd_size, bool widen_dst, int src1_widen_factor, int vs1_size, - const std::vector<T> &vs1_value, int vs2_size, bool s2_scalar, - const std::vector<T> &vs2_value, T rs2_value, bool halftype_op, + const std::vector<T>& vs1_value, int vs2_size, bool s2_scalar, + const std::vector<T>& vs2_value, T rs2_value, bool halftype_op, bool vmvp_op) { auto src_index = (op_num * vs1_size + element_index + dest_reg_sub_index * vs1_size * num_ops) / @@ -1660,7 +1660,7 @@ struct VZipOp { static constexpr auto kArgsGetter = ZipOpArgsGetter<T>; static T Op(T vs1, T vs2) { return vs1; } - static void KelvinOp(bool scalar, bool strip_mine, Instruction *inst) { + static void KelvinOp(bool scalar, bool strip_mine, Instruction* inst) { KelvinVZip<T>(scalar, strip_mine, inst); } };
diff --git a/sim/test/kelvin_vector_instructions_test_base.h b/sim/test/kelvin_vector_instructions_test_base.h index 8141ef7..6b191e6 100644 --- a/sim/test/kelvin_vector_instructions_test_base.h +++ b/sim/test/kelvin_vector_instructions_test_base.h
@@ -75,7 +75,7 @@ state_ = new KelvinState("test", mpact::sim::riscv::RiscVXlen::RV32, memory_); // Initialize a portion of memory with a known pattern. - auto *db = state_->db_factory()->Allocate(8192); + auto* db = state_->db_factory()->Allocate(8192); auto span = db->Get<uint8_t>(); for (int i = 0; i < 8192; i++) { span[i] = i & 0xff; @@ -116,8 +116,8 @@ static std::pair<Vs1, Vs2> CommonBinaryOpArgsGetter( int num_ops, int op_num, int dest_reg_sub_index, int element_index, int vd_size, bool widen_dst, int src1_widen_factor, int vs1_size, - const std::vector<Vs1> &vs1_value, int vs2_size, bool s2_scalar, - const std::vector<Vs2> &vs2_value, Vs2 rs2_value, bool halftype_op, + const std::vector<Vs1>& vs1_value, int vs2_size, bool s2_scalar, + const std::vector<Vs2>& vs2_value, Vs2 rs2_value, bool halftype_op, bool vmvp_op) { auto src1_element_index = op_num * vs1_size + element_index * sizeof(Vd) / sizeof(Vs1); @@ -395,7 +395,7 @@ // Fill the span with random values. template <typename T> void FillArrayWithRandomValues(absl::Span<T> span) { - for (auto &val : span) { + for (auto& val : span) { val = RandomValue<T>(); } } @@ -406,9 +406,9 @@ template <typename T> void SetVectorRegisterValues( absl::Span<const std::tuple<std::string, Span<const T>>> values) { - for (auto &[vreg_name, span] : values) { - auto *vreg = state_->GetRegister<RVVectorRegister>(vreg_name).first; - auto *db = state_->db_factory()->MakeCopyOf(vreg->data_buffer()); + for (auto& [vreg_name, span] : values) { + auto* vreg = state_->GetRegister<RVVectorRegister>(vreg_name).first; + auto* db = state_->db_factory()->MakeCopyOf(vreg->data_buffer()); db->template Set<T>(span); vreg->SetDataBuffer(db); db->DecRef(); @@ -419,9 +419,9 @@ template <typename T, typename RegisterType = RV32Register> void SetRegisterValues( absl::Span<const std::tuple<std::string, const T>> values) { - for (auto &[reg_name, value] : values) { - auto *reg = state_->GetRegister<RegisterType>(reg_name).first; - auto *db = + for (auto& [reg_name, value] : values) { + auto* reg = state_->GetRegister<RegisterType>(reg_name).first; + auto* db = state_->db_factory()->Allocate<typename RegisterType::ValueType>(1); db->template Set<T>(0, value); reg->SetDataBuffer(db); @@ -431,28 +431,28 @@ // Creates source and destination scalar register operands for the registers // named in the two vectors and appends them to the given instruction. - void AppendRegisterOperands(Instruction *inst, + void AppendRegisterOperands(Instruction* inst, absl::Span<const std::string> sources, absl::Span<const std::string> destinations) { - for (auto ®_name : sources) { - auto *reg = state_->GetRegister<RV32Register>(reg_name).first; + for (auto& reg_name : sources) { + auto* reg = state_->GetRegister<RV32Register>(reg_name).first; inst->AppendSource(reg->CreateSourceOperand()); } - for (auto ®_name : destinations) { - auto *reg = state_->GetRegister<RV32Register>(reg_name).first; + for (auto& reg_name : destinations) { + auto* reg = state_->GetRegister<RV32Register>(reg_name).first; inst->AppendDestination(reg->CreateDestinationOperand(0)); } } // Creates source and destination scalar register operands for the registers // named in the two vectors and appends them to the given instruction. - void AppendVectorRegisterOperands(Instruction *inst, const uint32_t num_ops, + void AppendVectorRegisterOperands(Instruction* inst, const uint32_t num_ops, int src1_widen_factor, int src1_reg, absl::Span<const int> other_sources, bool widen_dst, absl::Span<const int> destinations) { { - std::vector<RegisterBase *> reg_vec; + std::vector<RegisterBase*> reg_vec; auto regs_count = src1_widen_factor * num_ops; for (int i = 0; (i < regs_count) && (i + src1_reg < kNumVectorRegister); i++) { @@ -460,23 +460,23 @@ reg_vec.push_back( state_->GetRegister<RVVectorRegister>(reg_name).first); } - auto *op = new RV32VectorSourceOperand( - absl::Span<RegisterBase *>(reg_vec), absl::StrCat("v", src1_reg)); + auto* op = new RV32VectorSourceOperand(absl::Span<RegisterBase*>(reg_vec), + absl::StrCat("v", src1_reg)); inst->AppendSource(op); } - for (auto ®_no : other_sources) { - std::vector<RegisterBase *> reg_vec; + for (auto& reg_no : other_sources) { + std::vector<RegisterBase*> reg_vec; for (int i = 0; (i < num_ops) && (i + reg_no < kNumVectorRegister); i++) { std::string reg_name = absl::StrCat("v", i + reg_no); reg_vec.push_back( state_->GetRegister<RVVectorRegister>(reg_name).first); } - auto *op = new RV32VectorSourceOperand( - absl::Span<RegisterBase *>(reg_vec), absl::StrCat("v", reg_no)); + auto* op = new RV32VectorSourceOperand(absl::Span<RegisterBase*>(reg_vec), + absl::StrCat("v", reg_no)); inst->AppendSource(op); } - for (auto ®_no : destinations) { - std::vector<RegisterBase *> reg_vec; + for (auto& reg_no : destinations) { + std::vector<RegisterBase*> reg_vec; auto regs_count = widen_dst ? num_ops * 2 : num_ops; for (int i = 0; (i < regs_count) && (i + reg_no < kNumVectorRegister); i++) { @@ -484,25 +484,25 @@ reg_vec.push_back( state_->GetRegister<RVVectorRegister>(reg_name).first); } - auto *op = new RV32VectorDestinationOperand( - absl::Span<RegisterBase *>(reg_vec), 0, absl::StrCat("v", reg_no)); + auto* op = new RV32VectorDestinationOperand( + absl::Span<RegisterBase*>(reg_vec), 0, absl::StrCat("v", reg_no)); inst->AppendDestination(op); } } - using InstructionPtr = std::unique_ptr<Instruction, void (*)(Instruction *)>; + using InstructionPtr = std::unique_ptr<Instruction, void (*)(Instruction*)>; InstructionPtr CreateInstruction() { InstructionPtr inst(new Instruction(next_instruction_address_, state_), - [](Instruction *inst) { inst->DecRef(); }); + [](Instruction* inst) { inst->DecRef(); }); inst->set_size(4); next_instruction_address_ += 4; return inst; } - RVVectorRegister *vreg_[kNumVectorRegister]; - RV32Register *xreg_[32]; - KelvinState *state_; - FlatDemandMemory *memory_; + RVVectorRegister* vreg_[kNumVectorRegister]; + RV32Register* xreg_[32]; + KelvinState* state_; + FlatDemandMemory* memory_; absl::BitGen bitgen_; uint32_t next_instruction_address_ = kInstAddress; };
diff --git a/sim/test/kelvin_vector_memory_instructions_test.cc b/sim/test/kelvin_vector_memory_instructions_test.cc index 9ad8bc6..c319524 100644 --- a/sim/test/kelvin_vector_memory_instructions_test.cc +++ b/sim/test/kelvin_vector_memory_instructions_test.cc
@@ -61,7 +61,7 @@ bool is_uncached = false) { InstructionPtr child_instruction( new Instruction(next_instruction_address_, state_), - [](Instruction *inst) { inst->DecRef(); }); + [](Instruction* inst) { inst->DecRef(); }); child_instruction->set_size(4); auto instruction = CreateInstruction(); @@ -257,7 +257,7 @@ if (post_increment) { // Check rs1 value. - auto *reg = state_ + auto* reg = state_ ->GetRegister<kelvin::sim::test::RV32Register>( kelvin::sim::test::kRs1Name) .first; @@ -416,7 +416,7 @@ template <typename T> T GetDefaultMemoryValue(int address) { T value = 0; - uint8_t *ptr = reinterpret_cast<uint8_t *>(&value); + uint8_t* ptr = reinterpret_cast<uint8_t*>(&value); for (int j = 0; j < sizeof(T); j++) { ptr[j] = (address + j) & 0xff; } @@ -425,7 +425,7 @@ template <typename T> T GetSavedMemoryValue(int address) { - auto *db = state_->db_factory()->Allocate<T>(1); + auto* db = state_->db_factory()->Allocate<T>(1); memory_->Load(address, db, nullptr, nullptr); T data = db->template Get<T>(0); db->DecRef(); @@ -574,12 +574,12 @@ for (int element_index = 0; element_index < kVLenInWord; element_index++) { if (is_transpose) { - auto *acc_vec = state_->acc_vec(element_index); + auto* acc_vec = state_->acc_vec(element_index); EXPECT_EQ(vreg_span[element_index], (*acc_vec)[i]) << absl::StrCat("vreg[", vreg_num, "][", element_index, "] != acc[", element_index, "][", i, "]"); } else { - auto *acc_vec = state_->acc_vec(i); + auto* acc_vec = state_->acc_vec(i); EXPECT_EQ(vreg_span[element_index], (*acc_vec)[element_index]) << absl::StrCat("vreg[", vreg_num, "][", element_index, "] != acc[", i, "][", element_index, "]"); @@ -633,8 +633,7 @@ auto ref_vreg = vreg_[vref_num]; auto ref_span = ref_vreg->data_buffer()->Get<uint8_t>(); - uint8_t *dwacc_span = - reinterpret_cast<uint8_t *>(state_->dw_acc_vec(8 * i)); + uint8_t* dwacc_span = reinterpret_cast<uint8_t*>(state_->dw_acc_vec(8 * i)); for (int element_index = 0; element_index < ref_span.size() / 4; element_index++) { EXPECT_EQ(vreg_span[element_index], ref_span[element_index])