Implement Json serializing/deserializing for new state machines

This commit is contained in:
2021-12-13 10:45:20 +01:00
parent de4cb1be66
commit 7127a753af
4 changed files with 148 additions and 37 deletions

View File

@@ -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);
}

View File

@@ -59,13 +59,51 @@ void to_json(json &j, const TraceSetup &c)
if (const auto generator = dynamic_cast<TraceGenerator *>(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<TraceHammer *>(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<unsigned int, TraceGeneratorState> {
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<TraceGenerator>(generator);
}

View File

@@ -83,17 +83,30 @@ struct TracePlayer : public TrafficInitiator
{
};
struct TraceGenerator : public TrafficInitiator
struct TraceGeneratorState
{
uint64_t numRequests;
double rwRatio;
AddressDistribution addressDistribution;
Optional<uint64_t> addressIncrement;
Optional<uint64_t> seed;
Optional<uint64_t> minAddress;
Optional<uint64_t> maxAddress;
};
struct TraceGeneratorStateTransition
{
unsigned int from;
unsigned int to;
float propability;
};
struct TraceGenerator : public TrafficInitiator
{
Optional<uint64_t> seed;
std::map<unsigned int, TraceGeneratorState> states;
std::vector<TraceGeneratorStateTransition> transitions;
};
struct TraceHammer : public TrafficInitiator
{
uint64_t numRequests;

View File

@@ -104,36 +104,63 @@ std::unique_ptr<DRAMSysConfiguration::TracePlayer> getTracePlayer()
return std::unique_ptr<DRAMSysConfiguration::TracePlayer>(player);
}
std::unique_ptr<DRAMSysConfiguration::TraceGenerator> getTraceGeneratorRandom()
std::unique_ptr<DRAMSysConfiguration::TraceGenerator> 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<DRAMSysConfiguration::TraceGenerator>(gen);
}
std::unique_ptr<DRAMSysConfiguration::TraceGenerator> getTraceGeneratorSequential()
std::unique_ptr<DRAMSysConfiguration::TraceGenerator> 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<DRAMSysConfiguration::TraceGenerator>(gen);
}
@@ -155,8 +182,8 @@ DRAMSysConfiguration::TraceSetup getTraceSetup()
{
std::vector<std::shared_ptr<DRAMSysConfiguration::TrafficInitiator>> 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<DRAMSysConfiguration::Configuration>();
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);