[dvsim/syn/lint] Add options to selectively sanitize reports

Signed-off-by: Michael Schaffner <msf@google.com>
diff --git a/util/dvsim/FlowCfg.py b/util/dvsim/FlowCfg.py
index 876a726..cf6c100 100644
--- a/util/dvsim/FlowCfg.py
+++ b/util/dvsim/FlowCfg.py
@@ -13,7 +13,7 @@
 import hjson
 
 from Deploy import Deploy
-from utils import VERBOSE, md_results_to_html, parse_hjson, print_msg_list, subst_wildcards
+from utils import VERBOSE, md_results_to_html, parse_hjson, subst_wildcards
 
 
 # Interface class for extensions.
@@ -83,10 +83,16 @@
         self.results_summary_server_html = ""
         self.results_summary_server_page = ""
 
-        # Full and summary results in md text.
+        # Full results in md text
         self.results_md = ""
+        # Selectively sanitized md results to be mailed out or published
+        self.email_results_md = ""
+        self.publish_results_md = ""
+        self.sanitize_email_results = False
+        self.sanitize_publish_results = False
+        # Summary results, generated by over-arching cfg
+        self.email_summary_md = ""
         self.results_summary_md = ""
-        self.email_summary_md = ""  # if user wanted to customize email content
 
     def __post_init__(self):
         # Run some post init checks
@@ -490,7 +496,7 @@
             # otherwise default to send out results_summary_md
             gen_results = self.email_summary_md or self.results_summary_md
         else:
-            gen_results = self.results_md
+            gen_results = self.email_results_md or self.results_md
         results_html = md_results_to_html(self.results_title, self.css_file, gen_results)
         results_html_file = self.scratch_root + "/email.html"
         f = open(results_html_file, 'w')
@@ -613,14 +619,15 @@
             rm_cmd = self.results_server_cmd + " -m rm -r " + rm_cmd + "; "
 
         # Append the history to the results.
-        results_md = self.results_md + history_txt
+        publish_results_md = self.publish_results_md or self.results_md
+        publish_results_md = publish_results_md + history_txt
 
         # Publish the results page.
         # First, write the results html file temporarily to the scratch area.
         results_html_file = self.scratch_path + "/results_" + self.timestamp + ".html"
         f = open(results_html_file, 'w')
         f.write(
-            md_results_to_html(self.results_title, self.css_file, results_md))
+            md_results_to_html(self.results_title, self.css_file, publish_results_md))
         f.close()
         rm_cmd += "/bin/rm -rf " + results_html_file + "; "
 
diff --git a/util/dvsim/LintCfg.py b/util/dvsim/LintCfg.py
index 6683c62..54d627e 100644
--- a/util/dvsim/LintCfg.py
+++ b/util/dvsim/LintCfg.py
@@ -14,6 +14,7 @@
 from OneShotCfg import OneShotCfg
 from utils import print_msg_list, subst_wildcards
 
+
 class LintCfg(OneShotCfg):
     """Derivative class for linting purposes.
     """
@@ -192,9 +193,21 @@
         if len(table) > 1:
             self.results_md = results_str + tabulate(
                 table, headers="firstrow", tablefmt="pipe",
-                colalign=colalign) + "\n" + fail_msgs
+                colalign=colalign) + "\n"
+
+            # the email and published reports will default to self.results_md if they are
+            # empty. in case they need to be sanitized, override them and do not append
+            # detailed messages.
+            if self.sanitize_email_results:
+                self.email_results_md = self.results_md
+            if self.sanitize_publish_results:
+                self.publish_results_md = self.results_md
+            # locally generated result always contains all details
+            self.results_md += fail_msgs
         else:
             self.results_md = results_str + "\nNo results to display.\n"
+            self.email_results_md = self.results_md
+            self.publish_results_md = self.results_md
 
         # Write results to the scratch area
         self.results_file = self.scratch_path + "/results_" + self.timestamp + ".md"
diff --git a/util/dvsim/SynCfg.py b/util/dvsim/SynCfg.py
index 1cddae3..4e329db 100644
--- a/util/dvsim/SynCfg.py
+++ b/util/dvsim/SynCfg.py
@@ -353,23 +353,33 @@
                              ("Elab Errors", "elab_errors"),
                              ("Compile Warnings", "compile_warnings"),
                              ("Compile Errors", "compile_errors")]
-
+            fail_msgs = ""
             has_msg = False
             for _, key in hdr_key_pairs:
                 if key in self.result['messages']:
                     has_msg = True
                     break
 
-            if has_msg and not self.args.publish:
-                results_str += "\n### Errors and Warnings for Build Mode `'" + mode.name + "'`\n"
+            if has_msg:
+                fail_msgs += "\n### Errors and Warnings for Build Mode `'" + mode.name + "'`\n"
                 for hdr, key in hdr_key_pairs:
                     msgs = self.result['messages'].get(key)
-                    results_str += print_msg_list("#### " + hdr, msgs, self.max_msg_count)
+                    fail_msgs += print_msg_list("#### " + hdr, msgs, self.max_msg_count)
+
+            # the email and published reports will default to self.results_md if they are
+            # empty. in case they need to be sanitized, override them and do not append
+            # detailed messages.
+            if self.sanitize_email_results:
+                self.email_results_md = results_str
+            if self.sanitize_publish_results:
+                self.publish_results_md = results_str
+
+            # locally generated result always contains all details
+            self.results_md = results_str + fail_msgs
 
             # TODO: add support for pie / bar charts for area splits and
             # QoR history
 
-        self.results_md = results_str
         # Write results to the scratch area
         self.results_file = self.scratch_path + "/results_" + self.timestamp + ".md"
         log.info("Detailed results are available at %s", self.results_file)