Merge branch 'chipsalliance:master' into feat/issue_2073
diff --git a/verible/verilog/formatting/formatter_test.cc b/verible/verilog/formatting/formatter_test.cc
index ba51802..b3915f1 100644
--- a/verible/verilog/formatting/formatter_test.cc
+++ b/verible/verilog/formatting/formatter_test.cc
@@ -601,6 +601,52 @@
     {"`timescale  1ns/1ps\n",  //
      "`timescale 1ns / 1ps\n"},
 
+    // Multiple compiler directives should remain on separate lines
+    // (regression test for bug where they were merged onto one line)
+    {"`timescale 1 ps / 1 ps\n"
+     "`default_nettype none\n",
+     "`timescale 1 ps / 1 ps\n"
+     "`default_nettype none\n"},
+    {"`resetall\n"
+     "`timescale 1ns/1ps\n"
+     "`default_nettype wire\n",
+     "`resetall\n"
+     "`timescale 1ns / 1ps\n"
+     "`default_nettype wire\n"},
+    // Test with multiple different compiler directives
+    {"`resetall\n"
+     "`celldefine\n"
+     "`timescale 1ns/1ps\n"
+     "`default_nettype none\n",
+     "`resetall\n"
+     "`celldefine\n"
+     "`timescale 1ns / 1ps\n"
+     "`default_nettype none\n"},
+    // Test with compiler directives before module
+    {"`timescale 1ps/1ps\n"
+     "`default_nettype none\n"
+     "module foo;endmodule\n",
+     "`timescale 1ps / 1ps\n"
+     "`default_nettype none\n"
+     "module foo;\nendmodule\n"},
+    // Test with various compiler directives
+    {"`suppress_faults\n"
+     "`enable_portfaults\n"
+     "`delay_mode_distributed\n",
+     "`suppress_faults\n"
+     "`enable_portfaults\n"
+     "`delay_mode_distributed\n"},
+    {"`default_decay_time 10\n"
+     "`default_trireg_strength 50\n",
+     "`default_decay_time 10\n"
+     "`default_trireg_strength 50\n"},
+    {"`begin_keywords \"1800-2017\"\n"
+     "module test;endmodule\n"
+     "`end_keywords\n",
+     "`begin_keywords \"1800-2017\"\n"
+     "module test;\nendmodule\n"
+     "`end_keywords\n"},
+
     // parameter test cases
     {
         "  parameter  int   foo=0 ;",
diff --git a/verible/verilog/formatting/tree-unwrapper.cc b/verible/verilog/formatting/tree-unwrapper.cc
index 7198b9e..26b1ac6 100644
--- a/verible/verilog/formatting/tree-unwrapper.cc
+++ b/verible/verilog/formatting/tree-unwrapper.cc
@@ -782,7 +782,9 @@
     case NodeEnum::kPreprocessorIfdefClause:
     case NodeEnum::kPreprocessorIfndefClause:
     case NodeEnum::kPreprocessorElseClause:
-    case NodeEnum::kPreprocessorElsifClause: {
+    case NodeEnum::kPreprocessorElsifClause:
+    case NodeEnum::kTimescaleDirective:
+    case NodeEnum::kTopLevelDirective: {
       VisitNewUnindentedUnwrappedLine(node);
       break;
     }
@@ -3200,6 +3202,16 @@
     VLOG(4) << "handling preprocessor control flow token";
     StartNewUnwrappedLine(PartitionPolicyEnum::kFitOnLineElseExpand, &leaf);
     CurrentUnwrappedLine().SetIndentationSpaces(0);
+  } else if (IsPreprocessorKeyword(tag)) {
+    // Compiler directives (DR_* tokens) that don't have parent nodes
+    VLOG(4) << "handling compiler directive leaf token";
+    StartNewUnwrappedLine(PartitionPolicyEnum::kFitOnLineElseExpand, &leaf);
+    // Only unindent if at top level (context is empty) or inside preprocessor
+    // clauses
+    if (Context().empty() ||
+        IsPreprocessorClause(NodeEnum(Context().top().Tag().tag))) {
+      CurrentUnwrappedLine().SetIndentationSpaces(0);
+    }
   } else if (IsEndKeyword(tag)) {
     VLOG(4) << "handling end* keyword";
     StartNewUnwrappedLine(PartitionPolicyEnum::kAlwaysExpand, &leaf);
diff --git a/verible/verilog/parser/verilog-token-classifications.cc b/verible/verilog/parser/verilog-token-classifications.cc
index a3c3523..27ab8ba 100644
--- a/verible/verilog/parser/verilog-token-classifications.cc
+++ b/verible/verilog/parser/verilog-token-classifications.cc
@@ -102,6 +102,30 @@
     case verilog_tokentype::PP_elsif:
     case verilog_tokentype::PP_endif:
     case verilog_tokentype::PP_undef:
+    // Compiler directives (DR_*)
+    case verilog_tokentype::DR_timescale:
+    case verilog_tokentype::DR_resetall:
+    case verilog_tokentype::DR_celldefine:
+    case verilog_tokentype::DR_endcelldefine:
+    case verilog_tokentype::DR_unconnected_drive:
+    case verilog_tokentype::DR_nounconnected_drive:
+    case verilog_tokentype::DR_default_nettype:
+    case verilog_tokentype::DR_suppress_faults:
+    case verilog_tokentype::DR_nosuppress_faults:
+    case verilog_tokentype::DR_enable_portfaults:
+    case verilog_tokentype::DR_disable_portfaults:
+    case verilog_tokentype::DR_delay_mode_distributed:
+    case verilog_tokentype::DR_delay_mode_path:
+    case verilog_tokentype::DR_delay_mode_unit:
+    case verilog_tokentype::DR_delay_mode_zero:
+    case verilog_tokentype::DR_default_decay_time:
+    case verilog_tokentype::DR_default_trireg_strength:
+    case verilog_tokentype::DR_pragma:
+    case verilog_tokentype::DR_uselib:
+    case verilog_tokentype::DR_begin_keywords:
+    case verilog_tokentype::DR_end_keywords:
+    case verilog_tokentype::DR_protect:
+    case verilog_tokentype::DR_endprotect:
       return true;
     default:
       return false;