From 7127a753af2c998fa36cc8866e919a48987566db Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Mon, 13 Dec 2021 10:45:20 +0100 Subject: [PATCH] Implement Json serializing/deserializing for new state machines --- .../common/configuration/ThermalConfig.cpp | 1 + .../src/common/configuration/TraceSetup.cpp | 104 +++++++++++++++--- .../src/common/configuration/TraceSetup.h | 17 ++- .../common/configuration/tests/simpletest.cpp | 63 ++++++++--- 4 files changed, 148 insertions(+), 37 deletions(-) diff --git a/DRAMSys/library/src/common/configuration/ThermalConfig.cpp b/DRAMSys/library/src/common/configuration/ThermalConfig.cpp index fdcbd0e2..f3bed414 100644 --- a/DRAMSys/library/src/common/configuration/ThermalConfig.cpp +++ b/DRAMSys/library/src/common/configuration/ThermalConfig.cpp @@ -100,6 +100,7 @@ void from_json(const json &j, PowerInfo &c) { DramDieChannel channel; j_powerinfo.at(entry.key()).get_to(channel); + channel.identifier = entry.key(); c.channels.push_back(channel); } diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.cpp b/DRAMSys/library/src/common/configuration/TraceSetup.cpp index 9d39a78f..9ead2a50 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.cpp +++ b/DRAMSys/library/src/common/configuration/TraceSetup.cpp @@ -59,13 +59,51 @@ void to_json(json &j, const TraceSetup &c) if (const auto generator = dynamic_cast(initiator.get())) { initiator_j["type"] = "generator"; - initiator_j["numRequests"] = generator->numRequests; - initiator_j["rwRatio"] = generator->rwRatio; - initiator_j["addressDistribution"] = generator->addressDistribution; - initiator_j["addressIncrement"] = generator->addressIncrement; initiator_j["seed"] = generator->seed; - initiator_j["minAddress"] = generator->minAddress; - initiator_j["maxAddress"] = generator->maxAddress; + + // When there are less than 2 states, flatten out the json. + if (generator->states.size() == 1) + { + const auto &state = generator->states[0]; + initiator_j["numRequests"] = state.numRequests; + initiator_j["rwRatio"] = state.rwRatio; + initiator_j["addressDistribution"] = state.addressDistribution; + initiator_j["addressIncrement"] = state.addressIncrement; + initiator_j["minAddress"] = state.minAddress; + initiator_j["maxAddress"] = state.maxAddress; + } + else + { + json states_j = json::array(); + + for (const auto &state : generator->states) + { + json state_j; + state_j["id"] = state.first; + state_j["numRequests"] = state.second.numRequests; + state_j["rwRatio"] = state.second.rwRatio; + state_j["addressDistribution"] = state.second.addressDistribution; + state_j["addressIncrement"] = state.second.addressIncrement; + state_j["minAddress"] = state.second.minAddress; + state_j["maxAddress"] = state.second.maxAddress; + remove_null_values(state_j); + states_j.insert(states_j.end(), state_j); + } + initiator_j["states"] = states_j; + + json transitions_j = json::array(); + + for (const auto &transition : generator->transitions) + { + json transition_j; + transition_j["from"] = transition.from; + transition_j["to"] = transition.to; + transition_j["propability"] = transition.propability; + remove_null_values(transition_j); + transitions_j.insert(transitions_j.end(), transition_j); + } + initiator_j["transitions"] = transitions_j; + } } else if (const auto hammer = dynamic_cast(initiator.get())) { @@ -99,21 +137,53 @@ void from_json(const json &j, TraceSetup &c) { TraceGenerator *generator = new TraceGenerator; - initiator_j.at("numRequests").get_to(generator->numRequests); - initiator_j.at("rwRatio").get_to(generator->rwRatio); - initiator_j.at("addressDistribution").get_to(generator->addressDistribution); + auto process_state = [](const json &state_j) -> std::pair { + TraceGeneratorState state {}; - if (initiator_j.contains("addressIncrement")) - initiator_j.at("addressIncrement").get_to(generator->addressIncrement); + state_j.at("numRequests").get_to(state.numRequests); + state_j.at("rwRatio").get_to(state.rwRatio); + state_j.at("addressDistribution").get_to(state.addressDistribution); - if (initiator_j.contains("seed")) - initiator_j.at("seed").get_to(generator->seed); + if (state_j.contains("addressIncrement")) + state_j.at("addressIncrement").get_to(state.addressIncrement); - if (initiator_j.contains("minAddress")) - initiator_j.at("minAddress").get_to(generator->minAddress); + if (state_j.contains("minAddress")) + state_j.at("minAddress").get_to(state.minAddress); - if (initiator_j.contains("maxAddress")) - initiator_j.at("maxAddress").get_to(generator->maxAddress); + if (state_j.contains("maxAddress")) + state_j.at("maxAddress").get_to(state.maxAddress); + + // Default to 0 + unsigned int id = 0; + + if (state_j.contains("id")) + id = state_j.at("id"); + + return {id, state}; + }; + + if (initiator_j.contains("states")) + { + for (const auto &state_j : initiator_j.at("states")) + { + auto state = process_state(state_j); + generator->states[state.first] = state.second; + } + + for (const auto &transition_j : initiator_j.at("transitions")) + { + TraceGeneratorStateTransition transition; + transition.from = transition_j.at("from"); + transition.to = transition_j.at("to"); + transition.propability = transition_j.at("propability"); + generator->transitions.push_back(transition); + } + } + else // Only one state will be created + { + auto state = process_state(initiator_j); + generator->states[state.first] = state.second; + } initiator = std::unique_ptr(generator); } diff --git a/DRAMSys/library/src/common/configuration/TraceSetup.h b/DRAMSys/library/src/common/configuration/TraceSetup.h index edc61d8c..4d094286 100644 --- a/DRAMSys/library/src/common/configuration/TraceSetup.h +++ b/DRAMSys/library/src/common/configuration/TraceSetup.h @@ -83,17 +83,30 @@ struct TracePlayer : public TrafficInitiator { }; -struct TraceGenerator : public TrafficInitiator +struct TraceGeneratorState { uint64_t numRequests; double rwRatio; AddressDistribution addressDistribution; Optional addressIncrement; - Optional seed; Optional minAddress; Optional maxAddress; }; +struct TraceGeneratorStateTransition +{ + unsigned int from; + unsigned int to; + float propability; +}; + +struct TraceGenerator : public TrafficInitiator +{ + Optional seed; + std::map states; + std::vector transitions; +}; + struct TraceHammer : public TrafficInitiator { uint64_t numRequests; diff --git a/DRAMSys/library/src/common/configuration/tests/simpletest.cpp b/DRAMSys/library/src/common/configuration/tests/simpletest.cpp index de8ff9a4..e1823bbe 100644 --- a/DRAMSys/library/src/common/configuration/tests/simpletest.cpp +++ b/DRAMSys/library/src/common/configuration/tests/simpletest.cpp @@ -104,36 +104,63 @@ std::unique_ptr getTracePlayer() return std::unique_ptr(player); } -std::unique_ptr getTraceGeneratorRandom() +std::unique_ptr getTraceGeneratorOneState() { DRAMSysConfiguration::TraceGenerator *gen = new DRAMSysConfiguration::TraceGenerator; gen->clkMhz = 100; gen->name = "MyTestGen"; - gen->addressDistribution = DRAMSysConfiguration::AddressDistribution::Random; - gen->maxAddress = 1000; - gen->maxPendingReadRequests = 8; - gen->rwRatio = 0.5; - gen->seed = 1337; - gen->numRequests = 1000; + DRAMSysConfiguration::TraceGeneratorState state0 { + 1000, + 0.5, + DRAMSysConfiguration::AddressDistribution::Random, + {}, + {}, + {} + }; + + gen->states[0] = state0; return std::unique_ptr(gen); } -std::unique_ptr getTraceGeneratorSequential() +std::unique_ptr getTraceGeneratorMultipleStates() { DRAMSysConfiguration::TraceGenerator *gen = new DRAMSysConfiguration::TraceGenerator; gen->clkMhz = 100; gen->name = "MyTestGen"; - - gen->addressDistribution = DRAMSysConfiguration::AddressDistribution::Sequential; - gen->addressIncrement = 64; - gen->maxAddress = 1000; gen->maxPendingReadRequests = 8; - gen->rwRatio = 0.5; - gen->numRequests = 1000; + + DRAMSysConfiguration::TraceGeneratorState state0 { + 1000, + 0.5, + DRAMSysConfiguration::AddressDistribution::Sequential, + {256}, + {}, + {1024} + }; + + DRAMSysConfiguration::TraceGeneratorState state1 { + 100, + 0.75, + DRAMSysConfiguration::AddressDistribution::Sequential, + {512}, + {1024}, + {2048} + }; + + gen->states[0] = state0; + gen->states[1] = state1; + + DRAMSysConfiguration::TraceGeneratorStateTransition transistion0 { + 0, + 1, + 1.0 + }; + + gen->transitions.push_back(transistion0); return std::unique_ptr(gen); } @@ -155,8 +182,8 @@ DRAMSysConfiguration::TraceSetup getTraceSetup() { std::vector> initiators; initiators.emplace_back(getTracePlayer()); - initiators.emplace_back(getTraceGeneratorRandom()); - initiators.emplace_back(getTraceGeneratorSequential()); + initiators.emplace_back(getTraceGeneratorOneState()); + initiators.emplace_back(getTraceGeneratorMultipleStates()); initiators.emplace_back(getTraceHammer()); return DRAMSysConfiguration::TraceSetup{initiators}; @@ -193,11 +220,11 @@ int main() j_myhbm2["simulation"] = hbm2conf; filehbm2 << j_myhbm2.dump(4); - std::ifstream file3("old_conf.json"); + std::ifstream file3("myjson.json"); json ddr5_old = json::parse(file3, nullptr, false); json ddr5_old_conf = ddr5_old.at("simulation"); DRAMSysConfiguration::Configuration ddr5_old_config = ddr5_old_conf.get(); - std::ofstream fileoldout("old_conf_converted.json"); + std::ofstream fileoldout("myjson2.json"); json j_oldconfconv; j_oldconfconv["simulation"] = ddr5_old_config; fileoldout << j_oldconfconv.dump(4);