aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/Translator.scala
diff options
context:
space:
mode:
authorKamyar Mohajerani2016-07-21 23:40:34 +0430
committerJack Koenig2016-07-21 12:10:34 -0700
commitab340febdc7a5418da945f9b79624d36e66e26db (patch)
tree04e4aef30081fdd419281d69be4b141fd49b4b1f /src/main/scala/firrtl/Translator.scala
parentb7de40e23161a7346fea90576f07b5c200c2675b (diff)
Indentation support for the ANTLR parser (as discussed in #192) (#194)
Indentation support for the ANTLR parser - some clean-up of the parser code (TODO: file input could be improved, more clean-up) - get rid of Translator and specify all syntactic rules in antlr4 grammer - support for else-when shorthand in the grammar - rename Begin to Block which makes more sense
Diffstat (limited to 'src/main/scala/firrtl/Translator.scala')
-rw-r--r--src/main/scala/firrtl/Translator.scala171
1 files changed, 0 insertions, 171 deletions
diff --git a/src/main/scala/firrtl/Translator.scala b/src/main/scala/firrtl/Translator.scala
deleted file mode 100644
index 4b0bd1e7..00000000
--- a/src/main/scala/firrtl/Translator.scala
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
-Copyright (c) 2014 - 2016 The Regents of the University of
-California (Regents). All Rights Reserved. Redistribution and use in
-source and binary forms, with or without modification, are permitted
-provided that the following conditions are met:
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- two paragraphs of disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- two paragraphs of disclaimer in the documentation and/or other materials
- provided with the distribution.
- * Neither the name of the Regents nor the names of its contributors
- may be used to endorse or promote products derived from this
- software without specific prior written permission.
-IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
-SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
-ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
-REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
-ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION
-TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
-MODIFICATIONS.
-*/
-
-/* TODO
- * - Add better error messages for illformed FIRRTL
- * - Add support for files that do not have a circuit (like a module by itself in a file)
- * - Improve performance? Replace regex?
- * - Wrap in Reader subclass. This would have less memory footprint than creating a large string
- */
-
-package firrtl
-
-import scala.io.Source
-import scala.collection.mutable.Stack
-import scala.collection.mutable.StringBuilder
-import java.io._
-
-
-object Translator
-{
-
- def addBrackets(inputIt: Iterator[String]): StringBuilder = {
- def countSpaces(s: String): Int = s.prefixLength(_ == ' ')
- def stripComments(s: String): String = {
- // Delete anything after first semicolon that's not in a comment
- var done = false
- var inComment = false
- var escape = false
- var i = 0
- while (!done && i < s.length) {
- val c = s(i)
- if (c == ';') {
- if (!inComment) {
- done = true
- i = i - 1 // remove semicolon as well as what follows
- }
- } else {
- if (c == '"' && !escape) inComment = !inComment
- escape = if (c == '\\' && !escape) true else false
- }
- i += 1
- }
- s.take(i)
- }
- def extractFileInfo(str: String): (String, String) = str span (_ != '@')
-
- val scopers = """(circuit|module|when|else|mem|with)"""
- val MultiLineScope = ("""(.*""" + scopers + """)(.*:\s*)""").r
- val OneLineScope = ("""(.*(with)\s*:\s*)\((.*)\)\s*""").r
-
- // Function start
- val it = inputIt.zipWithIndex
- var ret = new StringBuilder()
-
- if( !it.hasNext ) throw new Exception("Empty file!")
-
- // Find circuit before starting scope checks
- var line = it.next
- while ( it.hasNext && !stripComments(line._1).contains("circuit") ) {
- ret ++= line._1 + "\n"
- line = it.next
- }
- ret ++= line._1 + " { \n"
- if( !it.hasNext ) throw new Exception("No circuit in file!")
-
-
- val scope = Stack[Int]()
- val lowestScope = countSpaces(line._1)
- scope.push(lowestScope)
- var newScope = true // indicates if increasing scope spacing is legal on next line
-
- while( it.hasNext ) {
- it.next match { case (lineText, lineNum) =>
- val text = stripComments(lineText)
- val (code, fileInfo) = extractFileInfo(text)
- val spaces = countSpaces(text)
-
- val l = if (text.length > spaces ) { // Check that line has text in it
- if (newScope) {
- if( spaces <= scope.top ) scope.push(spaces+2) // Hack for one-line scopes
- else scope.push(spaces)
- }
-
- // Check if change in current scope
- if( spaces < scope.top ) {
- while( spaces < scope.top ) {
- // Close scopes (adding brackets as we go)
- scope.pop()
- ret.deleteCharAt(ret.lastIndexOf("\n")) // Put on previous line
- ret ++= " }\n"
- }
- if( spaces != scope.top )
- throw new Exception("Spacing does not match scope on line : " + lineNum + " : " + scope.top)
- }
- else if( spaces > scope.top )
- throw new Exception("Invalid increase in scope on line " + lineNum)
-
- // Now match on legal scope increasers
- code match {
- case OneLineScope(head, keyword, body) => {
- newScope = false
- head + "{" + body + "} " + fileInfo
- }
- case MultiLineScope(head, keyword, tail) => {
- newScope = true
- text + " { "
- }
- case _ => {
- newScope = false
- text
- }
- }
- } // if( text.length > spaces )
- else {
- text // empty lines
- }
-
- ret ++= l + "\n"
- } // it.next match
- } // while( it.hasNext )
-
- // Print any closing braces
- while( scope.top > lowestScope ) {
- scope.pop()
- ret.deleteCharAt(ret.lastIndexOf("\n")) // Put on previous line
- ret ++= " }\n"
- }
-
- ret
- }
-
- def main(args: Array[String]) {
-
- try {
- val translation = addBrackets(Source.fromFile(args(0)).getLines)
-
- val writer = new PrintWriter(new File(args(1)))
- writer.write(translation.result)
- writer.close()
- } catch {
- case e: Exception => {
- throw new Exception("USAGE: Translator <input file> <output file>\n" + e)
- }
- }
- }
-
-}