Implement Json serializing/deserializing for new state machines
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user