SDC: Update SdcWriter class to write set_max_delay commands Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/sdc-plugin/Makefile b/sdc-plugin/Makefile index 3089554..0c9461d 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 sdc_writer.o set_false_path.o +OBJS = buffers.o clocks.o propagation.o sdc.o sdc_writer.o set_false_path.o set_max_delay.o sdc.so: $(OBJS) $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared -o $@ $^ $(LDLIBS)
diff --git a/sdc-plugin/sdc.cc b/sdc-plugin/sdc.cc index 5f8cad1..df09526 100644 --- a/sdc-plugin/sdc.cc +++ b/sdc-plugin/sdc.cc
@@ -22,6 +22,7 @@ #include "kernel/rtlil.h" #include "propagation.h" #include "set_false_path.h" +#include "set_max_delay.h" #include "sdc_writer.h" USING_YOSYS_NAMESPACE @@ -253,7 +254,8 @@ create_clock_cmd_(clocks_), get_clocks_cmd_(clocks_), propagate_clocks_cmd_(clocks_), - set_false_path_cmd_(sdc_writer_) { + set_false_path_cmd_(sdc_writer_), + set_max_delay_cmd_(sdc_writer_) { log("Loaded SDC plugin\n"); } @@ -263,6 +265,7 @@ GetClocksCmd get_clocks_cmd_; PropagateClocksCmd propagate_clocks_cmd_; SetFalsePath set_false_path_cmd_; + SetMaxDelay set_max_delay_cmd_; private: Clocks clocks_;
diff --git a/sdc-plugin/sdc_writer.cc b/sdc-plugin/sdc_writer.cc index daae7e2..3c106d3 100644 --- a/sdc-plugin/sdc_writer.cc +++ b/sdc-plugin/sdc_writer.cc
@@ -23,9 +23,14 @@ false_paths_.push_back(false_path); } +void SdcWriter::SetMaxDelay(TimingPath timing_path) { + timing_paths_.push_back(timing_path); +} + void SdcWriter::WriteSdc(Clocks& clocks, std::ostream& file) { WriteClocks(clocks, file); WriteFalsePaths(file); + WriteMaxDelay(file); } void SdcWriter::WriteClocks(Clocks& clocks, std::ostream& file) { @@ -61,3 +66,16 @@ file << std::endl; } } + +void SdcWriter::WriteMaxDelay(std::ostream& file) { + for (auto path : timing_paths_) { + file << "set_max_delay " << path.max_delay; + 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 index f5f18b3..5620841 100644 --- a/sdc-plugin/sdc_writer.h +++ b/sdc-plugin/sdc_writer.h
@@ -26,16 +26,25 @@ std::string to_pin; }; +struct TimingPath { + std::string from_pin; + std::string to_pin; + float max_delay; +}; + class SdcWriter { public: void AddFalsePath(FalsePath false_path); + void SetMaxDelay(TimingPath timing_path); void WriteSdc(Clocks& clocks, std::ostream& file); private: void WriteClocks(Clocks& clocks, std::ostream& file); void WriteFalsePaths(std::ostream& file); + void WriteMaxDelay(std::ostream& file); std::vector<FalsePath> false_paths_; + std::vector<TimingPath> timing_paths_; }; #endif // _SDC_WRITER_H_