aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPalmer Dabbelt2016-02-08 17:28:09 -0800
committerPalmer Dabbelt2016-02-08 17:28:09 -0800
commit9dbdb3c87e7ddb75ac937678763b177e0b095523 (patch)
tree34cb1c533657a5a066de2378e512bdc67a517a4f
parent23903d52f501e42ae7a633ad6509d9352cf2f68c (diff)
Escape quotes in strings before emitting as Verilog
Without this we get failures with the current rocket-chip, when there are assertions with escaped strings in them.
-rw-r--r--src/main/stanza/passes.stanza2
-rw-r--r--test/passes/to-verilog/escape-quote.fir18
2 files changed, 20 insertions, 0 deletions
diff --git a/src/main/stanza/passes.stanza b/src/main/stanza/passes.stanza
index 60317a8e..75be008f 100644
--- a/src/main/stanza/passes.stanza
+++ b/src/main/stanza/passes.stanza
@@ -2436,6 +2436,8 @@ defn escape (s:String) -> String :
for c in s do :
if c == '\n' :
add(s*,"\\n")
+ else if c == '"' :
+ add(s*, "\\\"")
else :
if c == 'x' and percent :
add(s*,"h")
diff --git a/test/passes/to-verilog/escape-quote.fir b/test/passes/to-verilog/escape-quote.fir
new file mode 100644
index 00000000..224026a9
--- /dev/null
+++ b/test/passes/to-verilog/escape-quote.fir
@@ -0,0 +1,18 @@
+; RUN: firrtl -i %s -o %s.v -X verilog ; cat %s.v | FileCheck %s
+
+;CHECK: module top(
+;CHECK: input clk
+;CHECK: );
+;CHECK: always @(posedge clk) begin
+;CHECK: `ifndef SYNTHESIS
+;CHECK: if(1'h1) begin
+;CHECK: $fwrite(32'h80000002,"This has an escaped quote (\") in it");
+;CHECK: end
+;CHECK: `endif
+;CHECK: end
+;CHECK: endmodule
+
+circuit top :
+ module top :
+ input clk : Clock
+ printf(clk, UInt<1>(1), "This has an escaped quote (\") in it")