SDC: Implement sdc writer class
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/sdc-plugin/Makefile b/sdc-plugin/Makefile
index b4694ca..3089554 100644
--- a/sdc-plugin/Makefile
+++ b/sdc-plugin/Makefile
@@ -4,7 +4,7 @@
LDLIBS = $(shell yosys-config --ldlibs)
PLUGINS_DIR = $(shell yosys-config --datdir)/plugins
-OBJS = buffers.o clocks.o propagation.o sdc.o
+OBJS = buffers.o clocks.o propagation.o sdc.o sdc_writer.o set_false_path.o
sdc.so: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS)
diff --git a/sdc-plugin/sdc_writer.cc b/sdc-plugin/sdc_writer.cc
new file mode 100644
index 0000000..daae7e2
--- /dev/null
+++ b/sdc-plugin/sdc_writer.cc
@@ -0,0 +1,63 @@
+/*
+ * yosys -- Yosys Open SYnthesis Suite
+ *
+ * Copyright (C) 2020 The Symbiflow Authors
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include "sdc_writer.h"
+
+USING_YOSYS_NAMESPACE
+
+void SdcWriter::AddFalsePath(FalsePath false_path) {
+ false_paths_.push_back(false_path);
+}
+
+void SdcWriter::WriteSdc(Clocks& clocks, std::ostream& file) {
+ WriteClocks(clocks, file);
+ WriteFalsePaths(file);
+}
+
+void SdcWriter::WriteClocks(Clocks& clocks, std::ostream& file) {
+ for (auto clock : clocks.GetClocks()) {
+ auto clock_wires = clock.GetClockWires();
+ // FIXME: Input port nets are not found in VPR
+ if (std::all_of(clock_wires.begin(), clock_wires.end(),
+ [&](RTLIL::Wire* wire) { return wire->port_input; })) {
+ continue;
+ }
+ file << "create_clock -period " << clock.Period();
+ file << " -waveform {" << clock.RisingEdge() << " "
+ << clock.FallingEdge() << "}";
+ for (auto clock_wire : clock_wires) {
+ if (clock_wire->port_input) {
+ continue;
+ }
+ file << " " << Clock::ClockWireName(clock_wire);
+ }
+ file << std::endl;
+ }
+}
+
+void SdcWriter::WriteFalsePaths(std::ostream& file) {
+ for (auto path : false_paths_) {
+ file << "set_false_path";
+ if (!path.from_pin.empty()) {
+ file << " -from " << path.from_pin;
+ }
+ if (!path.to_pin.empty()) {
+ file << " -to " << path.to_pin;
+ }
+ file << std::endl;
+ }
+}
diff --git a/sdc-plugin/sdc_writer.h b/sdc-plugin/sdc_writer.h
new file mode 100644
index 0000000..f5f18b3
--- /dev/null
+++ b/sdc-plugin/sdc_writer.h
@@ -0,0 +1,41 @@
+/*
+ * yosys -- Yosys Open SYnthesis Suite
+ *
+ * Copyright (C) 2020 The Symbiflow Authors
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#ifndef _SDC_WRITER_H_
+#define _SDC_WRITER_H_
+#include "clocks.h"
+
+USING_YOSYS_NAMESPACE
+
+struct FalsePath {
+ std::string from_pin;
+ std::string to_pin;
+};
+
+class SdcWriter {
+ public:
+ void AddFalsePath(FalsePath false_path);
+ void WriteSdc(Clocks& clocks, std::ostream& file);
+
+ private:
+ void WriteClocks(Clocks& clocks, std::ostream& file);
+ void WriteFalsePaths(std::ostream& file);
+
+ std::vector<FalsePath> false_paths_;
+};
+
+#endif // _SDC_WRITER_H_