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

ir: make HashCode.toHashString public #2302

Merged
merged 1 commit into from
Jul 27, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 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,20 @@ 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