class AnalyzeCircuit extends Transform
AnalyzeCircuit Transform
Walks Circuit, and records the number of muxes it finds, per module.
While some compiler frameworks operate on graphs, we represent a Firrtl circuit using a tree representation:
- A Firrtl Circuit contains a sequence of DefModules.
- A DefModule contains a sequence of Ports, and maybe a Statement.
- A Statement can contain other Statements, or Expressions.
- A Expression can contain other Expressions.
To visit all Firrtl IR nodes in a circuit, we write functions that recursively walk down this tree. To record statistics, we will pass along the Ledger class and use it when we come across a Mux.
See the following links for more detailed explanations: Firrtl's IR:
- https://github.com/ucb-bar/firrtl/wiki/Understanding-Firrtl-Intermediate-Representation Traversing a circuit:
- https://github.com/ucb-bar/firrtl/wiki/traversing-a-circuit for more Common Pass Idioms:
- https://github.com/ucb-bar/firrtl/wiki/Common-Pass-Idioms
- Source
- AnalyzeCircuit.scala
- Alphabetic
- By Inheritance
- AnalyzeCircuit
- Transform
- DependencyAPI
- TransformLike
- LazyLogging
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Instance Constructors
- new AnalyzeCircuit()
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
execute(state: CircuitState): CircuitState
Called by Compiler to run your pass.
Called by Compiler to run your pass. CircuitState contains the circuit and its form, as well as other related data.
- state
Input Firrtl AST
- returns
A transformed Firrtl AST
- Definition Classes
- AnalyzeCircuit → Transform
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
inputForm: LowForm.type
Requires the Circuit form to be "low"
Requires the Circuit form to be "low"
- Definition Classes
- AnalyzeCircuit → Transform
-
def
invalidates(a: Transform): Boolean
A function that, given *another* transform (parameter
a
) will return true if this transform invalidates/undos the effects of the *other* transform (parametera
).A function that, given *another* transform (parameter
a
) will return true if this transform invalidates/undos the effects of the *other* transform (parametera
).- a
transform
- Definition Classes
- Transform → DependencyAPI
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
val
logger: Logger
- Attributes
- protected
- Definition Classes
- LazyLogging
-
def
name: String
A convenience function useful for debugging and error messages
A convenience function useful for debugging and error messages
- Definition Classes
- Transform → TransformLike
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
def
optionalPrerequisiteOf: Seq[Dependency[Transform]]
A sequence of transforms to add this transform as an
optionalPrerequisite
.A sequence of transforms to add this transform as an
optionalPrerequisite
. The use ofoptionalPrerequisiteOf
enables the transform declaring them to always run before some other transforms. However, declaringoptionalPrerequisiteOf
will not result in the sequence of transforms executing.This is useful for providing an ordering constraint to guarantee that other transforms (e.g., emitters) will not be scheduled before you.
- Definition Classes
- Transform → DependencyAPI
- Note
This method **will not** result in the listed transforms running. If you want to add multiple transforms at once, you should use a
DependencyManager
with multiple targets.
-
def
optionalPrerequisites: Seq[Dependency[Transform]]
All transforms that, if a prerequisite of *another* transform, will run before this transform.
All transforms that, if a prerequisite of *another* transform, will run before this transform.
- Definition Classes
- Transform → DependencyAPI
- Note
The use of a Seq here is to preserve input order. Internally, this will be converted to a private, ordered Set.
-
def
outputForm: LowForm.type
Indicates the output Circuit form to be "low"
Indicates the output Circuit form to be "low"
- Definition Classes
- AnalyzeCircuit → Transform
-
def
prerequisites: Seq[Dependency[Transform]]
All transform that must run before this transform
All transform that must run before this transform
- Definition Classes
- Transform → DependencyAPI
- Note
The use of a Seq here is to preserve input order. Internally, this will be converted to a private, ordered Set.
-
final
def
runTransform(state: CircuitState): CircuitState
Perform the transform and update annotations.
Perform the transform and update annotations.
- state
Input Firrtl AST
- returns
A transformed Firrtl AST
- Definition Classes
- Transform
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
def
transform(state: CircuitState): CircuitState
A mathematical transform on some type
A mathematical transform on some type
- returns
an output object of the same type
- Definition Classes
- Transform → TransformLike
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
def
walkExpression(ledger: Ledger)(e: Expression): Expression
Deeply visits every Expression in e.
Deeply visits every Expression in e.
- "post-order traversal"
- handle e's children Expression before e
-
def
walkModule(ledger: Ledger)(m: DefModule): DefModule
Deeply visits every Statement in m.
-
def
walkStatement(ledger: Ledger)(s: Statement): Statement
Deeply visits every Statement and Expression in s.
Deprecated Value Members
-
def
dependents: Seq[Dependency[Transform]]
All transforms that must run after this transform
All transforms that must run after this transform
This is a means of prerequisite injection into some other transform. Normally a transform will define its own prerequisites. Dependents exist for two main situations:
First, they improve the composition of optional transforms. If some first transform is optional (e.g., an expensive validation check), you would like to be able to conditionally cause it to run. If it is listed as a prerequisite on some other, second transform then it must always run before that second transform. There's no way to turn it off. However, by listing the second transform as a dependent of the first transform, the first transform will only run (and be treated as a prerequisite of the second transform) if included in a list of target transforms that should be run.
Second, an external library would like to inject some first transform before a second transform inside FIRRTL. In this situation, the second transform cannot have any knowledge of external libraries. The use of a dependent here allows for prerequisite injection into FIRRTL proper.
- Definition Classes
- DependencyAPI
- Annotations
- @deprecated
- Deprecated
(Since version FIRRTL 1.3) Due to confusion, 'dependents' is being renamed to 'optionalPrerequisiteOf'. Override the latter instead.
- Note
The use of a Seq here is to preserve input order. Internally, this will be converted to a private, ordered Set.
- See also
firrtl.passes.CheckTypes for an example of an optional checking firrtl.Transform
This is the documentation for Firrtl.