diff --git a/src/Silisizer.cpp b/src/Silisizer.cpp index f8393fc..eeef88f 100644 --- a/src/Silisizer.cpp +++ b/src/Silisizer.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "sta/Liberty.hh" #include "sta/Network.hh" @@ -284,4 +285,49 @@ int Silisizer::silisize(const char *workdir) { return 0; } +// Remove escape characters from JSON output +static std::string jsonName(const char *s) { + std::string out; + for (; *s; ++s) if (*s != '\\') out.push_back(*s); + return out; +} + +// JSON dumper for clock gating related instances +void dumpIcgJson(const char *path) { + sta::Sta *sta = sta::Sta::sta(); + sta::Network *network = sta->network(); + + std::ofstream f(path); + if (!f.good()) { + std::cerr << "dump_icg_json: cannot open " << path << " for write" << std::endl; + return; + } + + // Dump gated registers. + f << "{\n \"gated_flops\": ["; + bool first = true; + for (const sta::Instance *reg : sta->clockGatedRegisters()) { + if (!first) f << ","; + f << "\n \"" << jsonName(network->pathName(reg)) << "\""; + first = false; + } + f << (first ? "" : "\n ") << "],\n \"icgs\": {"; + + // Dump clock-gating instances mapped to their liberty cell names. + first = true; + std::unique_ptr it(network->leafInstanceIterator()); + while (it->hasNext()) { + sta::Instance *inst = it->next(); + sta::Cell *cell = network->cell(inst); + if (!cell) continue; + sta::LibertyCell *lc = network->libertyCell(cell); + if (!lc || !lc->isClockGate()) continue; + if (!first) f << ","; + f << "\n \"" << jsonName(network->pathName(inst)) + << "\": \"" << jsonName(lc->name()) << "\""; + first = false; + } + f << (first ? "" : "\n ") << "}\n}\n"; +} + } // namespace silisizer diff --git a/src/Silisizer.h b/src/Silisizer.h index 7963f30..5b50ea1 100644 --- a/src/Silisizer.h +++ b/src/Silisizer.h @@ -24,4 +24,6 @@ class Silisizer : public sta::Sta { int silisize(const char *workdir); }; +void dumpIcgJson(const char *path); + } // namespace silisizer diff --git a/src/Silisizer.i b/src/Silisizer.i index 891ddc4..63231ce 100644 --- a/src/Silisizer.i +++ b/src/Silisizer.i @@ -19,6 +19,7 @@ %inline %{ extern int silisize(const char *workdir); +extern void dump_icg_json(const char *path); extern void test_abrt(); extern void test_segv(); diff --git a/src/main.cpp b/src/main.cpp index 3524b77..7f08de8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -97,6 +97,10 @@ int silisize(const char *workdir) { return sizer->silisize(workdir); } +void dump_icg_json(const char *path) { + silisizer::dumpIcgJson(path); +} + void segv_call_fn() { int a; a = 6; diff --git a/third_party/OpenSTA b/third_party/OpenSTA index 88863d4..d915202 160000 --- a/third_party/OpenSTA +++ b/third_party/OpenSTA @@ -1 +1 @@ -Subproject commit 88863d432663675731c3f17e35523b99f888efda +Subproject commit d915202ee9719f5f9d8430a2e3299709f18a4ca6