Skip to content

Commit

Permalink
ir: make HashCode.str public
Browse files Browse the repository at this point in the history
This will allow chiseltest to save
the hash code to disk for the purpose
of caching simulation binaries.
  • Loading branch information
ekiwi committed Jul 26, 2021
1 parent 2ca2bcc commit c310af8
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/main/scala/firrtl/ir/StructuralHash.scala
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,9 @@ object StructuralHash {
}

trait HashCode {
protected val str: String

/** string representation of the hash code */
def str: String
override def hashCode(): Int = str.hashCode
override def equals(obj: Any): Boolean = obj match {
case hashCode: HashCode => this.str.equals(hashCode.str)
Expand All @@ -124,7 +126,7 @@ trait HashCode {
}

private class MDHashCode(code: Array[Byte]) extends HashCode {
protected override val str: String = code.map(b => f"${b.toInt & 0xff}%02x").mkString("")
override val str: String = code.map(b => f"${b.toInt & 0xff}%02x").mkString("")
}

/** Generic hashing interface which allows us to use different backends to trade of speed and collision resistance */
Expand Down
10 changes: 10 additions & 0 deletions src/test/scala/firrtl/ir/StructuralHashSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ class StructuralHashSpec extends AnyFlatSpec {
assert(hash(b1) != hash(UIntLiteral(1, IntWidth(2))))
}

it should "generate the same hash String if the objects are structurally the same" in {
assert(hash(b0).str == hash(UIntLiteral(0, IntWidth(1))).str)
assert(hash(b0).str != hash(UIntLiteral(1, IntWidth(1))).str)
assert(hash(b0).str != hash(UIntLiteral(1, IntWidth(2))).str)

assert(hash(b1).str == hash(UIntLiteral(1, IntWidth(1))).str)
assert(hash(b1).str != hash(UIntLiteral(0, IntWidth(1))).str)
assert(hash(b1).str != hash(UIntLiteral(1, IntWidth(2))).str)
}

it should "ignore expression types" in {
assert(hash(add) == hash(DoPrim(Add, Seq(b0, b1), Seq(), UnknownType)))
assert(hash(add) == hash(DoPrim(Add, Seq(b0, b1), Seq(), UIntType(UnknownWidth))))
Expand Down

0 comments on commit c310af8

Please sign in to comment.