diff --git a/DRAMSys/library/src/common/configuration/AddressMapping.cpp b/DRAMSys/library/src/common/configuration/AddressMapping.cpp index b3277d89..7b2237cc 100644 --- a/DRAMSys/library/src/common/configuration/AddressMapping.cpp +++ b/DRAMSys/library/src/common/configuration/AddressMapping.cpp @@ -34,7 +34,6 @@ */ #include "AddressMapping.h" -#include "util.h" #include @@ -49,12 +48,11 @@ void to_json(json &j, const AddressMapping &m) {"COLUMN_BIT", m.coloumnBits}, {"BANKGROUP_BIT", m.bankGroupBits}, {"BANK_BIT", m.bankBits}, - {"ROW_BIT", m.rowBits}}; - - from_optional("CHANNEL_BIT", congen, m.channelBits); - from_optional("BYTE_BIT", congen, m.byteBits); - from_optional("BANKGROUP_BIT", congen, m.bankGroupBits); - from_optional("XOR", congen, m.xorBits); + {"ROW_BIT", m.rowBits}, + {"CHANNEL_BIT", m.channelBits}, + {"BYTE_BIT", m.byteBits}, + {"BANKGROUP_BIT", m.bankGroupBits}, + {"XOR", m.xorBits}}; j["CONGEN"] = congen; } @@ -73,10 +71,17 @@ void from_json(const json &j, AddressMapping &m) congen.at("BANK_BIT").get_to(m.bankBits); congen.at("ROW_BIT").get_to(m.rowBits); - get_optional("CHANNEL_BIT", congen, m.channelBits); - get_optional("BYTE_BIT", congen, m.byteBits); - get_optional("BANKGROUP_BIT", congen, m.bankGroupBits); - get_optional("XOR", congen, m.xorBits); + if (congen.contains("CHANNEL_BIT")) + congen.at("CHANNEL_BIT").get_to(m.channelBits); + + if (congen.contains("BYTE_BIT")) + congen.at("BYTE_BIT").get_to(m.byteBits); + + if (congen.contains("BANKGROUP_BIT")) + congen.at("BANKGROUP_BIT").get_to(m.bankGroupBits); + + if (congen.contains("XOR")) + congen.at("XOR").get_to(m.xorBits); } void to_json(json &j, const XorPair &x) @@ -90,4 +95,4 @@ void from_json(const json &j, XorPair &x) j.at("SECOND").get_to(x.second); } -} // namespace Configuration +} // namespace DRAMSysConfiguration diff --git a/DRAMSys/library/src/common/configuration/AddressMapping.h b/DRAMSys/library/src/common/configuration/AddressMapping.h index 07c4cda0..ffcc3ca2 100644 --- a/DRAMSys/library/src/common/configuration/AddressMapping.h +++ b/DRAMSys/library/src/common/configuration/AddressMapping.h @@ -33,8 +33,10 @@ * Derek Christ */ -#ifndef ADDRESSMAPPING_H -#define ADDRESSMAPPING_H +#ifndef DRAMSYSCONFIGURATION_ADDRESSMAPPING_H +#define DRAMSYSCONFIGURATION_ADDRESSMAPPING_H + +#include "util.h" #include #include @@ -56,13 +58,13 @@ void from_json(const json &j, XorPair &x); struct AddressMapping { - std::pair, bool> byteBits; + Optional> byteBits; std::unordered_set coloumnBits; std::unordered_set bankBits; - std::pair, bool> bankGroupBits; + Optional> bankGroupBits; std::unordered_set rowBits; - std::pair, bool> channelBits; - std::pair, bool> xorBits; + Optional> channelBits; + Optional> xorBits; }; void to_json(json &j, const AddressMapping &m); diff --git a/DRAMSys/library/src/common/configuration/CMakeLists.txt b/DRAMSys/library/src/common/configuration/CMakeLists.txt index d62c5fdc..bd199eae 100644 --- a/DRAMSys/library/src/common/configuration/CMakeLists.txt +++ b/DRAMSys/library/src/common/configuration/CMakeLists.txt @@ -32,6 +32,7 @@ # Derek Christ set(JSON_BuildTests OFF CACHE INTERNAL "") +set(JSON_ImplicitConversions OFF CACHE INTERNAL "") add_subdirectory(${CMAKE_SOURCE_DIR}/library/src/common/third_party/nlohmann ${CMAKE_CURRENT_BINARY_DIR}/nlohmann) option(DRAMSYS_CONFIGURATION_TESTS "Build the unit tests for configuration." OFF) @@ -56,5 +57,6 @@ add_library(DRAMSysConfiguration STATIC target_compile_definitions(DRAMSysConfiguration PRIVATE DRAMSysResourceDirectory="${CMAKE_SOURCE_DIR}/library/resources") -target_link_libraries(DRAMSysConfiguration PRIVATE nlohmann_json::nlohmann_json) target_include_directories(DRAMSysConfiguration PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(DRAMSysConfiguration PRIVATE nlohmann_json::nlohmann_json) diff --git a/DRAMSys/library/src/common/configuration/Configuration.cpp b/DRAMSys/library/src/common/configuration/Configuration.cpp index 006db6f2..c610f579 100644 --- a/DRAMSys/library/src/common/configuration/Configuration.cpp +++ b/DRAMSys/library/src/common/configuration/Configuration.cpp @@ -34,7 +34,6 @@ */ #include "Configuration.h" -#include "util.h" #include @@ -43,14 +42,11 @@ namespace DRAMSysConfiguration void to_json(json &j, const Configuration &c) { - j = json{{"addressmapping", c.addressMapping}, - {"mcconfig", c.mcConfig}, - {"memspec", c.memSpec}, - {"simulationid", c.simulationId}, - {"simconfig", c.simConfig}}; + j = json{{"addressmapping", c.addressMapping}, {"mcconfig", c.mcConfig}, {"memspec", c.memSpec}, + {"simulationid", c.simulationId}, {"simconfig", c.simConfig}, {"thermalconfig", c.thermalConfig}, + {"tracesetup", c.traceSetup}}; - from_optional("thermalconfig", j, c.thermalConfig); - from_optional("tracesetup", j, c.traceSetup); + remove_null_values(j); } void from_json(const json &j, Configuration &c) @@ -61,8 +57,11 @@ void from_json(const json &j, Configuration &c) j.at("simulationid").get_to(c.simulationId); j.at("simconfig").get_to(c.simConfig); - get_optional("thermalconfig", j, c.thermalConfig); - get_optional("tracesetup", j, c.traceSetup); + if (j.contains("thermalconfig")) + j.at("thermalconfig").get_to(c.thermalConfig); + + if (j.contains("tracesetup")) + j.at("tracesetup").get_to(c.traceSetup); } Configuration from_path(const std::string &path) @@ -72,4 +71,4 @@ Configuration from_path(const std::string &path) return simulation.get(); } -} // namespace Configuration +} // namespace DRAMSysConfiguration diff --git a/DRAMSys/library/src/common/configuration/Configuration.h b/DRAMSys/library/src/common/configuration/Configuration.h index 9385d13a..676036ec 100644 --- a/DRAMSys/library/src/common/configuration/Configuration.h +++ b/DRAMSys/library/src/common/configuration/Configuration.h @@ -33,8 +33,8 @@ * Derek Christ */ -#ifndef CONFIGURATION_H -#define CONFIGURATION_H +#ifndef DRAMSYSCONFIGURATION_CONFIGURATION_H +#define DRAMSYSCONFIGURATION_CONFIGURATION_H #include "AddressMapping.h" #include "McConfig.h" @@ -42,6 +42,7 @@ #include "ThermalConfig.h" #include "TraceSetup.h" #include "memspec/MemSpec.h" +#include "util.h" #include #include @@ -68,8 +69,8 @@ struct Configuration MemSpec memSpec; SimConfig simConfig; std::string simulationId; - std::pair thermalConfig; - std::pair traceSetup; + Optional thermalConfig; + Optional traceSetup; }; void to_json(json &j, const Configuration &p); @@ -77,6 +78,6 @@ void from_json(const json &j, Configuration &p); Configuration from_path(const std::string &path); -} // namespace Configuration +} // namespace DRAMSysConfiguration -#endif // CONFIGURATION_H +#endif // DRAMSYSCONFIGURATION_CONFIGURATION_H diff --git a/DRAMSys/library/src/common/configuration/McConfig.cpp b/DRAMSys/library/src/common/configuration/McConfig.cpp index daaf66d0..50684665 100644 --- a/DRAMSys/library/src/common/configuration/McConfig.cpp +++ b/DRAMSys/library/src/common/configuration/McConfig.cpp @@ -34,8 +34,7 @@ */ #include "McConfig.h" -#include "util.h" - +#include namespace DRAMSysConfiguration { @@ -52,29 +51,64 @@ void to_json(json &j, const McConfig &c) {"RefreshMaxPulledin", c.refreshMaxPulledin}, {"PowerDownPolicy", c.powerDownPolicy}, {"Arbiter", c.arbiter}, - {"MaxActiveTransactions", c.maxActiveTransactions}}; + {"MaxActiveTransactions", c.maxActiveTransactions}, + {"RefreshManagment", c.refreshManagement}}; - from_optional("RefreshManagment", j, c.refreshManagement); + remove_null_values(j); } void from_json(const json &j, McConfig &c) { json j_mcconfig = get_config_json(j, mcConfigPath, "mcconfig"); - j_mcconfig.at("PagePolicy").get_to(c.pagePolicy); - j_mcconfig.at("Scheduler").get_to(c.scheduler); - j_mcconfig.at("SchedulerBuffer").get_to(c.schedulerBuffer); - j_mcconfig.at("RequestBufferSize").get_to(c.requestBufferSize); - j_mcconfig.at("CmdMux").get_to(c.cmdMux); - j_mcconfig.at("RespQueue").get_to(c.respQueue); - j_mcconfig.at("RefreshPolicy").get_to(c.refreshPolicy); - j_mcconfig.at("RefreshMaxPostponed").get_to(c.refreshMaxPostponed); - j_mcconfig.at("RefreshMaxPulledin").get_to(c.refreshMaxPulledin); - j_mcconfig.at("PowerDownPolicy").get_to(c.powerDownPolicy); - j_mcconfig.at("Arbiter").get_to(c.arbiter); - j_mcconfig.at("MaxActiveTransactions").get_to(c.maxActiveTransactions); + if (j_mcconfig.contains("PagePolicy")) + j_mcconfig.at("PagePolicy").get_to(c.pagePolicy); - get_optional("RefreshManagment", j_mcconfig, c.refreshManagement); + if (j_mcconfig.contains("PagePolicy")) + j_mcconfig.at("Scheduler").get_to(c.scheduler); + + if (j_mcconfig.contains("SchedulerBuffer")) + j_mcconfig.at("SchedulerBuffer").get_to(c.schedulerBuffer); + + if (j_mcconfig.contains("RequestBufferSize")) + j_mcconfig.at("RequestBufferSize").get_to(c.requestBufferSize); + + if (j_mcconfig.contains("CmdMux")) + j_mcconfig.at("CmdMux").get_to(c.cmdMux); + + if (j_mcconfig.contains("RespQueue")) + j_mcconfig.at("RespQueue").get_to(c.respQueue); + + if (j_mcconfig.contains("RefreshPolicy")) + j_mcconfig.at("RefreshPolicy").get_to(c.refreshPolicy); + + if (j_mcconfig.contains("RefreshMaxPostponed")) + j_mcconfig.at("RefreshMaxPostponed").get_to(c.refreshMaxPostponed); + + if (j_mcconfig.contains("RefreshMaxPulledin")) + j_mcconfig.at("RefreshMaxPulledin").get_to(c.refreshMaxPulledin); + + if (j_mcconfig.contains("PowerDownPolicy")) + j_mcconfig.at("PowerDownPolicy").get_to(c.powerDownPolicy); + + if (j_mcconfig.contains("Arbiter")) + j_mcconfig.at("Arbiter").get_to(c.arbiter); + + if (j_mcconfig.contains("MaxActiveTransactions")) + j_mcconfig.at("MaxActiveTransactions").get_to(c.maxActiveTransactions); + + if (j_mcconfig.contains("RefreshManagment")) + j_mcconfig.at("RefreshManagment").get_to(c.refreshManagement); + + invalidateEnum(c.pagePolicy); + invalidateEnum(c.scheduler); + invalidateEnum(c.schedulerBuffer); + invalidateEnum(c.cmdMux); + invalidateEnum(c.respQueue); + invalidateEnum(c.refreshPolicy); + invalidateEnum(c.respQueue); + invalidateEnum(c.powerDownPolicy); + invalidateEnum(c.arbiter); } -} // namespace Configuration +} // namespace DRAMSysConfiguration diff --git a/DRAMSys/library/src/common/configuration/McConfig.h b/DRAMSys/library/src/common/configuration/McConfig.h index 363a06b8..649d81bb 100644 --- a/DRAMSys/library/src/common/configuration/McConfig.h +++ b/DRAMSys/library/src/common/configuration/McConfig.h @@ -33,8 +33,10 @@ * Derek Christ */ -#ifndef MCCONFIG_H -#define MCCONFIG_H +#ifndef DRAMSYSCONFIGURATION_MCCONFIG_H +#define DRAMSYSCONFIGURATION_MCCONFIG_H + +#include "util.h" #include #include @@ -150,19 +152,19 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Arbiter, {{Arbiter::Invalid, nullptr}, struct McConfig { - PagePolicy pagePolicy; - Scheduler scheduler; - SchedulerBuffer schedulerBuffer; - unsigned int requestBufferSize; - CmdMux cmdMux; - RespQueue respQueue; - RefreshPolicy refreshPolicy; - unsigned int refreshMaxPostponed; - unsigned int refreshMaxPulledin; - PowerDownPolicy powerDownPolicy; - Arbiter arbiter; - unsigned int maxActiveTransactions; - std::pair refreshManagement; + Optional pagePolicy; + Optional scheduler; + Optional schedulerBuffer; + Optional requestBufferSize; + Optional cmdMux; + Optional respQueue; + Optional refreshPolicy; + Optional refreshMaxPostponed; + Optional refreshMaxPulledin; + Optional powerDownPolicy; + Optional arbiter; + Optional maxActiveTransactions; + Optional refreshManagement; }; void to_json(json &j, const McConfig &c); diff --git a/DRAMSys/library/src/common/configuration/SimConfig.cpp b/DRAMSys/library/src/common/configuration/SimConfig.cpp index 77903e0b..34cc41ef 100644 --- a/DRAMSys/library/src/common/configuration/SimConfig.cpp +++ b/DRAMSys/library/src/common/configuration/SimConfig.cpp @@ -34,7 +34,6 @@ */ #include "SimConfig.h" -#include "util.h" namespace DRAMSysConfiguration { @@ -62,21 +61,53 @@ void from_json(const json &j, SimConfig &c) { json j_simconfig = get_config_json(j, simConfigPath, "simconfig"); - j_simconfig.at("AddressOffset").get_to(c.addressOffset); - j_simconfig.at("CheckTLM2Protocol").get_to(c.checkTLM2Protocol); - j_simconfig.at("DatabaseRecording").get_to(c.databaseRecording); - j_simconfig.at("Debug").get_to(c.debug); - j_simconfig.at("ECCControllerMode").get_to(c.eccControllerMode); - j_simconfig.at("EnableWindowing").get_to(c.enableWindowing); - j_simconfig.at("ErrorCSVFile").get_to(c.errorCsvFile); - j_simconfig.at("ErrorChipSeed").get_to(c.errorChipSeed); - j_simconfig.at("PowerAnalysis").get_to(c.powerAnalysis); - j_simconfig.at("SimulationName").get_to(c.simulationName); - j_simconfig.at("SimulationProgressBar").get_to(c.simulationProgressBar); - j_simconfig.at("StoreMode").get_to(c.storeMode); - j_simconfig.at("ThermalSimulation").get_to(c.thermalSimulation); - j_simconfig.at("UseMalloc").get_to(c.useMalloc); - j_simconfig.at("WindowSize").get_to(c.windowSize); + if (j_simconfig.contains("AddressOffset")) + j_simconfig.at("AddressOffset").get_to(c.addressOffset); + + if (j_simconfig.contains("CheckTLM2Protocol")) + j_simconfig.at("CheckTLM2Protocol").get_to(c.checkTLM2Protocol); + + if (j_simconfig.contains("DatabaseRecording")) + j_simconfig.at("DatabaseRecording").get_to(c.databaseRecording); + + if (j_simconfig.contains("Debug")) + j_simconfig.at("Debug").get_to(c.debug); + + if (j_simconfig.contains("ECCControllerMode")) + j_simconfig.at("ECCControllerMode").get_to(c.eccControllerMode); + + if (j_simconfig.contains("EnableWindowing")) + j_simconfig.at("EnableWindowing").get_to(c.enableWindowing); + + if (j_simconfig.contains("ErrorCSVFile")) + j_simconfig.at("ErrorCSVFile").get_to(c.errorCsvFile); + + if (j_simconfig.contains("ErrorChipSeed")) + j_simconfig.at("ErrorChipSeed").get_to(c.errorChipSeed); + + if (j_simconfig.contains("PowerAnalysis")) + j_simconfig.at("PowerAnalysis").get_to(c.powerAnalysis); + + if (j_simconfig.contains("SimulationName")) + j_simconfig.at("SimulationName").get_to(c.simulationName); + + if (j_simconfig.contains("SimulationProgressBar")) + j_simconfig.at("SimulationProgressBar").get_to(c.simulationProgressBar); + + if (j_simconfig.contains("StoreMode")) + j_simconfig.at("StoreMode").get_to(c.storeMode); + + if (j_simconfig.contains("ThermalSimulation")) + j_simconfig.at("ThermalSimulation").get_to(c.thermalSimulation); + + if (j_simconfig.contains("UseMalloc")) + j_simconfig.at("UseMalloc").get_to(c.useMalloc); + + if (j_simconfig.contains("WindowSize")) + j_simconfig.at("WindowSize").get_to(c.windowSize); + + invalidateEnum(c.eccControllerMode); + invalidateEnum(c.storeMode); } -} // namespace Configuration +} // namespace DRAMSysConfiguration diff --git a/DRAMSys/library/src/common/configuration/SimConfig.h b/DRAMSys/library/src/common/configuration/SimConfig.h index b28d131d..d0ca2fa5 100644 --- a/DRAMSys/library/src/common/configuration/SimConfig.h +++ b/DRAMSys/library/src/common/configuration/SimConfig.h @@ -33,8 +33,10 @@ * Derek Christ */ -#ifndef SIMCONFIG_H -#define SIMCONFIG_H +#ifndef DRAMSYSCONFIGURATION_SIMCONFIG_H +#define DRAMSYSCONFIGURATION_SIMCONFIG_H + +#include "util.h" #include @@ -64,26 +66,27 @@ enum class StoreMode }; NLOHMANN_JSON_SERIALIZE_ENUM(StoreMode, {{StoreMode::Invalid, nullptr}, + {StoreMode::NoStorage, "NoStorage"}, {StoreMode::Store, "Store"}, {StoreMode::ErrorModel, "ErrorModel"}}) struct SimConfig { - unsigned int addressOffset; - bool checkTLM2Protocol; - bool databaseRecording; - bool debug; - ECCControllerMode eccControllerMode; - bool enableWindowing; - std::string errorCsvFile; - unsigned int errorChipSeed; - bool powerAnalysis; - std::string simulationName; - bool simulationProgressBar; - StoreMode storeMode; - bool thermalSimulation; - bool useMalloc; - unsigned int windowSize; + Optional addressOffset; + Optional checkTLM2Protocol; + Optional databaseRecording; + Optional debug; + Optional eccControllerMode; + Optional enableWindowing; + Optional errorCsvFile; + Optional errorChipSeed; + Optional powerAnalysis; + Optional simulationName; + Optional simulationProgressBar; + Optional storeMode; + Optional thermalSimulation; + Optional useMalloc; + Optional windowSize; }; void to_json(json &j, const SimConfig &c); diff --git a/DRAMSys/library/src/common/configuration/ThermalConfig.cpp b/DRAMSys/library/src/common/configuration/ThermalConfig.cpp index 6c69daec..5ed4fa8f 100644 --- a/DRAMSys/library/src/common/configuration/ThermalConfig.cpp +++ b/DRAMSys/library/src/common/configuration/ThermalConfig.cpp @@ -100,4 +100,4 @@ void from_json(const json &j, PowerInfo &c) j_powerinfo.at("dram_die_channel3").get_to(c.channel3); } -} // namespace Configuration +} // namespace DRAMSysConfiguration diff --git a/DRAMSys/library/src/common/configuration/ThermalConfig.h b/DRAMSys/library/src/common/configuration/ThermalConfig.h index 02c905b6..b7ed3238 100644 --- a/DRAMSys/library/src/common/configuration/ThermalConfig.h +++ b/DRAMSys/library/src/common/configuration/ThermalConfig.h @@ -33,8 +33,8 @@ * Derek Christ */ -#ifndef THERMALCONFIG_H -#define THERMALCONFIG_H +#ifndef DRAMSYSCONFIGURATION_THERMALCONFIG_H +#define DRAMSYSCONFIGURATION_THERMALCONFIG_H #include diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.cpp b/DRAMSys/library/src/common/configuration/TraceSetup.cpp index 39b76790..2b9f4615 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.cpp +++ b/DRAMSys/library/src/common/configuration/TraceSetup.cpp @@ -34,7 +34,6 @@ */ #include "TraceSetup.h" -#include "util.h" namespace DRAMSysConfiguration { @@ -61,12 +60,11 @@ void to_json(json &j, const TraceSetup &c) inititator_j["numRequests"] = generator->numRequests; inititator_j["rwRatio"] = generator->rwRatio; inititator_j["addressDistribution"] = generator->addressDistribution; - - from_optional("seed", inititator_j, generator->seed); - from_optional("maxPendingReadRequests", inititator_j, generator->maxPendingReadRequests); - from_optional("maxPendingWriteRequests", inititator_j, generator->maxPendingWriteRequests); - from_optional("minAddress", inititator_j, generator->minAddress); - from_optional("maxAddress", inititator_j, generator->maxAddress); + inititator_j["seed"] = generator->seed; + inititator_j["maxPendingReadRequests"] = generator->maxPendingReadRequests; + inititator_j["maxPendingWriteRequests"] = generator->maxPendingWriteRequests; + inititator_j["minAddress"] = generator->minAddress; + inititator_j["maxAddress"] = generator->maxAddress; } else if (const auto hammer = dynamic_cast(initiator.get())) { @@ -79,6 +77,7 @@ void to_json(json &j, const TraceSetup &c) inititator_j["type"] = "player"; } + remove_null_values(inititator_j); j.insert(j.end(), inititator_j); } } @@ -103,11 +102,20 @@ void from_json(const json &j, TraceSetup &c) initiator_j.at("rwRatio").get_to(generator->rwRatio); initiator_j.at("addressDistribution").get_to(generator->addressDistribution); - get_optional("seed", initiator_j, generator->seed); - get_optional("maxPendingReadRequests", initiator_j, generator->maxPendingReadRequests); - get_optional("maxPendingWriteRequests", initiator_j, generator->maxPendingWriteRequests); - get_optional("minAddress", initiator_j, generator->minAddress); - get_optional("maxAddress", initiator_j, generator->maxAddress); + if (initiator_j.contains("seed")) + initiator_j.at("seed").get_to(generator->seed); + + if (initiator_j.contains("maxPendingReadRequests")) + initiator_j.at("maxPendingReadRequests").get_to(generator->maxPendingReadRequests); + + if (initiator_j.contains("maxPendingWriteRequests")) + initiator_j.at("maxPendingWriteRequests").get_to(generator->maxPendingWriteRequests); + + if (initiator_j.contains("minAddress")) + initiator_j.at("minAddress").get_to(generator->minAddress); + + if (initiator_j.contains("maxAddress")) + initiator_j.at("maxAddress").get_to(generator->maxAddress); initiator = std::unique_ptr(generator); } @@ -128,4 +136,4 @@ void from_json(const json &j, TraceSetup &c) } } -} // namespace Configuration +} // namespace DRAMSysConfiguration diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.h b/DRAMSys/library/src/common/configuration/TraceSetup.h index 61361bc2..6ac8156b 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.h +++ b/DRAMSys/library/src/common/configuration/TraceSetup.h @@ -33,8 +33,10 @@ * Derek Christ */ -#ifndef TRACESETUP_H -#define TRACESETUP_H +#ifndef DRAMSYSCONFIGURATION_TRACESETUP_H +#define DRAMSYSCONFIGURATION_TRACESETUP_H + +#include "util.h" #include #include @@ -85,12 +87,12 @@ struct TraceGenerator : public TrafficInitiator unsigned int numRequests; double rwRatio; AddressDistribution addressDistribution; - std::pair addressIncrement; - std::pair seed; - std::pair maxPendingReadRequests; - std::pair maxPendingWriteRequests; - std::pair minAddress; - std::pair maxAddress; + Optional addressIncrement; + Optional seed; + Optional maxPendingReadRequests; + Optional maxPendingWriteRequests; + Optional minAddress; + Optional maxAddress; }; struct TraceHammer : public TrafficInitiator @@ -101,7 +103,7 @@ struct TraceHammer : public TrafficInitiator struct TraceSetup { - std::unordered_set> initiators; + std::unordered_set> initiators; }; void to_json(json &j, const TraceSetup &c); diff --git a/DRAMSys/library/src/common/configuration/memspec/MemArchitectureSpec.h b/DRAMSys/library/src/common/configuration/memspec/MemArchitectureSpec.h index 80a18ecc..6179e986 100644 --- a/DRAMSys/library/src/common/configuration/memspec/MemArchitectureSpec.h +++ b/DRAMSys/library/src/common/configuration/memspec/MemArchitectureSpec.h @@ -33,8 +33,8 @@ * Derek Christ */ -#ifndef MEMARCHITECTURESPEC_H -#define MEMARCHITECTURESPEC_H +#ifndef DRAMSYSCONFIGURATION_MEMARCHITECTURESPEC_H +#define DRAMSYSCONFIGURATION_MEMARCHITECTURESPEC_H #include #include diff --git a/DRAMSys/library/src/common/configuration/memspec/MemPowerSpec.h b/DRAMSys/library/src/common/configuration/memspec/MemPowerSpec.h index 8d125a44..07c2da40 100644 --- a/DRAMSys/library/src/common/configuration/memspec/MemPowerSpec.h +++ b/DRAMSys/library/src/common/configuration/memspec/MemPowerSpec.h @@ -33,8 +33,8 @@ * Derek Christ */ -#ifndef MEMPOWERSPEC_H -#define MEMPOWERSPEC_H +#ifndef DRAMSYSCONFIGURATION_MEMPOWERSPEC_H +#define DRAMSYSCONFIGURATION_MEMPOWERSPEC_H #include #include diff --git a/DRAMSys/library/src/common/configuration/memspec/MemSpec.cpp b/DRAMSys/library/src/common/configuration/memspec/MemSpec.cpp index 29def6d8..e4407cfb 100644 --- a/DRAMSys/library/src/common/configuration/memspec/MemSpec.cpp +++ b/DRAMSys/library/src/common/configuration/memspec/MemSpec.cpp @@ -34,7 +34,6 @@ */ #include "MemSpec.h" -#include "util.h" namespace DRAMSysConfiguration { @@ -44,9 +43,10 @@ void to_json(json &j, const MemSpec &c) j = json{{"memarchitecturespec", c.memArchitectureSpec}, {"memoryId", c.memoryId}, {"memoryType", c.memoryType}, - {"memtimingspec", c.memTimingSpec}}; + {"memtimingspec", c.memTimingSpec}, + {"mempowerspec", c.memPowerSpec}}; - from_optional("mempowerspec", j, c.memPowerSpec); + remove_null_values(j); } void from_json(const json &j, MemSpec &c) @@ -58,7 +58,8 @@ void from_json(const json &j, MemSpec &c) j_memspecs.at("memoryType").get_to(c.memoryType); j_memspecs.at("memtimingspec").get_to(c.memTimingSpec); - get_optional("mempowerspec", j, c.memPowerSpec); + if (j_memspecs.contains("mempowerspec")) + j_memspecs.at("mempowerspec").get_to(c.memPowerSpec); } } // namespace Configuration diff --git a/DRAMSys/library/src/common/configuration/memspec/MemSpec.h b/DRAMSys/library/src/common/configuration/memspec/MemSpec.h index 248709b4..30568d0d 100644 --- a/DRAMSys/library/src/common/configuration/memspec/MemSpec.h +++ b/DRAMSys/library/src/common/configuration/memspec/MemSpec.h @@ -33,12 +33,13 @@ * Derek Christ */ -#ifndef MEMSPEC_H -#define MEMSPEC_H +#ifndef DRAMSYSCONFIGURATION_MEMSPEC_H +#define DRAMSYSCONFIGURATION_MEMSPEC_H #include "MemArchitectureSpec.h" #include "MemPowerSpec.h" #include "MemTimingSpec.h" +#include "util.h" #include @@ -54,7 +55,7 @@ struct MemSpec std::string memoryId; std::string memoryType; MemTimingSpec memTimingSpec; - std::pair memPowerSpec; + Optional memPowerSpec; }; void to_json(json &j, const MemSpec &c); diff --git a/DRAMSys/library/src/common/configuration/memspec/MemTimingSpec.h b/DRAMSys/library/src/common/configuration/memspec/MemTimingSpec.h index 61ba7308..d06898be 100644 --- a/DRAMSys/library/src/common/configuration/memspec/MemTimingSpec.h +++ b/DRAMSys/library/src/common/configuration/memspec/MemTimingSpec.h @@ -33,8 +33,8 @@ * Derek Christ */ -#ifndef MEMTIMINGSPEC_H -#define MEMTIMINGSPEC_H +#ifndef DRAMSYSCONFIGURATION_MEMTIMINGSPEC_H +#define DRAMSYSCONFIGURATION_MEMTIMINGSPEC_H #include #include diff --git a/DRAMSys/library/src/common/configuration/tests/simpletest.cpp b/DRAMSys/library/src/common/configuration/tests/simpletest.cpp index 1be7c5e5..9a4ce6a3 100644 --- a/DRAMSys/library/src/common/configuration/tests/simpletest.cpp +++ b/DRAMSys/library/src/common/configuration/tests/simpletest.cpp @@ -6,13 +6,13 @@ using json = nlohmann::json; DRAMSysConfiguration::AddressMapping getAddressMapping() { - return DRAMSysConfiguration::AddressMapping{{{0, 1}, true}, + return DRAMSysConfiguration::AddressMapping{{{0, 1}}, {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, {16}, - {{13, 14, 15}, true}, + {{13, 14, 15}}, {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, - {{33}, true}, - {{}, false}}; + {{33}}, + {{}}}; } DRAMSysConfiguration::McConfig getMcConfig() @@ -29,14 +29,14 @@ DRAMSysConfiguration::McConfig getMcConfig() DRAMSysConfiguration::PowerDownPolicy::NoPowerDown, DRAMSysConfiguration::Arbiter::Simple, 128, - std::pair{false, true}}; + {}}; } DRAMSysConfiguration::SimConfig getSimConfig() { return DRAMSysConfiguration::SimConfig{ - 0, false, true, false, DRAMSysConfiguration::ECCControllerMode::Disabled, false, "error.csv", - 42, false, "ddr5", true, DRAMSysConfiguration::StoreMode::NoStorage, false, false, + 0, false, true, false, DRAMSysConfiguration::ECCControllerMode::Disabled, false, {"error.csv"}, + 42, false, {"ddr5"}, true, DRAMSysConfiguration::StoreMode::NoStorage, false, false, 1000}; } @@ -74,10 +74,10 @@ std::unique_ptr getTraceGeneratorRandom() gen->name = "MyTestGen"; gen->addressDistribution = DRAMSysConfiguration::AddressDistribution::Random; - gen->maxAddress = {1000, true}; - gen->maxPendingReadRequests = {8, true}; + gen->maxAddress = 1000; + gen->maxPendingReadRequests = 8; gen->rwRatio = 0.5; - gen->seed = {1337, true}; + gen->seed = 1337; gen->numRequests = 1000; return std::unique_ptr(gen); @@ -91,9 +91,9 @@ std::unique_ptr getTraceGeneratorSequentia gen->name = "MyTestGen"; gen->addressDistribution = DRAMSysConfiguration::AddressDistribution::Sequential; - gen->addressIncrement = {64, true}; - gen->maxAddress = {1000, true}; - gen->maxPendingReadRequests = {8, true}; + gen->addressIncrement = 64; + gen->maxAddress = 1000; + gen->maxPendingReadRequests = 8; gen->rwRatio = 0.5; gen->numRequests = 1000; @@ -115,13 +115,13 @@ std::unique_ptr getTraceHammer() DRAMSysConfiguration::TraceSetup getTraceSetup() { - std::unordered_set> initiators; + std::unordered_set> initiators; initiators.emplace(getTracePlayer()); initiators.emplace(getTraceGeneratorRandom()); initiators.emplace(getTraceGeneratorSequential()); initiators.emplace(getTraceHammer()); - return DRAMSysConfiguration::TraceSetup{std::move(initiators)}; + return DRAMSysConfiguration::TraceSetup{initiators}; } DRAMSysConfiguration::Configuration getConfig(const DRAMSysConfiguration::MemSpec &memSpec) @@ -132,9 +132,9 @@ DRAMSysConfiguration::Configuration getConfig(const DRAMSysConfiguration::MemSpe memSpec, getSimConfig(), "std::string_simulationId", - {getThermalConfig(), true}, + getThermalConfig(), // {{}, false}, works too - {getTraceSetup(), true}, + getTraceSetup(), }; } diff --git a/DRAMSys/library/src/common/configuration/util.h b/DRAMSys/library/src/common/configuration/util.h index 113c3265..c6090fa3 100644 --- a/DRAMSys/library/src/common/configuration/util.h +++ b/DRAMSys/library/src/common/configuration/util.h @@ -33,8 +33,8 @@ * Derek Christ */ -#ifndef UTIL_H -#define UTIL_H +#ifndef DRAMSYSCONFIGURATION_UTIL_H +#define DRAMSYSCONFIGURATION_UTIL_H #include #include @@ -43,35 +43,91 @@ namespace DRAMSysConfiguration { using json = nlohmann::json; -/** - * Inspired from https://github.com/nlohmann/json/issues/1749#issuecomment-770748811 - */ template -void get_optional(const std::string &name, const json &j, std::pair &val) +class Optional : public std::pair { - auto it = j.find(name); - if (it != j.end()) +public: + Optional() : std::pair{{}, false} { - val.first = it->template get(); - val.second = true; } - else + Optional(const T &v) : std::pair{v, true} { - val.second = false; } -} + + bool isValid() const + { + return this->second; + } + + const T &getValue() const + { + assert(this->second == true); + return this->first; + } + + void setValue(const T &v) + { + this->first = v; + this->second = true; + } + + void invalidate() + { + this->second = false; + } +}; template -void from_optional(const std::string &name, json &j, const std::pair &val) +void invalidateEnum(T &value) { - if (val.second) - { - j[name] = val.first; - } + if (value.isValid() && value.getValue() == T::first_type::Invalid) + value.invalidate(); } json get_config_json(const json &j, const std::string &configPath, const std::string &objectName); +inline void remove_null_values(json &j) +{ + std::vector keysToRemove; + + for (const auto &element : j.items()) + { + if (element.value() == nullptr) + keysToRemove.emplace_back(element.key()); + } + + std::for_each(keysToRemove.begin(), keysToRemove.end(), [&](const std::string &key) { j.erase(key); }); +} + } // namespace DRAMSysConfiguration +/** + * Inspired from + * https://json.nlohmann.me/features/arbitrary_types/#how-can-i-use-get-for-non-default-constructiblenon-copyable-types + */ +namespace nlohmann +{ + +template +void to_json(nlohmann::json &j, const DRAMSysConfiguration::Optional &v) +{ + if (v.isValid()) + j = v.getValue(); + else + j = nullptr; +} + +template +void from_json(const nlohmann::json &j, DRAMSysConfiguration::Optional &v) +{ + if (j.is_null()) + v = {}; + else + { + v = {j.get()}; + } +} + +} // namespace nlohmann + #endif