自定义记录类型的 Firrtl 解析器语法错误
Firrtl parser syntax errors for custom Record type
我有一个代表矩阵的自定义记录类型。 Record.elements 值包含矩阵的条目,并使用由行号、下划线和列号组成的键字符串进行索引;即 s"${row}_${col}".
我还有第二个自定义 Record 类型,它表示一个矩阵数组,这些矩阵的大小不一定都相同(这就是我不能使用 Vec 的原因)。对于这种类型,Record.elements 包含矩阵并简单地用 int 索引,类似于其他数组类型。
某些原因导致 Firrtl 解析器吐出语法错误,如下所示:
line 8:30 no viable alternative at input '_0@[Matrix.scala 53:19]'
还有这个:
line 376:22 no viable alternative at input 'MatMul_1.io.in.1.3_0'
一些快速搜索似乎表明这个错误是从 ANTLR 冒出来的,但在这一点上我承认我超出了我的理解范围。
这是堆栈跟踪,不包括用户代码
Exception in thread "main" firrtl.SyntaxErrorsException: 77 syntax error(s) detected
at firrtl.Parser$$anonfun.apply(Parser.scala:45)
at firrtl.Parser$$anonfun.apply(Parser.scala:33)
at firrtl.Utils$.time(Utils.scala:182)
at firrtl.Parser$.parseCharStream(Parser.scala:33)
at firrtl.Parser$.parseString(Parser.scala:29)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply$$anonfun$apply.apply(Driver.scala:172)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply$$anonfun$apply.apply(Driver.scala:172)
at scala.Option.map(Option.scala:146)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply.apply(Driver.scala:172)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply.apply(Driver.scala:172)
at scala.Option.getOrElse(Option.scala:121)
at firrtl.Driver$$anonfun$getCircuit.apply(Driver.scala:171)
at firrtl.Driver$$anonfun$getCircuit.apply(Driver.scala:160)
at scala.util.Try$.apply(Try.scala:192)
at firrtl.Driver$.getCircuit(Driver.scala:160)
at firrtl.Driver$$anonfun$execute.apply(Driver.scala:212)
at firrtl.Driver$$anonfun$execute.apply(Driver.scala:209)
at logger.Logger$$anonfun$makeScope.apply(Logger.scala:129)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
at logger.Logger$.makeScope(Logger.scala:127)
at firrtl.Driver$.execute(Driver.scala:209)
at chisel3.Driver$.execute(Driver.scala:182)
at chisel3.Driver$.execute(Driver.scala:202)
经过一番摸索,我弄明白了:Firrtl 语法(与许多其他语法一样)对变量和字段标识符施加了限制:它们不能以数字开头。由于我的自定义 Record 类型的键都以数字开头,而 Chisel 直接使用 Record 键作为 Firrtl 标识符,因此 Firrtl 解析器报告错误。
tl;dr 用于索引自定义 Record.elements 的键必须是有效的 Firrtl 标识符(例如,它们不能以数字开头)。
我有一个代表矩阵的自定义记录类型。 Record.elements 值包含矩阵的条目,并使用由行号、下划线和列号组成的键字符串进行索引;即 s"${row}_${col}".
我还有第二个自定义 Record 类型,它表示一个矩阵数组,这些矩阵的大小不一定都相同(这就是我不能使用 Vec 的原因)。对于这种类型,Record.elements 包含矩阵并简单地用 int 索引,类似于其他数组类型。
某些原因导致 Firrtl 解析器吐出语法错误,如下所示:
line 8:30 no viable alternative at input '_0@[Matrix.scala 53:19]'
还有这个:
line 376:22 no viable alternative at input 'MatMul_1.io.in.1.3_0'
一些快速搜索似乎表明这个错误是从 ANTLR 冒出来的,但在这一点上我承认我超出了我的理解范围。
这是堆栈跟踪,不包括用户代码
Exception in thread "main" firrtl.SyntaxErrorsException: 77 syntax error(s) detected
at firrtl.Parser$$anonfun.apply(Parser.scala:45)
at firrtl.Parser$$anonfun.apply(Parser.scala:33)
at firrtl.Utils$.time(Utils.scala:182)
at firrtl.Parser$.parseCharStream(Parser.scala:33)
at firrtl.Parser$.parseString(Parser.scala:29)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply$$anonfun$apply.apply(Driver.scala:172)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply$$anonfun$apply.apply(Driver.scala:172)
at scala.Option.map(Option.scala:146)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply.apply(Driver.scala:172)
at firrtl.Driver$$anonfun$getCircuit$$anonfun$apply.apply(Driver.scala:172)
at scala.Option.getOrElse(Option.scala:121)
at firrtl.Driver$$anonfun$getCircuit.apply(Driver.scala:171)
at firrtl.Driver$$anonfun$getCircuit.apply(Driver.scala:160)
at scala.util.Try$.apply(Try.scala:192)
at firrtl.Driver$.getCircuit(Driver.scala:160)
at firrtl.Driver$$anonfun$execute.apply(Driver.scala:212)
at firrtl.Driver$$anonfun$execute.apply(Driver.scala:209)
at logger.Logger$$anonfun$makeScope.apply(Logger.scala:129)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
at logger.Logger$.makeScope(Logger.scala:127)
at firrtl.Driver$.execute(Driver.scala:209)
at chisel3.Driver$.execute(Driver.scala:182)
at chisel3.Driver$.execute(Driver.scala:202)
经过一番摸索,我弄明白了:Firrtl 语法(与许多其他语法一样)对变量和字段标识符施加了限制:它们不能以数字开头。由于我的自定义 Record 类型的键都以数字开头,而 Chisel 直接使用 Record 键作为 Firrtl 标识符,因此 Firrtl 解析器报告错误。
tl;dr 用于索引自定义 Record.elements 的键必须是有效的 Firrtl 标识符(例如,它们不能以数字开头)。