aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/antlr4/FIRRTL.g42
-rw-r--r--src/main/scala/firrtl/Visitor.scala2
-rw-r--r--src/main/scala/firrtl/ir/IR.scala2
-rw-r--r--src/test/resources/blackboxes/ParameterizedExtModuleTester.fir2
-rw-r--r--src/test/scala/firrtlTests/ExtModuleTests.scala27
5 files changed, 31 insertions, 4 deletions
diff --git a/src/main/antlr4/FIRRTL.g4 b/src/main/antlr4/FIRRTL.g4
index f360229a..cc5d0a16 100644
--- a/src/main/antlr4/FIRRTL.g4
+++ b/src/main/antlr4/FIRRTL.g4
@@ -324,7 +324,7 @@ RawString
fragment
UnquotedString
- : ('\\"'|~[\r\n])+?
+ : ( '\\\'' | '\\"' | ~[\r\n] )+?
;
FileInfo
diff --git a/src/main/scala/firrtl/Visitor.scala b/src/main/scala/firrtl/Visitor.scala
index 64249c11..f47d7ee3 100644
--- a/src/main/scala/firrtl/Visitor.scala
+++ b/src/main/scala/firrtl/Visitor.scala
@@ -92,7 +92,7 @@ class Visitor(infoMode: InfoMode) extends FIRRTLBaseVisitor[FirrtlNode] {
case (int, null, null, null) => IntParam(name, string2BigInt(int.getText))
case (null, str, null, null) => StringParam(name, visitStringLit(str))
case (null, null, dbl, null) => DoubleParam(name, dbl.getText.toDouble)
- case (null, null, null, raw) => RawStringParam(name, raw.getText.tail.init) // Remove "\'"s
+ case (null, null, null, raw) => RawStringParam(name, raw.getText.tail.init.replace("\\'", "'")) // Remove "\'"s
case _ => throwInternalError(s"visiting impossible parameter ${ctx.getText}")
}
}
diff --git a/src/main/scala/firrtl/ir/IR.scala b/src/main/scala/firrtl/ir/IR.scala
index fc741b28..faebc7b8 100644
--- a/src/main/scala/firrtl/ir/IR.scala
+++ b/src/main/scala/firrtl/ir/IR.scala
@@ -526,7 +526,7 @@ case class StringParam(name: String, value: StringLit) extends Param {
* @note Firrtl doesn't guarantee anything about this String being legal in any backend
*/
case class RawStringParam(name: String, value: String) extends Param {
- override def serialize: String = super.serialize + s"'$value'"
+ override def serialize: String = super.serialize + s"'${value.replace("'", "\\'")}'"
}
/** Base class for modules */
diff --git a/src/test/resources/blackboxes/ParameterizedExtModuleTester.fir b/src/test/resources/blackboxes/ParameterizedExtModuleTester.fir
index 3167cded..b6771bd5 100644
--- a/src/test/resources/blackboxes/ParameterizedExtModuleTester.fir
+++ b/src/test/resources/blackboxes/ParameterizedExtModuleTester.fir
@@ -15,7 +15,7 @@ circuit ParameterizedExtModuleTester :
output bar : UInt<16>
defname = ParameterizedExtModule
- parameter VALUE = 2
+ parameter VALUE = '2\'d2'
parameter STRING = "two"
parameter REAL = 2.6E50
parameter TYP = 'bit [1:0]'
diff --git a/src/test/scala/firrtlTests/ExtModuleTests.scala b/src/test/scala/firrtlTests/ExtModuleTests.scala
new file mode 100644
index 00000000..89c13b5e
--- /dev/null
+++ b/src/test/scala/firrtlTests/ExtModuleTests.scala
@@ -0,0 +1,27 @@
+// See LICENSE for license details.
+
+package firrtlTests
+
+import org.scalatest.Matchers
+import firrtl._
+
+class ExtModuleTests extends FirrtlFlatSpec {
+ "extmodule" should "serialize and re-parse equivalently" in {
+ val input =
+ """circuit Top :
+ | extmodule Top :
+ | input y : UInt<0>
+ | output x : UInt<1>
+ |
+ | defname = ParameterizedExtModule
+ | parameter VALUE = 1
+ | parameter VALUE2 = '2\'d2'
+ | parameter STRING = "one"
+ | parameter REAL = -1.7
+ | parameter TYP = 'bit'
+ | """.stripMargin
+ val parsed = parse(input)
+ (parse(parsed.serialize)) should be (parsed)
+ }
+}
+