14 #include "rapidjson/filereadstream.h"
17 GroupingSerializer* GroupingSerializer::instance =
new GroupingSerializer();
25 std::filesystem::path groupingFilePath(savedir);
26 groupingFilePath.append(
"groupings.json");
35 grpObj[
"id"] = (int)grp->get_id();
36 grpObj[
"name"] = grp->get_name();
39 std::vector<Module*> sortMod = grp->get_modules();
40 std::sort(sortMod.begin(), sortMod.end(), [](
Module* lhs,
Module* rhs) { return lhs->get_id() < rhs->get_id(); });
41 for (
const Module* m : sortMod)
42 grpMod << m->get_id();
46 std::vector<Gate*> sortGat = grp->get_gates();
47 std::sort(sortGat.begin(), sortGat.end(), [](
Gate* lhs,
Gate* rhs) { return lhs->get_id() < rhs->get_id(); });
48 for (
const Gate*
g : sortGat)
49 grpGat <<
g->get_id();
53 std::vector<Net*> sortNet = grp->get_nets();
54 std::sort(sortNet.begin(), sortNet.end(), [](
Net* lhs,
Net* rhs) { return lhs->get_id() < rhs->get_id(); });
55 for (
const Net*
n : sortNet)
56 grpNet <<
n->get_id();
66 return groupingFilePath.filename().string();
72 if (relname.empty())
return;
73 std::filesystem::path groupingFilePath(loaddir);
74 groupingFilePath.append(relname);
76 FILE* grpFile = fopen(groupingFilePath.string().c_str(),
"rb");
79 log_error(
"GroupingSerializer::deserialize",
"unable to open '{}'.", groupingFilePath.string());
84 rapidjson::FileReadStream frs(grpFile, buffer,
sizeof(buffer));
85 rapidjson::Document document;
86 document.ParseStream<0, rapidjson::UTF8<>, rapidjson::FileReadStream>(frs);
88 if (document.HasMember(
"groupings"))
90 for (
const rapidjson::Value& grpVal : document[
"groupings"].GetArray())
92 Grouping* grouping =
netlist->create_grouping(grpVal[
"id"].GetUint(), grpVal[
"name"].GetString());
93 if (grouping ==
nullptr)
98 if (grpVal.HasMember(
"modules"))
100 for (
auto& module_node : grpVal[
"modules"].GetArray())
106 if (grpVal.HasMember(
"gates"))
108 for (
auto& gate_node : grpVal[
"gates"].GetArray())
114 if (grpVal.HasMember(
"nets"))
116 for (
auto& net_node : grpVal[
"nets"].GetArray())
bool assign_module(Module *module, bool force=false)
bool assign_gate(Gate *gate, bool force=false)
bool assign_net(Net *net, bool force=false)
std::string serialize(Netlist *netlist, const std::filesystem::path &savedir, bool isAutosave) override
void deserialize(Netlist *netlist, const std::filesystem::path &loaddir) override
JsonWriteObject & add_object()
bool serialize(const std::string &filename)
JsonWriteArray & add_array(const std::string &tag)
static ProjectManager * instance()
std::string get_filename(const std::string &serializer_name)
#define log_error(channel,...)