Skip to content
This repository has been archived by the owner on Aug 20, 2024. It is now read-only.

Commit

Permalink
ir: make HashCode.toHashString 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 27, 2021
1 parent 2ca2bcc commit b243ddc
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
10 changes: 6 additions & 4 deletions src/main/scala/firrtl/ir/StructuralHash.scala
Original file line number Diff line number Diff line change
Expand Up @@ -115,16 +115,18 @@ object StructuralHash {
}

trait HashCode {
protected val str: String
override def hashCode(): Int = str.hashCode
/** String representation of the hash code.
* Two instances of [[HashCode]] are equal if and only if their toHashString values are equal. */
def toHashString: String
override def hashCode(): Int = toHashString.hashCode
override def equals(obj: Any): Boolean = obj match {
case hashCode: HashCode => this.str.equals(hashCode.str)
case hashCode: HashCode => this.toHashString.equals(hashCode.toHashString)
case _ => false
}
}

private class MDHashCode(code: Array[Byte]) extends HashCode {
protected override val str: String = code.map(b => f"${b.toInt & 0xff}%02x").mkString("")
override val toHashString: 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).toHashString == hash(UIntLiteral(0, IntWidth(1))).toHashString)
assert(hash(b0).toHashString != hash(UIntLiteral(1, IntWidth(1))).toHashString)
assert(hash(b0).toHashString != hash(UIntLiteral(1, IntWidth(2))).toHashString)

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

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 b243ddc

Please sign in to comment.