SDC: Refactor and remove unused code
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/sdc-plugin/buffers.cc b/sdc-plugin/buffers.cc
index 919de28..af28eaf 100644
--- a/sdc-plugin/buffers.cc
+++ b/sdc-plugin/buffers.cc
@@ -25,7 +25,9 @@
const float Pll::delay = 0;
const std::string Pll::name = "PLLE2_ADV";
-Pll::Pll(RTLIL::Cell* cell, float input_clock_period, float input_clock_rising_edge) {
+Pll::Pll(RTLIL::Cell* cell, float input_clock_period, float input_clock_rising_edge)
+ : ClockDivider({"PLLE2_ADV"})
+{
assert(RTLIL::unescape_id(cell->type) == "PLLE2_ADV");
FetchParams(cell);
CheckInputClockPeriod(cell, input_clock_period);
diff --git a/sdc-plugin/buffers.h b/sdc-plugin/buffers.h
index 5f51535..b0ab049 100644
--- a/sdc-plugin/buffers.h
+++ b/sdc-plugin/buffers.h
@@ -26,10 +26,10 @@
USING_YOSYS_NAMESPACE
struct Buffer {
- Buffer(float delay, const std::string& name, const std::string& output)
- : delay(delay), name(name), output(output) {}
+ Buffer(float delay, const std::string& type, const std::string& output)
+ : delay(delay), type(type), output(output) {}
float delay;
- std::string name;
+ std::string type;
std::string output;
};
@@ -41,7 +41,12 @@
Bufg() : Buffer(0, "BUFG", "O"){};
};
-struct Pll {
+struct ClockDivider {
+ std::string type;
+};
+
+struct Pll: public ClockDivider {
+ Pll():ClockDivider({"PLLE2_ADV"}){}
Pll(RTLIL::Cell* cell, float input_clock_period, float input_clock_rising_edge);
// Helper function to fetch a cell parameter or return a default value
diff --git a/sdc-plugin/clocks.cc b/sdc-plugin/clocks.cc
index 3a856c3..2c12ccd 100644
--- a/sdc-plugin/clocks.cc
+++ b/sdc-plugin/clocks.cc
@@ -23,6 +23,48 @@
#include "kernel/register.h"
#include "propagation.h"
+float Clock::Period(RTLIL::Wire* clock_wire) {
+ if (!clock_wire->has_attribute(RTLIL::escape_id("PERIOD"))) {
+ log_warning("Period has not been specified\n Default value 0 will be used\n");
+ return 0;
+ }
+ return std::stof(clock_wire->get_string_attribute(RTLIL::escape_id("PERIOD")));
+}
+
+std::pair<float, float> Clock::Waveform(RTLIL::Wire* clock_wire) {
+ if (!clock_wire->has_attribute(RTLIL::escape_id("WAVEFORM"))) {
+ float period(Period(clock_wire));
+ if (!period) {
+ log_cmd_error("Neither PERIOD nor WAVEFORM has been specified for wire %s\n", ClockWireName(clock_wire).c_str());
+ return std::make_pair(0,0);
+ }
+ float falling_edge = period / 2;
+ log_warning("Waveform has not been specified\n Default value {0 %f} will be used\n", falling_edge);
+ return std::make_pair(0, falling_edge);
+ }
+ float rising_edge(0);
+ float falling_edge(0);
+ std::string waveform(clock_wire->get_string_attribute(RTLIL::escape_id("WAVEFORM")));
+ std::sscanf(waveform.c_str(), "%f %f", &rising_edge, &falling_edge);
+ return std::make_pair(rising_edge, falling_edge);
+}
+
+float Clock::RisingEdge(RTLIL::Wire* clock_wire) {
+ return Waveform(clock_wire).first;
+}
+
+float Clock::FallingEdge(RTLIL::Wire* clock_wire) {
+ return Waveform(clock_wire).second;
+}
+
+std::string Clock::ClockWireName(RTLIL::Wire* wire) {
+ if (!wire) {
+ return std::string();
+ }
+ std::string wire_name(RTLIL::unescape_id(wire->name));
+ return std::regex_replace(wire_name, std::regex{"\\$"}, "\\$");
+}
+
void Clocks::AddClock(const std::string& name, std::vector<RTLIL::Wire*> wires,
float period, float rising_edge, float falling_edge) {
std::for_each(wires.begin(), wires.end(), [&](RTLIL::Wire* wire) {
@@ -97,13 +139,8 @@
#ifdef SDC_DEBUG
log("Start clock divider clock propagation\n");
#endif
- for (auto& clock_wire : Clocks::GetClocks(design)) {
-#ifdef SDC_DEBUG
- log("Processing clock %s\n", RTLIL::id2cstr(clock_wire->name));
-#endif
- pass->PropagateClocksForCellType(clock_wire, "PLLE2_ADV");
- PropagateThroughBuffers(pass, design, Bufg());
- }
+ PropagateThroughClockDividers(pass, design, Pll());
+ PropagateThroughBuffers(pass, design, Bufg());
#ifdef SDC_DEBUG
log("Finish clock divider clock propagation\n\n");
#endif
@@ -115,12 +152,12 @@
#ifdef SDC_DEBUG
log("Clock wire %s\n", Clock::ClockWireName(clock_wire).c_str());
#endif
- auto buf_wires = pass->FindSinkWiresForCellType(clock_wire, buffer.name,
+ auto buf_wires = pass->FindSinkWiresForCellType(clock_wire, buffer.type,
buffer.output);
int path_delay(0);
for (auto wire : buf_wires) {
#ifdef SDC_DEBUG
- log("%s wire: %s\n", buffer.name.c_str(),
+ log("%s wire: %s\n", buffer.type.c_str(),
RTLIL::id2cstr(wire->name));
#endif
path_delay += buffer.delay;
@@ -131,90 +168,12 @@
}
}
-Clock::Clock(const std::string& name, RTLIL::Wire* wire, float period,
- float rising_edge, float falling_edge)
- : name_(name),
- period_(period),
- rising_edge_(rising_edge),
- falling_edge_(falling_edge) {
- UpdateWires(wire);
-}
-
-Clock::Clock(const std::string& name, std::vector<RTLIL::Wire*> wires,
- float period, float rising_edge, float falling_edge)
- : name_(name),
- period_(period),
- rising_edge_(rising_edge),
- falling_edge_(falling_edge) {
- std::for_each(wires.begin(), wires.end(),
- [&, this](RTLIL::Wire* wire) { UpdateWires(wire); });
-}
-
-Clock::Clock(RTLIL::Wire* wire, float period,
- float rising_edge, float falling_edge)
- : Clock(RTLIL::unescape_id(wire->name), wire, period, rising_edge, falling_edge) {}
-
-float Clock::Period(RTLIL::Wire* clock_wire) {
- if (!clock_wire->has_attribute(RTLIL::escape_id("PERIOD"))) {
- log_warning("Period has not been specified\n Default value 0 will be used\n");
- return 0;
+void Clocks::PropagateThroughClockDividers(ClockDividerPropagation* pass, RTLIL::Design* design,
+ ClockDivider divider) {
+ for (auto& clock_wire : Clocks::GetClocks(design)) {
+#ifdef SDC_DEBUG
+ log("Processing clock %s\n", Clock::ClockWireName(clock_wire).c_str());
+#endif
+ pass->PropagateClocksForCellType(clock_wire, divider.type);
}
- return std::stof(clock_wire->get_string_attribute(RTLIL::escape_id("PERIOD")));
-}
-
-std::pair<float, float> Clock::Waveform(RTLIL::Wire* clock_wire) {
- if (!clock_wire->has_attribute(RTLIL::escape_id("WAVEFORM"))) {
- float period(Period(clock_wire));
- if (!period) {
- log_cmd_error("Neither PERIOD nor WAVEFORM has been specified for wire %s\n", ClockWireName(clock_wire).c_str());
- return std::make_pair(0,0);
- }
- float falling_edge = period / 2;
- log_warning("Waveform has not been specified\n Default value {0 %f} will be used\n", falling_edge);
- return std::make_pair(0, falling_edge);
- }
- float rising_edge(0);
- float falling_edge(0);
- std::string waveform(clock_wire->get_string_attribute(RTLIL::escape_id("WAVEFORM")));
- std::sscanf(waveform.c_str(), "%f %f", &rising_edge, &falling_edge);
- return std::make_pair(rising_edge, falling_edge);
-}
-
-float Clock::RisingEdge(RTLIL::Wire* clock_wire) {
- return Waveform(clock_wire).first;
-}
-
-float Clock::FallingEdge(RTLIL::Wire* clock_wire) {
- return Waveform(clock_wire).second;
-}
-
-void Clock::UpdateClock(RTLIL::Wire* wire, float period, float rising_edge,
- float falling_edge) {
- UpdateWires(wire);
- UpdatePeriod(period);
- UpdateWaveform(rising_edge, falling_edge);
-}
-
-void Clock::UpdateWires(RTLIL::Wire* wire) {
- if (std::find(clock_wires_.begin(), clock_wires_.end(), wire) ==
- clock_wires_.end()) {
- clock_wires_.push_back(wire);
- }
-}
-
-void Clock::UpdatePeriod(float period) {
- period_ = period;
-}
-
-void Clock::UpdateWaveform(float rising_edge, float falling_edge) {
- rising_edge_ = fmod(rising_edge, period_);
- falling_edge_ = fmod(falling_edge, period_);
-}
-
-std::string Clock::ClockWireName(RTLIL::Wire* wire) {
- if (!wire) {
- return std::string();
- }
- std::string wire_name(RTLIL::unescape_id(wire->name));
- return std::regex_replace(wire_name, std::regex{"\\$"}, "\\$");
}
diff --git a/sdc-plugin/clocks.h b/sdc-plugin/clocks.h
index 9a74b4a..4b8a9e4 100644
--- a/sdc-plugin/clocks.h
+++ b/sdc-plugin/clocks.h
@@ -31,36 +31,13 @@
class Clock {
public:
- Clock(const std::string& name, RTLIL::Wire* wire, float period,
- float rising_edge, float falling_edge);
- Clock(const std::string& name, std::vector<RTLIL::Wire*> wires,
- float period, float rising_edge, float falling_edge);
- Clock(RTLIL::Wire* wire, float period,
- float rising_edge, float falling_edge);
- std::vector<RTLIL::Wire*> GetClockWires() { return clock_wires_; }
- const std::string& Name() const { return name_; }
static float Period(RTLIL::Wire* clock_wire);
- float RisingEdge() { return rising_edge_; }
static float RisingEdge(RTLIL::Wire* clock_wire);
- float FallingEdge() { return falling_edge_; }
static float FallingEdge(RTLIL::Wire* clock_wire);
- RTLIL::Wire* ClockWire() { return clock_wire_; }
- void UpdateClock(RTLIL::Wire* wire, float period, float rising_edge,
- float falling_edge);
static std::string ClockWireName(RTLIL::Wire* wire);
private:
- std::string name_;
- std::vector<RTLIL::Wire*> clock_wires_;
- RTLIL::Wire* clock_wire_;
- float period_;
- float rising_edge_;
- float falling_edge_;
-
static std::pair<float, float> Waveform(RTLIL::Wire* clock_wire);
- void UpdateWires(RTLIL::Wire* wire);
- void UpdatePeriod(float period);
- void UpdateWaveform(float rising_edge, float falling_edge);
};
class Clocks {
@@ -79,6 +56,8 @@
private:
void PropagateThroughBuffers(Propagation* pass, RTLIL::Design* design,
Buffer buffer);
+ void PropagateThroughClockDividers(ClockDividerPropagation* pass, RTLIL::Design* design,
+ ClockDivider divider);
};
#endif // _CLOCKS_H_