* remove outdated files

* pulled resetinverter from dsptools + setup repo

* fix some package names, misc. dsptools dependencies, typo in build.sbt, + circuitstate in resetinverter pass

* add more comprehensive gitignore + license back in

* create directory structure to match package structure

* change package names to barstools.tapeout

* settled on barstools.tapeout.transforms package

* make directory + build structure more amenable for multiple sub projects
This commit is contained in:
Angie Wang
2017-02-17 11:58:05 -08:00
committed by GitHub
parent e21e50dd91
commit d86dea58cf
11 changed files with 670 additions and 192 deletions

329
.gitignore vendored
View File

@@ -1,6 +1,317 @@
### local stuff
src/main/scala/dsptools/sandbox.sc
test_run_dir/
*.fir
*.anno
### XilinxISE template
# intermediate build files
*.bgn
*.bit
*.bld
*.cmd_log
*.drc
*.ll
*.lso
*.msd
*.msk
*.ncd
*.ngc
*.ngd
*.ngr
*.pad
*.par
*.pcf
*.prj
*.ptwx
*.rbb
*.rbd
*.stx
*.syr
*.twr
*.twx
*.unroutes
*.ut
*.xpi
*.xst
*_bitgen.xwbt
*_envsettings.html
*_map.map
*_map.mrp
*_map.ngm
*_map.xrpt
*_ngdbuild.xrpt
*_pad.csv
*_pad.txt
*_par.xrpt
*_summary.html
*_summary.xml
*_usage.xml
*_xst.xrpt
# project-wide generated files
*.gise
par_usage_statistics.html
usage_statistics_webtalk.html
webtalk.log
webtalk_pn.xml
# generated folders
iseconfig/
xlnx_auto_0_xdb/
xst/
_ngo/
_xmsgs/
### Eclipse template
*.pydevproject
.metadata
.gradle
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
# Eclipse Core
.project
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# JDT-specific (Eclipse Java Development Tools)
.classpath
# Java annotation processor (APT)
.factorypath
# PDT-specific
.buildpath
# sbteclipse plugin
.target
# TeXlipse plugin
.texlipse
### C template
# Object files
*.o
*.ko
*.obj
*.elf
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
### SBT template
# Simple Build Tool
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control
target/
lib_managed/
src_managed/
project/boot/
.history
.cache
### Emacs template
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
# Org-mode
.org-id-locations
*_archive
# flymake-mode
*_flymake.*
# eshell files
/eshell/history
/eshell/lastdir
# elpa packages
/elpa/
# reftex files
*.rel
# AUCTeX auto folder
/auto/
# cask packages
.cask/
### Vim template
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
*.iml
## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml
# Gradle:
# .idea/gradle.xml
# .idea/libraries
# Mongo Explorer plugin:
# .idea/mongoSettings.xml
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
### C++ template
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
### OSX template
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Xcode template
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
## Other
*.xccheckout
*.moved-aside
*.xcuserstate
### Scala template
*.class *.class
*.log *.log
*.swp
# sbt specific # sbt specific
.cache .cache
@@ -16,3 +327,19 @@ project/plugins/project/
# Scala-IDE specific # Scala-IDE specific
.scala_dependencies .scala_dependencies
.worksheet .worksheet
### Java template
*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
# ignore lib from rocket build
lib

View File

@@ -6,11 +6,19 @@ lazy val commonSettings = Seq(
organization := "edu.berkeley.cs", organization := "edu.berkeley.cs",
version := "0.1-SNAPSHOT", version := "0.1-SNAPSHOT",
scalaVersion := "2.11.8", scalaVersion := "2.11.8",
scalacOptions := Seq("-deprecation", "-feature"),
libraryDependencies ++= commonDependencies libraryDependencies ++= commonDependencies
) )
lazy val executionoptions = (project in file("executionoptions")) val defaultVersions = Map(
"chisel3" -> "3.1-SNAPSHOT",
"chisel-iotesters" -> "1.2-SNAPSHOT"
)
lazy val tapeout = (project in file("tapeout"))
.settings(commonSettings) .settings(commonSettings)
.settings( .settings(
libraryDependencies ++= executionoptionsDependencies libraryDependencies ++= Seq("chisel3","chisel-iotesters").map {
dep: String => "edu.berkeley.cs" %% dep % sys.props.getOrElse(dep + "Version", defaultVersions(dep))
}
) )

View File

@@ -1,126 +0,0 @@
// See LICENSE for license details.
package bar.executionoptions
import scopt.OptionParser
/**
* Use this trait to define an options class that can add its private command line options to a externally
* declared parser
*/
trait ComposableOptions
/**
* Most of the chisel toolchain components require a topName which defines a circuit or a device under test.
* Much of the work that is done takes place in a directory.
* It would be simplest to require topName to be defined but in practice it is preferred to defer this.
* For example, in chisel, by deferring this it is possible for the execute there to first elaborate the
* circuit and then set the topName from that if it has not already been set.
*/
case class CommonOptions(topName: String = "", targetDirName: String = "test_run_dir") extends ComposableOptions
abstract class HasParser(applicationName: String) {
final val parser: OptionParser[Unit] = new OptionParser[Unit](applicationName) {}
}
trait HasCommonOptions {
self: ExecutionOptionsManager =>
var commonOptions = CommonOptions()
parser.note("common options")
parser.opt[String]("top-name")
.abbr("tn")
.valueName("<top-level-circuit-name>")
.foreach { x =>
commonOptions = commonOptions.copy(topName = x)
}
.text("This options defines the top level circuit, defaults to dut when possible")
parser.opt[String]("target-dir")
.abbr("td").valueName("<target-directory>")
.foreach { x =>
commonOptions = commonOptions.copy(targetDirName = x)
}
.text(s"This options defines a work directory for intermediate files, default is ${commonOptions.targetDirName}")
parser.help("help").text("prints this usage text")
}
/**
*
* @param applicationName The name shown in the usage
*/
class ExecutionOptionsManager(val applicationName: String) extends HasParser(applicationName) with HasCommonOptions {
def parse(args: Array[String]): Boolean = {
parser.parse(args)
}
def showUsageAsError(): Unit = parser.showUsageAsError()
/**
* make sure that all levels of targetDirName exist
*
* @return true if directory exists
*/
def makeTargetDir(): Boolean = {
(new java.io.File(commonOptions.targetDirName)).mkdirs()
}
def targetDirName: String = commonOptions.targetDirName
/**
* this function sets the topName in the commonOptions.
* It would be nicer to not need this but many chisel tools cannot determine
* the name of the device under test until other options have been parsed.
* Havin this function allows the code to set the TopName after it has been
* determined
*
* @param newTopName the topName to be used
*/
def setTopName(newTopName: String): Unit = {
commonOptions = commonOptions.copy(topName = newTopName)
}
def setTopNameIfNotSet(newTopName: String): Unit = {
if(commonOptions.topName.isEmpty) {
setTopName(newTopName)
}
}
def topName: String = commonOptions.topName
def setTargetDirName(newTargetDirName: String): Unit = {
commonOptions = commonOptions.copy(targetDirName = newTargetDirName)
}
/**
* return a file based on targetDir, topName and suffix
* Will not add the suffix if the topName already ends with that suffix
*
* @param suffix suffix to add, removes . if present
* @param fileNameOverride this will override the topName if nonEmpty, when using this targetDir is ignored
* @return
*/
def getBuildFileName(suffix: String, fileNameOverride: String = ""): String = {
makeTargetDir()
val baseName = if(fileNameOverride.nonEmpty) fileNameOverride else topName
val directoryName = {
if(fileNameOverride.nonEmpty) {
""
}
else if(baseName.startsWith("./") || baseName.startsWith("/")) {
""
}
else {
if(targetDirName.endsWith("/")) targetDirName else targetDirName + "/"
}
}
val normalizedSuffix = {
val dottedSuffix = if(suffix.startsWith(".")) suffix else s".$suffix"
if(baseName.endsWith(dottedSuffix)) "" else dottedSuffix
}
s"$directoryName$baseName$normalizedSuffix"
}
}

View File

@@ -1,53 +0,0 @@
// See LICENSE for license details.
package bar.executionoptions
import org.scalatest.{Matchers, FreeSpec}
class ExecutionOptionsManagerSpec extends FreeSpec with Matchers {
"ExecutionOptionsManager is a container for one more more ComposableOptions Block" - {
"It has a default CommonOptionsBlock" in {
val manager = new ExecutionOptionsManager("test")
manager.commonOptions.targetDirName should be ("test_run_dir")
}
"But can override defaults like this" in {
val manager = new ExecutionOptionsManager("test") { commonOptions = CommonOptions(topName = "dog") }
manager.commonOptions shouldBe a [CommonOptions]
manager.topName should be ("dog")
manager.commonOptions.topName should be ("dog")
}
"The proper way to change an option in is to copy the existing sub-option with the desired new value" in {
val manager = new ExecutionOptionsManager("test") {
commonOptions = CommonOptions(targetDirName = "fox", topName = "dog")
}
val initialCommon = manager.commonOptions
initialCommon.targetDirName should be ("fox")
initialCommon.topName should be ("dog")
manager.commonOptions = manager.commonOptions.copy(topName = "cat")
val afterCommon = manager.commonOptions
afterCommon.topName should be ("cat")
afterCommon.targetDirName should be ("fox")
initialCommon.topName should be ("dog")
}
"The following way of changing a manager should not be used, as it could alter other desired values" - {
"Note that the initial setting targetDirName is lost when using this method" in {
val manager = new ExecutionOptionsManager("test") {
commonOptions = CommonOptions(targetDirName = "fox", topName = "dog")
}
val initialCommon = manager.commonOptions
initialCommon.topName should be("dog")
manager.commonOptions = CommonOptions(topName = "cat")
val afterCommon = manager.commonOptions
initialCommon.topName should be("dog")
afterCommon.topName should be("cat")
// This is probably bad
afterCommon.targetDirName should not be "fox"
}
}
}
}

View File

@@ -4,13 +4,12 @@ import Keys._
object Dependencies { object Dependencies {
val scalatestVersion = "3.0.0" val scalatestVersion = "3.0.0"
val scalatest = "org.scalatest" %% "scalatest" % scalatestVersion % "test" val scalatest = "org.scalatest" %% "scalatest" % scalatestVersion % "test"
val scoptVersion = "3.4.0" val scalacheckVersion = "1.12.4"
val scopt = "com.github.scopt" %% "scopt" % scoptVersion val scalacheck = "org.scalacheck" %% "scalacheck" % scalacheckVersion % "test"
val commonDependencies: Seq[ModuleID] = Seq( val commonDependencies: Seq[ModuleID] = Seq(
scalatest scalatest,
) scalacheck
val executionoptionsDependencies: Seq[ModuleID] = Seq(
scopt
) )
} }

110
scalastyle-config.xml Normal file
View File

@@ -0,0 +1,110 @@
<scalastyle>
<name>Scalastyle standard configuration</name>
<check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
<parameters>
<parameter name="maxFileLength"><![CDATA[800]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true">
<parameters>
<parameter name="header"><![CDATA[// See LICENSE for license details.]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
<parameters>
<parameter name="maxLineLength"><![CDATA[120]]></parameter>
<parameter name="tabSize"><![CDATA[4]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
<parameters>
<parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
<parameters>
<parameter name="maxParameters"><![CDATA[8]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="true">
<parameters>
<parameter name="ignore"><![CDATA[-1,0,1,2,8,10,16]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[;(\r|)\n]]></parameter>
</parameters>
<customMessage>No lines ending with a ;</customMessage>
</check>
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[println]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
<parameters>
<parameter name="maxTypes"><![CDATA[30]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
<parameters>
<parameter name="maximum"><![CDATA[10]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
<parameters>
<parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
<parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
<parameters>
<parameter name="maxLength"><![CDATA[50]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
<parameter name="ignoreRegex"><![CDATA[^(\+[&%]?|\-[&%]?|\*|/|%|&|\||\^|<|>|\|\||&&|:=|<>|<=|>=|!=|===|<<|>>|##|unary_(~|\-%?|!))$]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
<parameters>
<parameter name="maxMethods"><![CDATA[30]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
</scalastyle>

109
scalastyle-test-config.xml Normal file
View File

@@ -0,0 +1,109 @@
<scalastyle>
<name>Scalastyle configuration for Chisel3 unit tests</name>
<check level="warning" class="org.scalastyle.file.FileTabChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLengthChecker" enabled="true">
<parameters>
<parameter name="maxFileLength"><![CDATA[800]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.file.HeaderMatchesChecker" enabled="true">
<parameters>
<parameter name="header"><![CDATA[// See LICENSE for license details.]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.SpacesAfterPlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.WhitespaceEndOfLineChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.SpacesBeforePlusChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.FileLineLengthChecker" enabled="true">
<parameters>
<parameter name="maxLineLength"><![CDATA[120]]></parameter>
<parameter name="tabSize"><![CDATA[4]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ClassNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ObjectNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[[A-Z][A-Za-z]*]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.PackageObjectNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^[a-z][A-Za-z]*$]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.EqualsHashCodeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.IllegalImportsChecker" enabled="true">
<parameters>
<parameter name="illegalImports"><![CDATA[sun._,java.awt._]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.ParameterNumberChecker" enabled="true">
<parameters>
<parameter name="maxParameters"><![CDATA[8]]></parameter>
</parameters>
</check>
<!-- Numerical constants are used a lot in test setups, it would be burdensome to require each one be its own val
declaration. -->
<check level="warning" class="org.scalastyle.scalariform.MagicNumberChecker" enabled="false"></check>
<!-- Scalatest's exception checking syntax looks like "a [ChiselException] should be thrownBy". -->
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceBeforeLeftBracketChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NoWhitespaceAfterLeftBracketChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.ReturnChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NullChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NoCloneChecker" enabled="false"></check>
<check level="warning" class="org.scalastyle.scalariform.NoFinalizeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.CovariantEqualsChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.StructuralTypeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^.*;(\r|)\n]]></parameter>
</parameters>
<customMessage>No lines ending with a ;</customMessage>
</check>
<check level="warning" class="org.scalastyle.file.RegexChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[println]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NumberOfTypesChecker" enabled="true">
<parameters>
<parameter name="maxTypes"><![CDATA[30]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.CyclomaticComplexityChecker" enabled="true">
<parameters>
<parameter name="maximum"><![CDATA[10]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.UppercaseLChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.SimplifyBooleanExpressionChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.scalariform.IfBraceChecker" enabled="true">
<parameters>
<parameter name="singleLineAllowed"><![CDATA[true]]></parameter>
<parameter name="doubleLineAllowed"><![CDATA[false]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MethodLengthChecker" enabled="true">
<parameters>
<parameter name="maxLength"><![CDATA[50]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.MethodNamesChecker" enabled="true">
<parameters>
<parameter name="regex"><![CDATA[^[a-z][A-Za-z0-9]*$]]></parameter>
<parameter name="ignoreRegex"><![CDATA[^(\+[&%]?|\-[&%]?|\*|/|%|&|\||\^|<|>|\|\||&&|:=|<>|<=|>=|!=|===|<<|>>|##|unary_(~|\-%?|!))$]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.NumberOfMethodsInTypeChecker" enabled="true">
<parameters>
<parameter name="maxMethods"><![CDATA[30]]></parameter>
</parameters>
</check>
<check level="warning" class="org.scalastyle.scalariform.PublicMethodsHaveTypeChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.NewLineAtEofChecker" enabled="true"></check>
<check level="warning" class="org.scalastyle.file.NoNewLineAtEofChecker" enabled="false"></check>
</scalastyle>

View File

@@ -0,0 +1,65 @@
// See LICENSE for license details.
package barstools.tapeout.transforms
import chisel3.internal.InstanceId
import firrtl.PrimOps.Not
import firrtl.annotations.{Annotation, CircuitName, ModuleName, Named}
import firrtl.ir.{Input, UIntType, IntWidth, Module, Port, DefNode, NoInfo, Reference, DoPrim, Block, Circuit}
import firrtl.passes.Pass
import firrtl.{CircuitForm, CircuitState, LowForm, Transform}
object ResetInverterAnnotation {
def apply(target: ModuleName): Annotation = Annotation(target, classOf[ResetInverterTransform], "invert")
def unapply(a: Annotation): Option[Named] = a match {
case Annotation(m, t, "invert") if t == classOf[ResetInverterTransform] => Some(m)
case _ => None
}
}
object ResetN extends Pass {
def name: String = "ResetN"
private val Bool = UIntType(IntWidth(1))
// Only works on Modules with a Bool port named reset
def invertReset(mod: Module): Module = {
// Check that it actually has reset
require(mod.ports.exists(p => p.name == "reset" && p.tpe == Bool),
"Can only invert reset on a module with reset!")
// Rename "reset" to "reset_n"
val portsx = mod.ports map {
case Port(info, "reset", Input, Bool) => Port(info, "reset_n", Input, Bool)
case other => other
}
val newReset = DefNode(NoInfo, "reset", DoPrim(Not, Seq(Reference("reset_n", Bool)), Seq.empty, Bool))
val bodyx = Block(Seq(newReset, mod.body))
mod.copy(ports = portsx, body = bodyx)
}
def run(c: Circuit): Circuit =
c.copy(modules = c.modules map {
case mod: Module if mod.name == c.main => invertReset(mod)
case other => other
})
}
class ResetInverterTransform extends Transform {
override def inputForm: CircuitForm = LowForm
override def outputForm: CircuitForm = LowForm
override def execute(state: CircuitState): CircuitState = {
getMyAnnotations(state) match {
case Nil => CircuitState(state.circuit, LowForm)
case Seq(ResetInverterAnnotation(ModuleName(state.circuit.main, CircuitName(_)))) =>
CircuitState(ResetN.run(state.circuit), LowForm)
case annotations =>
throw new Exception(s"There should be only one InvertReset annotation: got ${annotations.mkString(" -- ")}")
}
}
}
trait ResetInverter {
self: chisel3.Module =>
def invert(component: InstanceId): Unit = {
annotate(chisel3.experimental.ChiselAnnotation(component, classOf[ResetInverterTransform], "invert"))
}
}

View File

@@ -0,0 +1,39 @@
// See LICENSE for license details.
package barstools.tapeout.transforms
import chisel3._
import chisel3.util.RegInit
import firrtl._
import org.scalatest.{FreeSpec, Matchers}
class ExampleModuleNeedsResetInverted extends Module with ResetInverter {
val io = IO(new Bundle {
val out = Output(UInt(32.W))
})
val r = RegInit(0.U)
invert(this)
}
class ResetNSpec extends FreeSpec with Matchers {
"Inverting reset needs to be done throughout module" in {
val optionsManager = new ExecutionOptionsManager("dsptools") with HasChiselExecutionOptions with HasFirrtlOptions {
firrtlOptions = firrtlOptions.copy(compilerName = "low")
}
chisel3.Driver.execute(optionsManager, () => new ExampleModuleNeedsResetInverted) match {
case ChiselExecutionSuccess(_, chirrtl, Some(FirrtlExecutionSuccess(_, firrtl))) =>
chirrtl should include ("input reset :")
chirrtl should not include "input reset_n :"
chirrtl should not include "node reset = not(reset_n)"
firrtl should include ("input reset_n :")
firrtl should include ("node reset = not(reset_n)")
firrtl should not include "input reset :"
case _ =>
// bad
}
}
}