1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
// See LICENSE for license details.
package firrtlTests
import com.typesafe.scalalogging.LazyLogging
import java.io.{StringWriter,Writer}
import org.scalatest.{FlatSpec, Matchers}
import org.scalatest.junit.JUnitRunner
import firrtl.ir.Circuit
import firrtl.Parser.IgnoreInfo
import firrtl.passes.{Pass, PassExceptions, RemoveEmpty}
import firrtl.{
Transform,
PassBasedTransform,
CircuitState,
CircuitForm,
ChirrtlForm,
HighForm,
MidForm,
LowForm,
SimpleRun,
ChirrtlToHighFirrtl,
IRToWorkingIR,
ResolveAndCheck,
HighFirrtlToMiddleFirrtl,
MiddleFirrtlToLowFirrtl,
FirrtlEmitter,
Compiler,
Parser
}
import firrtl.Annotations.AnnotationMap
// An example methodology for testing Firrtl Passes
// Spec class should extend this class
abstract class SimpleTransformSpec extends FlatSpec with Matchers with Compiler with LazyLogging {
def emitter = new FirrtlEmitter
// Utility function
def parse(s: String): Circuit = Parser.parse(s.split("\n").toIterator, infoMode = IgnoreInfo)
def squash(c: Circuit): Circuit = RemoveEmpty.run(c)
// Executes the test. Call in tests.
def execute(writer: Writer, annotations: AnnotationMap, input: String, check: String) = {
compile(CircuitState(parse(input), ChirrtlForm, Some(annotations)), writer)
val actual = RemoveEmpty.run(parse(writer.toString)).serialize
val expected = parse(check).serialize
logger.debug(actual)
logger.debug(expected)
(actual) should be (expected)
}
// Executes the test, should throw an error
def failingexecute(writer: Writer, annotations: AnnotationMap, input: String): Exception = {
intercept[PassExceptions] {
compile(CircuitState(parse(input), ChirrtlForm, Some(annotations)), writer)
}
}
}
class CustomResolveAndCheck(form: CircuitForm) extends PassBasedTransform {
private val wrappedTransform = new ResolveAndCheck
def inputForm = form
def outputForm = form
def passSeq = wrappedTransform.passSeq
}
trait LowTransformSpec extends SimpleTransformSpec {
def transform: Transform
def transforms = Seq(
new ChirrtlToHighFirrtl(),
new IRToWorkingIR(),
new ResolveAndCheck(),
new HighFirrtlToMiddleFirrtl(),
new MiddleFirrtlToLowFirrtl(),
new CustomResolveAndCheck(LowForm),
transform
)
}
trait MiddleTransformSpec extends SimpleTransformSpec {
def transform: Transform
def transforms = Seq(
new ChirrtlToHighFirrtl(),
new IRToWorkingIR(),
new ResolveAndCheck(),
new HighFirrtlToMiddleFirrtl(),
new CustomResolveAndCheck(MidForm),
transform
)
}
trait HighTransformSpec extends SimpleTransformSpec {
def transform: Transform
def transforms = Seq(
new ChirrtlToHighFirrtl(),
new IRToWorkingIR(),
new ResolveAndCheck(),
transform
)
}
|