diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/antlr4/FIRRTL.g4 | 2 | ||||
| -rw-r--r-- | src/main/scala/firrtl/Visitor.scala | 2 | ||||
| -rw-r--r-- | src/main/scala/firrtl/ir/IR.scala | 2 | ||||
| -rw-r--r-- | src/test/resources/blackboxes/ParameterizedExtModuleTester.fir | 2 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/ExtModuleTests.scala | 27 |
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) + } +} + |
