SDC: Add include_propagated_clocks switch

Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/sdc-plugin/sdc.cc b/sdc-plugin/sdc.cc
index dd058d9..9f92b48 100644
--- a/sdc-plugin/sdc.cc
+++ b/sdc-plugin/sdc.cc
@@ -67,20 +67,33 @@
     void help() override
     {
         log("\n");
-        log("    write_sdc <filename>\n");
+        log("    write_sdc [-include_propagated_clocks] <filename>\n");
         log("\n");
         log("Write SDC file.\n");
         log("\n");
+        log("    -include_propagated_clocks\n");
+        log("       Write out all propagated clocks");
+        log("\n");
     }
 
     void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) override
     {
+        size_t argidx;
+        bool include_propagated = false;
         if (args.size() < 2) {
             log_cmd_error("Missing output file.\n");
         }
+        for (argidx = 1; argidx < args.size(); argidx++) {
+            std::string arg = args[argidx];
+            if (arg == "-include_propagated_clocks" && argidx + 1 < args.size()) {
+                include_propagated = true;
+                continue;
+            }
+            break;
+        }
         log("\nWriting out clock constraints file(SDC)\n");
-        extra_args(f, filename, args, 1);
-        sdc_writer_.WriteSdc(design, *f);
+        extra_args(f, filename, args, argidx);
+        sdc_writer_.WriteSdc(design, *f, include_propagated);
     }
 
     SdcWriter &sdc_writer_;
diff --git a/sdc-plugin/sdc_writer.cc b/sdc-plugin/sdc_writer.cc
index ed283a6..7004f47 100644
--- a/sdc-plugin/sdc_writer.cc
+++ b/sdc-plugin/sdc_writer.cc
@@ -31,15 +31,15 @@
     clock_groups_.Add(clock_group, relation);
 }
 
-void SdcWriter::WriteSdc(RTLIL::Design *design, std::ostream &file)
+void SdcWriter::WriteSdc(RTLIL::Design *design, std::ostream &file, bool include_propagated)
 {
-    WriteClocks(design, file);
+    WriteClocks(design, file, include_propagated);
     WriteFalsePaths(file);
     WriteMaxDelay(file);
     WriteClockGroups(file);
 }
 
-void SdcWriter::WriteClocks(RTLIL::Design *design, std::ostream &file)
+void SdcWriter::WriteClocks(RTLIL::Design *design, std::ostream &file, bool include_propagated)
 {
     for (auto &clock : Clocks::GetClocks(design)) {
         auto &clock_wire = clock.second;
@@ -48,7 +48,7 @@
             continue;
         }
         // Write out only GENERATED and EXPLICIT clocks
-        if (Clock::IsPropagated(clock_wire)) {
+        if (Clock::IsPropagated(clock_wire) and !include_propagated) {
             continue;
         }
         file << "create_clock -period " << Clock::Period(clock_wire);
diff --git a/sdc-plugin/sdc_writer.h b/sdc-plugin/sdc_writer.h
index ec503a7..224f18a 100644
--- a/sdc-plugin/sdc_writer.h
+++ b/sdc-plugin/sdc_writer.h
@@ -59,10 +59,10 @@
     void AddFalsePath(FalsePath false_path);
     void SetMaxDelay(TimingPath timing_path);
     void AddClockGroup(ClockGroups::ClockGroup clock_group, ClockGroups::ClockGroupRelation relation);
-    void WriteSdc(RTLIL::Design *design, std::ostream &file);
+    void WriteSdc(RTLIL::Design *design, std::ostream &file, bool include_propagated);
 
   private:
-    void WriteClocks(RTLIL::Design *design, std::ostream &file);
+    void WriteClocks(RTLIL::Design *design, std::ostream &file, bool include_propagated);
     void WriteFalsePaths(std::ostream &file);
     void WriteMaxDelay(std::ostream &file);
     void WriteClockGroups(std::ostream &file);