SDC: Update existing clock instead of replacing with new
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/sdc-plugin/buffers.cc b/sdc-plugin/buffers.cc
index 072efe1..125b549 100644
--- a/sdc-plugin/buffers.cc
+++ b/sdc-plugin/buffers.cc
@@ -18,7 +18,6 @@
#include "buffers.h"
const std::vector<std::string> Pll::inputs = {"CLKIN1", "CLKIN2"};
-const std::vector<std::string> Pll::outputs = {"CLKOUT0", "CLKOUT1", "CLKOUT2",
- "CLKOUT3", "CLKOUT4", "CLKOUT5"};
-const float Pll::delay = 1;
+const std::vector<std::string> Pll::outputs = {"CLKOUT0", "CLKOUT1", "CLKOUT2", "CLKOUT3", "CLKOUT4", "CLKOUT5"};
+const float Pll::delay = 0;
const std::string Pll::name = "PLLE2_ADV";
diff --git a/sdc-plugin/clocks.cc b/sdc-plugin/clocks.cc
index c7f6e9d..dc1dbcf 100644
--- a/sdc-plugin/clocks.cc
+++ b/sdc-plugin/clocks.cc
@@ -33,9 +33,11 @@
[&](Clock& clock) { return clock.Name() == name; });
if (clock != clocks_.end()) {
log("Clock %s already exists and will be overwritten\n", name.c_str());
- clocks_.erase(clock);
+ clock->UpdateClock(wire, period, rising_edge, falling_edge);
+ } else {
+ log("Inserting clock %s with period %f, r:%f, f:%f\n", name.c_str(), period, rising_edge, falling_edge);
+ clocks_.emplace_back(name, wire, period, rising_edge, falling_edge);
}
- clocks_.emplace_back(name, wire, period, rising_edge, falling_edge);
}
void Clocks::AddClock(Clock& clock) {
@@ -145,9 +147,11 @@
Buffer buffer) {
auto clock_wires = clock.GetClockWires();
for (auto clock_wire : clock_wires) {
- log("%s\n", clock_wire->name.c_str());
- auto buf_wires = pass->FindSinkWiresForCellType(clock_wire, buffer.name,
- buffer.output);
+#ifdef SDC_DEBUG
+ log("Clock wire %s\n", RTLIL::unescape_id(clock_wire->name).c_str());
+#endif
+ auto buf_wires = pass->FindSinkWiresForCellType(
+ clock_wire, buffer.name, buffer.output);
int path_delay(0);
for (auto wire : buf_wires) {
#ifdef SDC_DEBUG
@@ -204,6 +208,18 @@
}
}
+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;
rising_edge_ = 0;
diff --git a/sdc-plugin/clocks.h b/sdc-plugin/clocks.h
index 97fe75c..d98d5b4 100644
--- a/sdc-plugin/clocks.h
+++ b/sdc-plugin/clocks.h
@@ -41,8 +41,7 @@
float Period() { return period_; }
float RisingEdge() { return rising_edge_; }
float FallingEdge() { return falling_edge_; }
- void UpdatePeriod(float period);
- void UpdateWaveform(float rising_edge, float falling_edge);
+ void UpdateClock(RTLIL::Wire* wire, float period, float rising_edge, float falling_edge);
private:
std::string name_;
@@ -50,6 +49,10 @@
float period_;
float rising_edge_;
float falling_edge_;
+
+ void UpdateWires(RTLIL::Wire* wire);
+ void UpdatePeriod(float period);
+ void UpdateWaveform(float rising_edge, float falling_edge);
};
class Clocks {
diff --git a/sdc-plugin/sdc.cc b/sdc-plugin/sdc.cc
index d158e5b..73eec15 100644
--- a/sdc-plugin/sdc.cc
+++ b/sdc-plugin/sdc.cc
@@ -104,6 +104,7 @@
RTLIL::Design* design) override {
size_t argidx;
std::string name;
+ bool is_waveform_specified(false);
float rising_edge(0);
float falling_edge(0);
float period(0);
@@ -126,6 +127,7 @@
[](char c) { return c != '{' or c != '}'; });
std::stringstream ss(edges);
ss >> rising_edge >> falling_edge;
+ is_waveform_specified = true;
continue;
}
break;
@@ -159,6 +161,10 @@
if (name.empty()) {
name = RTLIL::unescape_id(selected_wires.at(0)->name);
}
+ if (!is_waveform_specified) {
+ rising_edge = 0;
+ falling_edge = period / 2;
+ }
clocks_.AddClock(name, selected_wires, period, rising_edge,
falling_edge);
log("Created clock %s with period %f, waveform {%f %f}\n", name.c_str(),