aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/firrtlTests/formal/RemoveVerificationStatementsSpec.scala
blob: 10e63ae4246f7a99911ec76ea1922da7f63784fb (plain)
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
package firrtlTests.formal

import firrtl.{CircuitState, Parser, Transform, UnknownForm}
import firrtl.stage.{Forms, TransformManager}
import firrtl.testutils.FirrtlFlatSpec
import firrtl.transforms.formal.RemoveVerificationStatements

class RemoveVerificationStatementsSpec extends FirrtlFlatSpec {
  behavior of "RemoveVerificationStatements"

  val transforms = new TransformManager(Forms.HighForm, Forms.MinimalHighForm)
    .flattenedTransformOrder ++ Seq(new RemoveVerificationStatements)

  def run(input: String, antiCheck: Seq[String], debug: Boolean = false): Unit = {
    val circuit = Parser.parse(input.split("\n").toIterator)
    val result = transforms.foldLeft(CircuitState(circuit, UnknownForm)) {
      (c: CircuitState, p: Transform) => p.runTransform(c)
    }
    val lines = result.circuit.serialize.split("\n") map normalized

    if (debug) {
      println(lines.mkString("\n"))
    }

    for (ch <- antiCheck) {
      lines should not contain (ch)
    }
  }

  it should "remove all verification statements" in {
    val input =
      """circuit Test :
        |  module Test :
        |    input clock : Clock
        |    input reset : UInt<1>
        |    input in : UInt<8>
        |    output out : UInt<8>
        |    inst sub of Sub
        |    sub.clock <= clock
        |    sub.reset <= reset
        |    sub.in <= in
        |    out <= sub.out
        |    assume(clock, eq(in, UInt(0)), UInt(1), "assume0")
        |    assert(clock, eq(out, UInt(0)), UInt(1), "assert0")
        |    cover(clock, eq(out, UInt(0)), UInt(1), "cover0")
        |
        |  module Sub :
        |    input clock : Clock
        |    input reset : UInt<1>
        |    input in : UInt<8>
        |    output out : UInt<8>
        |    out <= in
        |    assume(clock, eq(in, UInt(1)), UInt(1), "assume1")
        |    assert(clock, eq(out, UInt(1)), UInt(1), "assert1")
        |    cover(clock, eq(out, UInt(1)), UInt(1), "cover1")
        |""".stripMargin

    val antiCheck = Seq(
      "assume(clock, eq(in, UInt<1>(\"h0\")), UInt<1>(\"h1\"), \"assume0\")",
      "assert(clock, eq(out, UInt<1>(\"h0\")), UInt<1>(\"h1\"), \"assert0\")",
      "cover(clock, eq(out, UInt<1>(\"h0\")), UInt<1>(\"h1\"), \"cover0\")",
      "assume(clock, eq(in, UInt<1>(\"h1\")), UInt<1>(\"h1\"), \"assume1\")",
      "assert(clock, eq(out, UInt<1>(\"h1\")), UInt<1>(\"h1\"), \"assert1\")",
      "cover(clock, eq(out, UInt<1>(\"h1\")), UInt<1>(\"h1\"), \"cover1\")"
    )
    run(input, antiCheck)
  }

}